Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Verwalten großer Objekte mit dem lo-Modul
Das lo-Modul (Erweiterung) richtet sich an Datenbankbenutzer und Entwickler, die mit PostgreSQL-Datenbanken über JDBC- oder ODBC-Treiber arbeiten. Sowohl JDBC als auch ODBC erwarten, dass die Datenbank das Löschen großer Objekte bewältigt, wenn sich Verweise auf sie ändern. PostgreSQL funktioniert jedoch nicht so. PostgreSQL geht nicht davon aus, dass ein Objekt gelöscht werden sollte, wenn sich sein Verweis ändert. Demzufolge verbleiben Objekte auf der Festplatte und sind nicht referenziert. Die Erweiterung lo enthält eine Funktion, mit der bei Referenzänderungen das Löschen von Objekten bei Bedarf ausgelöst wird.
Tipp
Wenn Sie feststellen möchten, ob Ihre Datenbank von der lo-Erweiterung profitieren kann, suchen Sie mit dem vacuumlo-Dienstprogramm nach verwaisten großen Objekten. Um die Anzahl von verwaisten großen Objekten zu erhalten, ohne Maßnahmen zu ergreifen, führen Sie das Dienstprogramm mit der -n Option (no-op) aus. Weitere Informationen erhalten Sie unter vacuumlo utility.
Das lo-Modul ist für Aurora PostgreSQL 13.7, 12.11, 11.16, 10.21 und höhere Nebenversionen verfügbar.
Zum Installieren des Moduls (Erweiterung) benötigen Sie rds_superuser-Berechtigungen. Durch die Installation der lo-Erweiterung wird Ihrer Datenbank Folgendes hinzugefügt:
lo– Dies ist ein Datentyp für große Objekte (lo), den Sie für binäre große Objekte (BLOBs) und andere große Objekte verwenden können. Derlo-Datentyp ist eine Domäne desoid-Datentyps. Mit anderen Worten, es ist eine Objekt-ID mit optionalen Beschränkungen. Weitere Informationen finden Sie unter Objekt-IDsin der PostgreSQL-Dokumentation. Vereinfacht gesagt, können Sie anhand des lo-Datentyps Ihre Datenbankspalten, die große Objektreferenzen enthalten, von anderen Objekt-IDs (OIDs) unterscheiden.-
lo_manage– Dies ist eine Funktion, die Sie in Triggern für Tabellenspalten verwenden können, die große Objektreferenzen enthalten. Immer wenn Sie einen Wert löschen oder ändern, der auf ein großes Objekt verweist, hebt der Trigger die Verknüpfung des Objekts (lo_unlink) mit seiner Referenz auf. Verwenden Sie den Trigger für eine Spalte nur, wenn die Spalte der einzige Datenbankverweis auf das große Objekt ist.
Weitere Informationen zum Modul für große Objekte erhalten Sie unter lo
Installieren der lo-Erweiterung
Stellen Sie vor der Installation der lo-Erweiterung sicher, dass Sie über rds_superuser-Berechtigungen verfügen.
So installieren Sie die lo-Erweiterung
Verwenden Sie
psql, um eine Verbindung mit der primären DB-Instance Ihres Aurora-PostgreSQL-DB-Clusters herzustellen.psql --host=your-cluster-instance-1.666666666666.aws-region.rds.amazonaws.com --port=5432 --username=postgres --passwordGeben Sie bei der Aufforderung Ihr Passwort ein. Der
psql-Client verbindet und zeigt die standardmäßige administrative Verbindungsdatenbankpostgres=>als Eingabeaufforderung an.Installieren Sie die Erweiterung wie folgt.
postgres=>CREATE EXTENSION lo;CREATE EXTENSION
Sie können jetzt den lo-Datentyp zum Definieren von Spalten in Ihren Tabellen verwenden. Beispielsweise können Sie eine Tabelle (images) erstellen, die Raster-Bilddaten enthält. Sie können den lo-Datentyp für eine Spalte raster verwenden, wie im folgenden Beispiel, mit dem eine Tabelle erstellt wird, gezeigt.
postgres=>CREATE TABLE images (image_name text, raster lo);
Verwenden der Triggerfunktion lo_manage zum Löschen von Objekten
Sie können die lo_manage-Funktion in einem Trigger in einer lo oder anderen großen Objektspalten verwenden, um verwaiste Objekte zu bereinigen (und zu verhindern), wenn lo aktualisiert oder gelöscht wird.
So richten Sie Trigger für Spalten ein, die auf große Objekte verweisen
Führen Sie eine der folgenden Aktionen aus:
-
Erstellen Sie einen BEFORE UPDATE ODER DELETE-Trigger für jede Spalte, damit diese eindeutige Verweise auf große Objekte enthält, wobei der Spaltenname als Argument verwendet wird.
postgres=>CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON images FOR EACH ROW EXECUTE FUNCTION lo_manage(raster); -
Wenden Sie einen Trigger nur an, wenn die Spalte aktualisiert wird.
postgres=>CREATE TRIGGER t_raster BEFORE UPDATE OF images FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);
-
Die lo_manage-Trigger-Funktion funktioniert nur im Kontext des Einfügens oder Löschens von Spaltendaten, je nachdem, wie Sie den Trigger definieren. Er hat keine Auswirkung, wenn Sie eine DROP- oder TRUNCATE-Operation in einer Datenbank ausführen. Das bedeutet, dass Sie vor der Verwendung der DROP-Operation Objektspalten aus allen Tabellen löschen sollten, um das Erstellen von verwaisten Objekten zu verhindern.
Angenommen, Sie möchten die Datenbank entfernen, die die Tabelle images enthält. Sie löschen die Spalte wie folgt.
postgres=>DELETE FROM images COLUMN raster
Vorausgesetzt, die lo_manage-Funktion ist in dieser Spalte definiert, um Löschvorgänge zu behandeln, können Sie die Tabelle jetzt sicher entfernen.
Entfernen verwaister großer Objekte mit vacuumlo
Das vacuumlo-Dienstprogramm identifiziert verwaiste große Objekte und kann diese aus Datenbanken entfernen. Dieses Dienstprogramm ist seit PostgreSQL 9.1.24 verfügbar. Wenn Ihre Datenbankbenutzer routinemäßig mit großen Objekten arbeiten, empfehlen wir Ihnen, vacuumlogelegentlich auszuführen, um verwaiste große Objekte zu bereinigen.
Bevor Sie die lo-Erweiterung installieren, können Sie mit vacuumlobeurteilen, ob Ihr Aurora-PostgreSQL-DB-Cluster davon profitieren kann. Führen Sie dazu vacuumlo mit der -n-Option (no-op) aus, um zu zeigen, was entfernt würde, wie im Folgenden gezeigt:
$vacuumlo -v -n -hyour-cluster-instance-1.666666666666.aws-region.rds.amazonaws.com -p 5433 -U postgresdocs-lab-spatial-dbPassword:*****Connected to database "docs-lab-spatial-db" Test run: no large objects will be removed! Would remove 0 large objects from database "docs-lab-spatial-db".
Wie die Ausgabe zeigt, stellen verwaiste große Objekte für diese bestimmte Datenbank kein Problem dar.
Weitere Informationen über dieses Dienstprogramm finden Sie unter vacuumlo
Grundlegendes zur Funktionsweise von vacuumlo
Der vacuumlo-Befehl entfernt verwaiste große Objekte (LOs) aus Ihrer PostgreSQL-Datenbank, ohne Ihre Benutzertabellen zu beeinträchtigen oder Konflikte mit ihnen zu verursachen.
Der Befehl lautet wie folgt:
-
vacuumlobeginnt mit der Erstellung einer temporären Tabelle, die alle Objekt-IDs (OIDs) der großen Objekte in Ihrer Datenbank enthält. -
vacuumlodurchsucht dann jede Spalte in der Datenbank, die die Datentypenoidoderloverwendet. Wennvacuumloin diesen Spalten eine passende OID gefunden wird, wird die OID aus der temporären Tabelle entfernt.vacuumloüberprüft nur Spalten, die die ausdrücklich mitoidoderlobenannt sind, keine Domains, die auf diesen Typen basieren. -
Die verbleibenden Einträge in der temporären Tabelle stellen verwaiste LOs dar, die
vacuumlodann sicher entfernt.
Verbessern der Leistung von vacuumlo
Sie können die Leistung von vacuumlo potenziell verbessern, indem Sie die Batchgröße mithilfe der Option -l erhöhen. Dadurch kann vacuumlo mehr LOs gleichzeitig verarbeiten.
Wenn Ihr System über ausreichend Arbeitsspeicher verfügt und Sie die temporäre Tabelle vollständig im Arbeitsspeicher unterbringen können, kann eine Erhöhung der Einstellung temp_buffers auf Datenbankebene die Leistung verbessern. Dadurch kann sich die Tabelle vollständig im Arbeitsspeicher befinden, was die Gesamtleistung verbessern kann.
Die folgende Abfrage schätzt die Größe der temporären Tabelle:
SELECT pg_size_pretty(SUM(pg_column_size(oid))) estimated_lo_temp_table_size FROM pg_largeobject_metadata;
Überlegungen zu großen Objekten
Im Folgenden finden Sie einige wichtige Überlegungen, die Sie beachten sollten, wenn Sie mit großen Objekten arbeiten:
-
Vacuumloist die einzige Lösung, da es derzeit keine andere Methode gibt, verwaiste LOs zu entfernen. -
Tools wie pglogical, native logische Replikation und AWS DMS, die Replikationstechnologien verwenden, unterstützen die Replikation großer Objekte nicht.
-
Vermeiden Sie beim Entwerfen Ihres Datenbankschemas nach Möglichkeit die Verwendung großer Objekte und ziehen Sie stattdessen alternative Datentypen wie
byteain Betracht. -
Führen Sie
vacuumloregelmäßig, mindestens wöchentlich, aus, um Probleme mit verwaisten LOs zu vermeiden. -
Verwenden Sie einen Trigger mit der Funktion
lo_managefür Tabellen, in denen große Objekte gespeichert sind, um zu verhindern, dass verwaiste LOs erstellt werden.