Informationen zu "Transaction ID Wraparound"

9

Jetzt habe ich das Dokument über "Transaction ID Wraparound" gelesen, aber es gibt etwas, das ich wirklich nicht verstehe. Das Dokument ist die folgende URL: http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html # VAKUUM-FÜR-WRAPAROUND

23.1.4. Verhindern von Umlauffehlern der Transaktions-ID

Die MVCC-Transaktionssemantik von PostgreSQL hängt davon ab, dass Transaktions-IDs (XID) verglichen werden können: Eine Zeilenversion mit einer Einfüge-XID, die größer als die XID der aktuellen Transaktion ist, ist "in der Zukunft" und sollte für die aktuelle Transaktion nicht sichtbar sein. Da Transaktions-IDs jedoch eine begrenzte Größe (32 Bit) haben, würde ein Cluster, der über einen langen Zeitraum ausgeführt wird (mehr als 4 Milliarden Transaktionen), eine Umgehung der Transaktions-ID erleiden: Der XID-Zähler wird auf Null umgebrochen, und plötzlich befinden sich Transaktionen in der Vergangenheit scheint in der Zukunft zu liegen - was bedeutet, dass ihre Ausgabe unsichtbar wird. Kurz gesagt, katastrophaler Datenverlust. (Eigentlich sind die Daten immer noch da, aber das ist ein kalter Trost, wenn Sie nicht darauf zugreifen können.) Um dies zu vermeiden, muss jede Tabelle in jeder Datenbank mindestens alle zwei Milliarden Transaktionen gesaugt werden.

Ich verstehe die Aussagen nicht "würde eine Umgehung der Transaktions-ID erleiden: Der XID-Zähler wird auf Null umgebrochen, und plötzlich scheinen Transaktionen, die in der Vergangenheit waren, in der Zukunft zu liegen - was bedeutet, dass ihre Ausgabe unsichtbar wird".

Kann jemand das erklären? Warum scheinen Transaktionen, die in der Vergangenheit waren, nach der Transaktions-ID-Umgehung der Datenbank in der Zukunft zu liegen? Kurz gesagt, ich möchte wissen, ob sich PostgreSQL in der Situation "Datenverlust" befindet, nachdem die Transaktions-ID von autovacuum umschlossen wurde.

Für meine persönlichen Ansichten können wir die aktuelle Transaktions-ID mithilfe der Funktion txid_current () abrufen, deren Ausgabe 64 Bit beträgt und nicht zyklisch ausgeführt wird. Ich denke also, dass die Transaktions-ID zum Einfügen von Tupeln, die als xmin bekannt sind, größer ist als die xid, die abgerufen wird durch die Funktion txid_current (). Mit der Ausnahme, dass Sie nach dem Herunterfahren von PostgreSQL Server die Transaktions-ID zum Zurücksetzen von pg_resetxlog verwenden. Habe ich recht ? Vielen Dank

Franken
quelle
Ich denke, Ihre letzte Bearbeitung sollte wahrscheinlich eine neue Frage sein, wenn möglich
Jack sagt, versuchen Sie topanswers.xyz

Antworten:

9

Warum scheinen Transaktionen, die in der Vergangenheit waren, nach der Transaktions-ID-Umgehung der Datenbank in der Zukunft zu liegen?

Sie tun es nicht. Der zitierte Text erklärt nur, warum postgres modulo 2 31 arithmatic verwenden muss (was bedeutet, dass Transaktionen umbrochen werden können, solange alte Transaktionen früh genug "eingefroren" werden):

Normale XIDs werden mit Modulo-2 ^ 31-Arithmetik verglichen. Dies bedeutet, dass es für jede normale XID zwei Milliarden XIDs gibt, die "älter" sind, und zwei Milliarden, die "neuer" sind.

um genau zu sein:

Alte Zeilenversionen müssen die XID FrozenXID irgendwann neu zuweisen, bevor sie die Marke von zwei Milliarden Transaktionen erreichen

oder das Umwickeln der XID würde dazu führen, dass Dinge kaputt gehen. Um dies zu verhindern, senden Postgres Warnungen aus und werden schließlich heruntergefahren und weigern sich gegebenenfalls, neue Transaktionen zu starten:

Wenn Autovacuum aus irgendeinem Grund alte XIDs nicht aus einer Tabelle löscht, gibt das System Warnmeldungen wie diese aus, wenn die ältesten XIDs der Datenbank vom Umlaufpunkt aus zehn Millionen Transaktionen erreichen:

WARNING:  database "mydb" must be vacuumed within 177009986 transactions 
HINT:  To avoid a database shutdown, execute a database-wide VACUUM in "mydb". 

(Ein manuelles VACUUM sollte das Problem beheben, wie im Hinweis vorgeschlagen. Beachten Sie jedoch, dass das VACUUM von einem Superuser ausgeführt werden muss, da es sonst keine Systemkataloge verarbeiten kann und daher die Datenfrozenxid der Datenbank nicht weiterleiten kann.) Wenn diese Warnungen angezeigt werden Wenn sie ignoriert werden, wird das System heruntergefahren und es wird abgelehnt, neue Transaktionen zu starten, sobald weniger als 1 Million Transaktionen bis zum Umlauf übrig sind

Mit anderen Worten: "Transaktionen, die in der Vergangenheit stattfanden, scheinen in der Zukunft zu liegen" und "Datenverlust" sind völlig theoretisch und werden in der Praxis nicht durch die Umgehung der Transaktions-ID verursacht.

Jack sagt, versuchen Sie es mit topanswers.xyz
quelle
Lassen Sie uns diese Diskussion im Chat fortsetzen
Jack sagt, versuchen Sie es mit topanswers.xyz
5

Der eingefügte Block scheint die Frage zu beantworten. Es hängt alles von der Logik ab, mit der 'zukünftige' Transaktionen ausgeblendet werden.

Der XID-Zähler (Transaction ID) ist auf 32 Bit begrenzt. Wenn er jemals die nächste Nummer erreicht, beginnt er bei Null neu, anstatt die alte maximale Transaktion zu ersetzen.

Nun, jetzt ist es Null, also versteckt PostgreSQL alle Transaktionen> 0 davor. Obwohl die Transaktion Nr. 2.147.483.633 vor 20 Sekunden stattgefunden hat, geht PostgreSQL davon aus, dass dies bei weiteren 2.147.483.633 Transaktionen nicht der Fall sein wird.

Derek Downey
quelle
1
Die Dokumente wurden im Dezember 2013 korrigiert . Die XIDs werden mit modulo-2 ^ 31 berechnet.
Eradman