In PostgreSQL gibt es keinen integrierten Befehl oder Tool zur Konsistenzprüfung.
Die allgemeine Ansicht ist, dass man nicht notwendig sein sollte, da Korruption und Inkonsistenz auf einem hochwertigen Hardware- / Software-Stack nicht möglich sein sollten. Wenn Probleme auftreten, gibt es keine Garantie dafür, dass eine Konsistenzprüfung sie findet, sodass nur ein falsches Sicherheitsgefühl entsteht. Ich stimme diesem Gefühl nicht zu, aber es scheint herauszukommen, wenn dies regelmäßig auf pgsql-Hackern diskutiert wird.
Wie üblich besteht das zugrunde liegende Problem darin, dass niemand ein Tool zur Konsistenzprüfung benötigt, um seine unmittelbaren Anforderungen zu erfüllen. Daher verbringt niemand die Zeit damit, eines zu schreiben, um sich zu jucken, und niemand finanziert die Entwicklung eines Tools auf kommerzieller oder interner Basis. Freiwilligenarbeit? : p
PostgreSQL (bis 9.3) unterstützte keine Prüfsummen auf Blockebene. Eines der wichtigsten Dinge, an die Sie gewöhnt sind, war also nicht vorhanden und konnte daher nicht überprüft werden. Ein Tool zum Scannen aller Beziehungen und zum Überprüfen von Prüfsummen ist in PostgreSQL 9.3 nicht vorhanden, sollte jedoch hinzugefügt werden und wird möglicherweise in einer zukünftigen Version angezeigt. In der Zwischenzeit können Sie nur SELECT *
jede Beziehung einzeln ausführen. Aufgrund der Tatsache, dass PostgreSQL den Betriebssystem-Puffercache für Lesevorgänge verwendet, gibt es keine Garantie, die das Lesen des zugrunde liegenden Plattenblocks ohnehin erzwingt. Dazu wäre ein neues Tool erforderlich.
PostgreSQL vermeidet es, Informationen nach Möglichkeit redundant zu speichern, sodass häufig nichts überprüft werden muss, sondern nur eine einzige autorisierende Quelle. Ein Konsistenzprüfer kann nur dann viel tun, wenn dieselben Informationen an mehreren verschiedenen Stellen angezeigt werden oder von diesen abgeleitet werden können.
Es ist auch sehr schwierig, eine nützliche Überprüfung gleichzeitig in einer Datenbank durchzuführen, die noch beschäftigt und aktiv ist. Die meisten Installationen sind nicht bereit, die gesamte Datenbank oder zumindest mehrere wichtige Beziehungen gleichzeitig zu sperren, um eine Art Konsistenzprüfung durchzuführen. Der Prüfer müsste also in der Lage sein, eine Datenbank zu bearbeiten, die gleichzeitig geändert wird, was das Schreiben noch schwieriger macht und weniger Probleme zuverlässig erkennen kann.
Es gibt noch viel, was ein Validator-Tool tun könnte, wenn eines geschrieben würde, insbesondere wenn es mehrere exklusive Beziehungssperren zulassen könnte:
Überprüfen Sie, ob alle Tablespaces auf der Festplatte vorhanden sind.
Überprüfen Sie, ob jeder pg_class
Eintrag Dateien enthält, die seiner relfilenode
im richtigen Tabellenbereich entsprechen.
Überprüfen Sie Sichtbarkeitskarten, Freiraumkarten usw. und stellen Sie sicher, dass sie vorhanden sind, wann sie lesbar sein sollten und mit der Beziehung übereinstimmen, mit der sie verknüpft sind.
Melden Sie verwaiste Dateiknoten auf der Festplatte. (Diese sind aufgrund von Transaktions-DDL und verzögertem Aufheben der Verknüpfung normal, aber ein Prüfer kann das eifrige Aufheben der Verknüpfung erzwingen und alle Beziehungen sperren, bevor die Prüfung ausgeführt wird.)
Lesen Sie jeden Block jeder Beziehung und suchen Sie nach offensichtlichen Problemen. Für Haufenbeziehungen wären das Dinge wie:
- ein
xmin
größer als xmax
(nach Berücksichtigung von xid Wrap-around)
- Tupel, die durch zukünftige Transaktionen erstellt wurden
- gebrochene heiße Ketten / gebrochene CTID-Ketten
- Tupelstrukturen, die nicht mit den Tabellenattributen übereinstimmen
- Jedes Datum, das nicht umläuft
_in
und _out
unverändert funktioniert oder einen Fehler auslöst
NULL
Bitmap-Felder für NOT NULL
Tabellenattribute
- Die erneute Ausführung von
CHECK
Einschränkungen schlägt fehl
Überprüfen Sie die Fremdschlüssel- und Ausschlussbeschränkungen erneut, nachdem Sie alle beteiligten Tabellen gesperrt haben
... und wahrscheinlich noch viel mehr Ich weiß nicht genug über Pgs Eingeweide, um herauszufinden, wie z. B. Versuche, zerrissene Seiten zu erkennen, Validierung der B-Baum-Struktur, Überprüfung der GIN- und GiST-Indizes, Überprüfung der Integrität pg_control
und mehr, die ich nicht würde weiß, wo ich überhaupt anfangen soll.
Wenn Sie ein solches Tool haben möchten, sollten Sie am besten genug lernen, um einen konkreten Vorschlag zu unterbreiten, wie es funktionieren soll - und sich die Zeit nehmen, daran zu arbeiten oder andere zu finanzieren, um Zeit damit zu verbringen Entwicklung.
Persönlich wäre ich sehr froh, etwas zu haben, das einen gestoppten Datenbankcluster mithilfe eines speziellen Startmodus für das postgres
Backend überprüfen könnte , damit ich physische Datenbankkopien, die mit pg_basebackup
, mit pg_start_backup()
, rsync und pg_stop_backup
mit Dateisystemebene erstellt wurden, (etwas) validieren kann atomare Schnappschüsse usw.
Alternativ können Sie das tun, was die meisten anderen tun: Stellen Sie sicher, dass Ihr Hardware- und Software-Stack robust und ordnungsgemäß konfiguriert ist, führen Sie gute Sicherungen durch und überwachen Sie Ihre Protokolle. Es gibt keinen Ersatz für das ordnungsgemäße Testen des gesamten Stacks vor der Inbetriebnahme eines Servers - und für gute Sicherungen, sowohl physische (Streaming / PITR) als auch logische (Dumps). Führen Sie wiederholt Plug-Pull-Tests für eine geladene Datenbank durch, bevor Sie live gehen, um sicherzustellen, dass Ihr vermeintlich zuverlässiges E / A-Subsystem wirklich funktioniert. Verwenden Sie mehrere Sicherungsformen.