Macht das Abbrechen eines (AUTO) VACUUM-Prozesses in PostgreSQL die gesamte geleistete Arbeit nutzlos?

13

In einigen Fällen, und ein massiven nach der Herstellung update, insertoder deleteaus einer Tabelle, habe ich begonnen , ein VACUUM FULL ANALYZEzu aufgebläht , um sicherzustellen , dass die DB nicht immer. Wenn ich es in einer Produktionsdatenbank mache, habe ich festgestellt, dass dies keine gute Idee war, da ich die Tabelle für einen langen Zeitraum blockieren konnte. Also habe ich den Vorgang abgebrochen, vielleicht nur versucht VACUUM(nicht voll) oder AUTOVACUUMspäter alles tun lassen , was es kann.

Die Frage ist: Wenn ich ein VACUUM oder AUTOVACUUM "auf halbem Weg" stoppe, geht dann die gesamte Verarbeitung bereits verloren?

Wenn zum Beispiel VACUUMbereits 1 M tote Reihen gefunden wurden und ich sie stoppe, gehen all diese Informationen verloren? Funktioniert VACUUM vollständig transaktional ("alles oder nichts", wie eine sehr gute Anzahl von PostgreSQL-Prozessen)?

Wenn VACUUM sicher unterbrochen werden kann, ohne dass die gesamte Arbeit verloren geht, gibt es eine Möglichkeit, die vacuumArbeit schrittweise auszuführen ? [100 ms arbeiten, anhalten, 10 ms warten, damit der Rest der Welt nicht blockiert wird ... und so weiter]. Ich weiß, dass Sie einen Teil davon tun können, indem Sie die Autovakuumparameter einstellen, aber ich denke, dass ich dies programmgesteuert steuern kann, um dies zu bestimmten Zeiten / unter bestimmten Bedingungen tun zu können.


HINWEIS: Stoppen / Abbrechen / Beenden des Prozesses bedeutet in diesem Zusammenhang:

  • Wenn Sie pgAdmin verwenden, klicken Sie auf die Schaltfläche "Abfrage abbrechen".
  • Wenn Sie programmgesteuert arbeiten, rufen Sie pg_cancel_backend () auf.

Ich gehe davon aus, dass beide gleichwertig sind. Ich habe keinen Kill-Befehl auf Shell- / Systemebene verwendet.

joanolo
quelle

Antworten:

8

Die von einem unterbrochenen VACUUM FULL geleistete Arbeit geht vollständig verloren, da einfach die vorherige Version der Tabelle verwendet und die laufende Version der Tabelle weggeworfen wird.

Die Arbeit eines normalen (nicht VOLLSTÄNDIGEN) VAKUUMS geht möglicherweise nicht vollständig verloren. Es werden Indizes in Chargen bereinigt, und alle Chargen, die vollständig gereinigt wurden, müssen nicht erneut gereinigt werden. Sie müssen noch erneut überprüft werden, werden aber beim nächsten Mal bereits als sauber befunden. Sie können also einige Schreib-E / A speichern, die nicht wiederholt werden müssen.

jjanes
quelle
1
Würde gerne mehr Details dazu erfahren, insbesondere zum Autovakuum. Ich habe ausgelastete Server mit vielen Datenbanken und manchmal können Autovakuums sehr lange dauern. In diesem Fall ist beispielsweise das Erstellen eines neuen Index nicht möglich, da das Autovakuum über eine Sperre verfügt. In einigen Fällen wäre es ideal, das Autovakuum zu beenden und den Index anzuwenden. Wenn das Autovakuum dann wieder läuft, muss es hoffentlich nicht annähernd so lange laufen. Gibt es eine Möglichkeit, Details darüber anzuzeigen, was Autovacuum mit einer Tabelle und Indizes getan hat / tut?
Kurt Koller
3
9.6 führte eine Ansicht zur Überwachung des Vakuumfortschritts ein: postgresql.org/docs/current/static/progress-reporting.html . Ich habe selbst nicht damit herumgespielt, also weiß ich nicht, wie gut es für Sie funktionieren wird. Das Autovakuum sollte dem Schloss automatisch nachgeben, es sei denn, es wird zum Umwickeln durchgeführt. Die Standardeinstellungen für Autovakuum sind stark gedrosselt, sodass es beim nächsten Mal möglicherweise nicht schneller läuft, nur weil es auf die gleiche Geschwindigkeit gedrosselt wird. Ich setze routinemäßig vacuum_cost_page_hitund vacuum_cost_page_missauf Null.
jjanes