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
la source
Réponses:
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):
Pour être précis:
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:
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.
la source
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.
la source