VACUUM FREEZE vs. VACUUM FULL

18

Kann jemand den Unterschied zwischen diesen Arten von VACUUMPostgreSQL erklären ?

Ich habe das Dokument gelesen, aber es heißt nur, dass FULLdie Tabellen FREEZEgesperrt und die Tupel "eingefroren" werden. Ich denke das ist das selbe. Liege ich falsch?

Christian Maíz
quelle
Sie haben das Dokument gelesen? Das wäre eine perfekte Gelegenheit, um einen Link zu dem hinzuzufügen, was Sie gelesen haben ...
Erwin Brandstetter

Antworten:

12

Hier ist eine kurze kurze Antwort.

Vakuum voll entfernt eine exklusive Sperre und baut die Tabelle neu auf, sodass sie keine leeren Blöcke enthält (wir geben vor, dass der Füllfaktor vorerst 100% ist).

Vakuum-Einfrieren kennzeichnet den Inhalt einer Tabelle mit einem ganz speziellen Transaktionszeitstempel, der postgres mitteilt, dass kein Vakuum erforderlich ist. Beim nächsten Update verschwindet diese eingefrorene ID.

Beispielsweise ist die template0-Datenbank eingefroren, da sie sich nie ändert (standardmäßig können Sie keine Verbindung dazu herstellen).

Von Zeit zu Zeit überprüft der Autovacuum-Daemon eine Datenbank und ihre Tabellen, um festzustellen, was gesaugt werden muss. Wenn eine Tabelle vakuumgefroren ist und dann nie aktualisiert wird, passiert der Autovacuum-Daemon dies einfach. Auch der "Wrap Around" -Schutz in postgresql wird nie auf diesen Tisch wirken.

tl; dr freezing kennzeichnet einen Tisch als wartungsfrei. Das nächste Update wird es entsperren.

Scott Marlowe
quelle
Benötigen Sie also VACUUM FREEZEeine exklusive Sperre für den Tisch? Scheint so, als ob es so wäre, sonst würden Sie das Risiko eingehen, Zeilen aus aktiven Transaktionen plötzlich global sichtbar zu machen. Ich könnte es falsch verstehen ...
Parthian Shot
Kein Vakuumgefrieren, kein Vakuum voll.
Scott Marlowe
6

Um weiter zu erklären, was Jayadevan geschrieben hat.

Postgres arbeitet mit Transaktionen und verfolgt die sichtbaren Daten, indem interne Transaktions-IDs verglichen werden. Da diese Transaktionen jedoch früher oder später eine 32-Bit-Ganzzahl sind, werden sie umbrochen, und daher sieht die neue Transaktion so aus, als ob sie in der Vergangenheit durchgeführt wurde (und ist daher in einer aktuellen Transaktion sichtbar, obwohl dies nicht der Fall sein sollte) ältere Transaktionen werden so aussehen, als würden sie in der Zukunft ausgeführt (und da die Zukunft noch nicht existiert, werden diese Daten nicht mehr sichtbar sein).

Um diesem Problem entgegenzuwirken, weist Postgres jeder Zeile, die alt genug ist, um unter diesem Umbruch zu leiden, eine spezielle Transaktions-ID zu, die immer älter als jede Transaktion ist. Sie können sehen, dass gültige Transaktions-IDs zwischen 0 und 2147483647 liegen. Dabei wird die Transaktions-ID für alle aktuellen Zeilen auf -1 gesetzt.

Da das Vakuum im Grunde genommen dazu dient, leeren Raum für die Wiederverwendung zu markieren, funktioniert es nur auf Datenseiten, die geändert wurden.

Im VACUUM FREEZEGrunde genommen wird die Transaktions-ID für alle Seiten eingefroren, unabhängig davon, ob sie geändert wurden oder nicht, sodass alle aktuellen Zeilen für alle neuen Transaktionen als alt angesehen werden.

Ab Version 8.2 VACUUM FREEZEsind sie jedoch veraltet und sollten nicht mehr verwendet werden. Stattdessen gibt die Parameter ist vacuum_freeze_table_ageund autovacuum_freeze_max_agedie angibt , wie viele Transaktionen auftreten können , bevor eine vollständige Abtastung auf dem Tisch (effektiv eine interne tun getan wird, um VACUUM FREEZEauf dem Tisch).

Jimmy Stenke
quelle
3
Wie kommt es, dass in den Dokumenten nicht erwähnt wird, VACUUM FREEZEdass sie veraltet oder entmutigt sind?
Dezso
Interessant. Dies geschah für die Versionen zwischen 8.2 und 9.0. Vielleicht haben sie die Ablehnung beseitigt, weil es ein gutes Feature sein könnte.
Jimmy Stenke
1

Kopieren / Einfügen aus Antwort, als ich dieselbe Frage stellte: "Normales Vakuum markiert leeren Raum für die Wiederverwendung und gibt den leeren Raum am Ende einer Beziehung zurück. Wenn sich der leere Raum also in der Mitte befindet, kann es nicht sein nur wiederverwendet zurückgefordert.

Vakuum voll verdichtet eine Beziehung, die den gesamten leeren Raum zurückerobert. Es erfordert eine exklusive Sperre und ist aus diesem Grund für Produktionssysteme im Allgemeinen schlecht.

Der Zweck von REGULAR Vakuum ist es also nicht, Platz von den Tischen zurückzugewinnen, sondern ihn für eine spätere Wiederverwendung zur Verfügung zu stellen. Der Zweck von Vacuum FULL besteht darin, den gesamten verschwendeten Speicherplatz auf Kosten einer exklusiven Lock- und DB-Leistung während des Vorgangs freizugeben.

Da reguläres Staubsaugen nicht dazu gedacht ist, alles zurückzugewinnen, sollte es Sie nicht überraschen, dass es tatsächlich nicht alles zurückgewonnen hat. Versuchen Sie Ihr Experiment mit größeren Datensätzen mit mehr zufälligen Löschungen usw., um den Unterschied zwischen normalem und vollem Vakuum zu erkennen. "

http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html

Um dies hinzuzufügen, erstellt Vakuum voll tatsächlich neue Dateien für die Tabelle (die vorhandenen Dateien wären auf die Größe 0 geschrumpft). So kann das Betriebssystem den Speicherplatz zurückfordern.

Jayadevan
quelle
2
Die Frage fragt VACUUM FREEZEinsbesondere nach.
Erwin Brandstetter
Richtig - "Unterschied zwischen diesen Vakuumtypen in PostgreSQL" - Ich dachte, die Frage betraf Unterschiede zwischen Vakuumtypen.
Jayadevan