Kann jemand den Unterschied zwischen diesen Arten von VACUUM
PostgreSQL erklären ?
Ich habe das Dokument gelesen, aber es heißt nur, dass FULL
die Tabellen FREEZE
gesperrt und die Tupel "eingefroren" werden. Ich denke das ist das selbe. Liege ich falsch?
postgresql
vacuum
Christian Maíz
quelle
quelle
Antworten:
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.
quelle
VACUUM FREEZE
eine 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 ...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 FREEZE
Grunde 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 FREEZE
sind sie jedoch veraltet und sollten nicht mehr verwendet werden. Stattdessen gibt die Parameter istvacuum_freeze_table_age
undautovacuum_freeze_max_age
die angibt , wie viele Transaktionen auftreten können , bevor eine vollständige Abtastung auf dem Tisch (effektiv eine interne tun getan wird, umVACUUM FREEZE
auf dem Tisch).quelle
VACUUM FREEZE
dass sie veraltet oder entmutigt sind?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.
quelle
VACUUM FREEZE
insbesondere nach.