À propos de "Transaction ID Wraparound"

10

Maintenant, j'ai lu le document sur "Transaction ID Wraparound", mais il y a quelque chose que je ne comprends vraiment pas, le document est l'url suivant http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html # VACUUM-FOR-WRAPAROUND

23.1.4. Prévention des échecs d'enveloppe d'ID de transaction

La sémantique des transactions MVCC de PostgreSQL dépend de la possibilité de comparer les numéros d'ID de transaction (XID): une version de ligne avec un XID d'insertion supérieur au XID de la transaction en cours est "à l'avenir" et ne devrait pas être visible pour la transaction en cours. Mais comme les ID de transaction ont une taille limitée (32 bits), un cluster qui s'exécute pendant une longue période (plus de 4 milliards de transactions) souffrirait d'un bouclage d'ID de transaction: le compteur XID revient à zéro, et toutes les transactions soudaines qui étaient dans le le passé semble être dans le futur - ce qui signifie que leur production devient invisible. En bref, une perte de données catastrophique. (En fait, les données sont toujours là, mais c'est un réconfort froid si vous ne pouvez pas y accéder.) Pour éviter cela, il est nécessaire de nettoyer chaque table de chaque base de données au moins une fois tous les deux milliards de transactions.

Je ne comprends pas que les déclarations "subiraient un enveloppement d'ID de transaction: le compteur XID revient à zéro, et toutes les transactions soudaines qui étaient dans le passé semblent être à l'avenir - ce qui signifie que leur sortie devient invisible"

Quelqu'un peut-il expliquer cela? Pourquoi, après que la base de données a subi un bouclage d'ID de transaction, les transactions qui étaient dans le passé semblent-elles l'être à l'avenir? En bref, je veux savoir si PostgreSQL sera dans la situation de "perte de données" après le bouclage de l'ID de transaction par autovacuum uum

Pour mes vues personnelles, nous pouvons obtenir l'ID de transaction actuel en utilisant la fonction txid_current (), la sortie est de 64 bits et ne sera pas cyclée. par la fonction txid_current (). Sauf que vous utiliserez pg_resetxlog reset reset ID de transaction après l'arrêt du serveur PostgreSQL. Ai-je raison ? Merci

francs
la source
Je pense que votre dernier montage devrait probablement être une nouvelle question si possible
Jack dit d'essayer topanswers.xyz

Réponses:

10

Pourquoi, après que la base de données a subi un bouclage d'ID de transaction, les transactions qui étaient dans le passé semblent-elles l'être à l'avenir?

Ils ne le font pas. Le texte cité explique simplement pourquoi postgres doit utiliser l' arithmatique modulo 2 31 (ce qui signifie que les transactions peuvent se terminer aussi longtemps que les anciennes transactions sont «gelées» suffisamment tôt):

Les XID normaux sont comparés en utilisant l'arithmétique modulo-2 ^ 31. Cela signifie que pour chaque XID normal, il y a deux milliards de XID qui sont "plus anciens" et deux milliards qui sont "plus récents"

Pour être précis:

les anciennes versions de ligne doivent être réaffectées au XID FrozenXID quelque temps avant d'atteindre la marque des deux milliards de transactions

ou enrouler le XID autour entraînerait la rupture des choses. Pour éviter cela, les postgres commenceront à émettre des avertissements et finiront par s'arrêter et refuser de démarrer de nouveaux transactons si nécessaire:

Si, pour une raison quelconque, autovacuum ne parvient pas à effacer les anciens XID d'une table, le système commencera à émettre des messages d'avertissement comme celui-ci lorsque les plus anciens XID de la base de données atteindront dix millions de transactions à partir du point de bouclage:

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

(Un VACUUM manuel devrait résoudre le problème, comme suggéré par l'indice; mais notez que le VACUUM doit être effectué par un superutilisateur, sinon il ne pourra pas traiter les catalogues système et ne pourra donc pas avancer le datfrozenxid de la base de données.) Si ces avertissements sont ignorés, le système s'arrêtera et refusera de démarrer de nouvelles transactions une fois qu'il restera moins d'un million de transactions jusqu'à bouclage

En d'autres termes, "les transactions qui étaient dans le passé semblent être dans le futur" et la "perte de données" est tout à fait théorique et ne sera pas causée par le bouclage des ID de transaction dans la pratique.

Jack dit d'essayer topanswers.xyz
la source
nous continuons cette discussion en discussion
Jack dit essayer topanswers.xyz
5

Le bloc que vous avez collé semble répondre à la question. Tout dépend de la logique utilisée pour masquer les «futures» transactions.

Le compteur d'ID de transaction (XID) est limité à 32 bits et s'il atteint jamais ce nombre suivant, au lieu de remplacer l'ancienne transaction max, il recommence à zéro.

Eh bien, maintenant c'est zéro, donc PostgreSQL lui cache toutes les transactions> 0. Ainsi, même si la transaction n ° 2 147 483 633 s'est produite il y a 20 secondes, PostgreSQL pense que cela ne se produira pas pour 2 147 473 633 transactions supplémentaires.

Derek Downey
la source
1
Les documents ont été corrigés en décembre 2013. Les XID sont calculés à l'aide de modulo-2 ^ 31.
eradman