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
quelle
Antworten:
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):
um genau zu sein:
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:
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.
quelle
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.
quelle