pg_dump und ERROR: Fehlende Blocknummer 0 für Toastwert

10

Ich verwende PostgreSQL 8.4.15. Beim Ausführen pg_dumpzum Sichern einer Datenbank wurde der folgende Fehler angezeigt:

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  missing chunk number 0 for toast value 123456789 in pg_toast_987654321
pg_dump: The command was: COPY public.my_table (id, .... all the columns ...)

Bei der Suche nach dieser Fehlermeldung habe ich einige Referenzen ( hier und hier ) gefunden, die vorgeschlagen haben, die Tabelle neu zu indizieren. (In diesen Diskussionen gab es einen Verweis auf das Abfragen der pg_classTabelle, um den richtigen pg_toast_XXXXXXWert zu finden , aber es schien, dass dies daran lag, dass er nicht in den Fehlermeldungen angezeigt wurde. Ich habe diesen Teil übersprungen, weil in der Fehlermeldung ein Wert angezeigt wurde Ich denke, es könnte aufgrund einer späteren Version von PostgreSQL eine Annehmlichkeit sein.)

Ich habe folgendes ausgeführt:

REINDEX table pg_toast.pg_toast_987654321;
VACUUM ANALYZE my_table;

Ich kann jetzt pg_dumpfehlerfrei verwenden.

Was pg_toastund was haben diese Befehle tatsächlich getan? Handelt es sich lediglich um eine einfache Bereinigung, oder hätten sie einige Zeilen in dieser Tabelle entfernen können? Was könnte das Problem überhaupt verursacht haben?

Diese Tabelle enthält ungefähr 300000 Zeilen, aber ich würde erwarten, dass es seit der vorherigen erfolgreichen Sicherung nur ungefähr 250 neue Zeilen gibt (diese Tabelle wird nur für INSERT / SELECT verwendet, keine UPDATEs).

Bruno
quelle
Ich habe diese Idee gefunden . Können Sie überprüfen, ob Ihr Fall der gleiche ist?
Dekso
Dies könnte auch helfen stackoverflow.com/questions/47533639/…
papanito

Antworten:

6

Angesichts der Tatsache, dass Sie einen Neuindex durchgeführt haben, wurde wahrscheinlich ein Index-Scan verwendet, um zu versuchen, die gerösteten Werte in der Tabelle zu finden, und konnte keinen finden. Das klingt nach einem beschädigten Index. Die Vakuumanalyse ändert die Tabelle, die Neuindizierung jedoch nicht, und die Änderungen sind sehr gering.

Die Art und Weise, darüber nachzudenken, ist, dass TOASTed-Attribute tatsächlich in Blöcke von etwa 4 KB Größe aufgeteilt werden und diese in Zeilen gespeichert werden. Sie werden zur Abfragezeit nachgeschlagen und sortiert / wieder mit der Hauptzeile verbunden. Es hört sich so an, als ob ein hier verwendeter Index beschädigt wurde und der Reindex das Problem gelöst hat.

Ich habe festgestellt, dass beschädigte Indizes normalerweise ein Zeichen dafür sind, dass etwas mit dem Server nicht stimmt. Es ist gut zu überprüfen und sicherzustellen, dass Speicher, CPUs und Festplatten zufrieden sind und keine Probleme melden. Ich habe festgestellt, dass überhitzte Server besonders anfällig für Indexbeschädigungen sind. Wenn Indizes beschädigt werden können, muss man sich Sorgen machen, dass auch Daten beschädigt werden.

Chris Travers
quelle