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.
In diesem Abschnitt werden weitere Gründe untersucht, die verhindern können, dass das Staubsaugen voranschreitet. Diese Probleme sind derzeit anhand der Funktion nicht direkt identifizierbar. postgres_get_av_diag()
Ungültige Seiten
Ein ungültiger Seitenfehler tritt auf, wenn PostgreSQL beim Zugriff auf diese Seite eine Nichtübereinstimmung in der Prüfsumme einer Seite feststellt. Der Inhalt ist nicht lesbar, wodurch Autovacuum verhindert, dass Tupel eingefroren werden. Dadurch wird der Säuberungsvorgang effektiv gestoppt. Der folgende Fehler wird in das Protokoll von PostgreSQL geschrieben:
WARNING: page verification failed, calculated checksum YYYYY but expected XXXX ERROR: invalid page in block ZZZZZ of relation base/XXXXX/XXXXX CONTEXT: automatic vacuum of table
myschema.mytable
Ermitteln Sie den Objekttyp
ERROR: invalid page in block 4305910 of relation base/16403/186752608 WARNING: page verification failed, calculated checksum 50065 but expected 60033
Aus der Fehlermeldung geht hervor, dass der Pfad die folgenden Informationen base/16403/186752608
enthält:
-
„base“ ist der Verzeichnisname unter dem PostgreSQL-Datenverzeichnis.
-
„16403" ist die Datenbank-OID, die Sie im Systemkatalog nachschlagen können.
pg_database
-
„186752608“ ist die
relfilenode
, mit der Sie das Schema und den Objektnamen im Systemkatalog nachschlagen können.pg_class
Indem Sie die Ausgabe der folgenden Abfrage in der betroffenen Datenbank überprüfen, können Sie den Objekttyp ermitteln. Die folgende Abfrage ruft Objektinformationen für oid ab: 186752608. Ersetzen Sie die OID durch die OID, die für den aufgetretenen Fehler relevant ist.
SELECT relname AS object_name, relkind AS object_type, nspname AS schema_name FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.oid = 186752608;
Weitere Informationen finden Sie in der PostgreSQL-Dokumentation pg_class
relkind
Spalte unter aufgeführt sind. pg_class
Anleitung
Die effektivste Lösung für dieses Problem hängt von der Konfiguration Ihrer spezifischen Amazon RDS-Instance und der Art der Daten ab, die von der inkonsistenten Seite betroffen sind.
Wenn der Objekttyp ein Index ist:
Es wird empfohlen, den Index neu zu erstellen.
-
Verwenden der
CONCURRENTLY
Option — Vor PostgreSQL Version 12 erforderte die Neuerstellung eines Indexes eine exklusive Tabellensperre, die den Zugriff auf die Tabelle einschränkte. In PostgreSQL Version 12 und späteren Versionen ermöglicht dieCONCURRENTLY
Option das Sperren auf Zeilenebene, wodurch die Verfügbarkeit der Tabelle erheblich verbessert wird. Es folgt der Befehl:REINDEX INDEX
ix_name
CONCURRENTLY;Er
CONCURRENTLY
ist zwar weniger störend, kann aber bei stark frequentierten Tabellen langsamer sein. Erwägen Sie, den Index nach Möglichkeit in Zeiten mit geringem Datenverkehr zu erstellen.Weitere Informationen finden Sie in der PostgreSQL REINDEX-Dokumentation
. -
Verwenden Sie die
INDEX_CLEANUP FALSE
Option — Wenn die Indizes umfangreich sind und schätzungsweise viel Zeit benötigen, bis sie fertig sind, können Sie die automatische Bereinigung aufheben, indem Sie ein manuelles Verfahren ausführen und dabei Indizes ausschließen.VACUUM FREEZE
Diese Funktionalität ist in PostgreSQL Version 12 und späteren Versionen verfügbar.Durch das Umgehen von Indizes können Sie den Vakuumprozess des inkonsistenten Indexes überspringen und das Wraparound-Problem verringern. Das zugrundeliegende Problem mit ungültigen Seiten wird dadurch jedoch nicht gelöst. Um das Problem mit der ungültigen Seite vollständig zu beheben und zu lösen, müssen Sie den Index dennoch neu erstellen.
Wenn es sich bei dem Objekttyp um eine materialisierte Ansicht handelt:
Wenn in einer materialisierten Ansicht ein ungültiger Seitenfehler auftritt, melden Sie sich bei der betroffenen Datenbank an und aktualisieren Sie sie, um die ungültige Seite zu beheben:
Aktualisieren Sie die materialisierte Ansicht:
REFRESH MATERIALIZED VIEW schema_name.materialized_view_name;
Wenn die Aktualisierung fehlschlägt, versuchen Sie, Folgendes neu zu erstellen:
DROP MATERIALIZED VIEW schema_name.materialized_view_name; CREATE MATERIALIZED VIEW schema_name.materialized_view_name AS query;
Durch das Aktualisieren oder Neuerstellen der materialisierten Ansicht wird sie wiederhergestellt, ohne dass sich dies auf die zugrunde liegenden Tabellendaten auswirkt.
Für alle anderen Objekttypen:
Für alle anderen Objekttypen wenden Sie sich an den AWS Support.
Inkonsistenz im Index
Ein logisch inkonsistenter Index kann verhindern, dass das Autovakuumverfahren voranschreitet. Die folgenden oder ähnliche Fehler werden entweder während der Vakuumphase des Indexes oder beim Zugriff auf den Index durch SQL-Anweisungen protokolliert.
ERROR: right sibling's left-link doesn't match:block 5 links to 10 instead of expected 2 in index
ix_name
ERROR: failed to re-find parent key in index "XXXXXXXXXX" for deletion target page XXX CONTEXT: while vacuuming index
index_name
of relationschema.table
Anleitung
Erstellen Sie den Index manuell VACUUM FREEZE
neu oder überspringen Sie INDEX_CLEANUP
Indizes. Informationen zur Neuerstellung des Index finden Sie unter Wenn der Objekttyp ein Index ist.
-
Verwenden der Option CONCURRENTLY — Vor PostgreSQL Version 12 erforderte die Neuerstellung eines Indexes eine exklusive Tabellensperre, die den Zugriff auf die Tabelle einschränkte. Bei PostgreSQL Version 12 und späteren Versionen ermöglicht die Option CONCURRENTLY das Sperren auf Zeilenebene, wodurch die Verfügbarkeit der Tabelle erheblich verbessert wird. Es folgt der Befehl:
REINDEX INDEX ix_name CONCURRENTLY;
CONCURRENTLY ist zwar weniger störend, kann aber bei stark frequentierten Tabellen langsamer sein. Erwägen Sie, den Index nach Möglichkeit in Zeiten mit geringem Datenverkehr zu erstellen. Weitere Informationen finden Sie unter REINDEX
in der PostgreSQL-Dokumentation. -
Verwendung der Option INDEX_CLEANUP FALSE — Wenn die Indizes umfangreich sind und schätzungsweise viel Zeit bis zur Fertigstellung in Anspruch nehmen, können Sie die automatische Bereinigung aufheben, indem Sie einen manuellen Befehl mit dem Befehl VACUUM FREEZE ausführen und dabei Indizes ausschließen. Diese Funktionalität ist in PostgreSQL Version 12 und späteren Versionen verfügbar.
Durch das Umgehen von Indizes können Sie den Vakuumprozess des inkonsistenten Indexes überspringen und das Wraparound-Problem verringern. Das zugrundeliegende Problem mit ungültigen Seiten wird dadurch jedoch nicht gelöst. Um das Problem mit der ungültigen Seite vollständig zu beheben und zu lösen, müssen Sie den Index dennoch neu erstellen.
Außergewöhnlich hohe Transaktionsrate
In PostgreSQL können hohe Transaktionsraten die Leistung von Autovacuum erheblich beeinträchtigen, was zu einer langsameren Bereinigung toter Tupel und einem erhöhten Risiko eines Transaktions-ID-Wraparounds führt. Sie können die Transaktionsrate überwachen, indem Sie den Unterschied max(age(datfrozenxid))
zwischen zwei Zeiträumen messen, typischerweise pro Sekunde. Darüber hinaus können Sie die folgenden Zählermetriken von RDS Performance Insights verwenden, um die Transaktionsrate (die Summe aus xact_commit und xact_rollback) zu messen, die die Gesamtzahl der Transaktionen darstellt.
Zähler | Typ | Einheit | Metrik |
---|---|---|---|
xact_commit |
Transaktionen |
Commits pro Sekunde |
db.Transactions.xact_commit |
xact_rollback |
Transaktionen |
Rollbacks pro Sekunde |
db.Transactions.xact_rollback |
Ein schneller Anstieg deutet auf eine hohe Transaktionslast hin, die Autovacuum überfordern und zu Blähungen, Sperrkonflikten und potenziellen Leistungsproblemen führen kann. Dies kann sich auf verschiedene Weise negativ auf den Autovakuumprozess auswirken:
-
Tabellenaktivität: Bei der spezifischen Tabelle, die gelöscht wird, kann es zu einem hohen Transaktionsvolumen kommen, was zu Verzögerungen führen kann.
-
Systemressourcen Das gesamte System ist möglicherweise überlastet, sodass es für Autovacuum schwierig ist, auf die Ressourcen zuzugreifen, die für einen effizienten Betrieb erforderlich sind.
Ziehen Sie die folgenden Strategien in Betracht, damit das Autovakuumgerät effektiver arbeiten und seine Aufgaben erfüllen kann:
-
Reduzieren Sie nach Möglichkeit die Transaktionsrate. Erwägen Sie, ähnliche Transaktionen nach Möglichkeit zu stapeln oder zu gruppieren.
-
Nehmen Sie häufig aktualisierte Tabellen ins Visier und verwenden Sie die manuelle
VACUUM FREEZE
Bedienung jede Nacht, Woche oder alle zwei Wochen außerhalb der Spitzenzeiten. -
Erwägen Sie, Ihre Instance-Klasse zu skalieren, um mehr Systemressourcen für das hohe Transaktionsvolumen und die automatische Bereinigung bereitzustellen.