Sekarang, saya membaca dokumen tentang "Transaction ID Wraparound", tetapi ada sesuatu yang saya benar-benar tidak mengerti, dokumen tersebut adalah url berikut http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html # VACUUM-FOR-WRAPAROUND
23.1.4. Mencegah Kegagalan ID Transaksi ID
Semantik transaksi MVCC PostgreSQL bergantung pada kemampuan untuk membandingkan nomor ID transaksi (XID): versi baris dengan XID penyisipan lebih besar daripada XID transaksi saat ini adalah "di masa depan" dan tidak boleh terlihat oleh transaksi saat ini. Tetapi karena ID transaksi memiliki ukuran terbatas (32 bit), sebuah cluster yang berjalan untuk waktu yang lama (lebih dari 4 miliar transaksi) akan menderita pembungkusan ID transaksi: penghitung XID membungkus menjadi nol, dan semua transaksi tiba-tiba yang ada di masa lalu tampaknya di masa depan - yang berarti output mereka menjadi tidak terlihat. Singkatnya, kehilangan data bencana. (Sebenarnya data masih ada, tapi itu kenyamanan dingin jika Anda tidak bisa mendapatkannya.) Untuk menghindari hal ini, perlu menyedot setiap tabel di setiap basis data setidaknya sekali setiap dua miliar transaksi.
Saya tidak mengerti pernyataan "akan mengalami pembungkusan ID transaksi: penghitung XID membungkus ke nol, dan semua transaksi tiba-tiba yang sebelumnya ada di masa depan - yang berarti output mereka menjadi tidak terlihat"
Adakah yang bisa menjelaskan hal ini? Mengapa setelah basis data menderita ID transaksi, transaksi yang di masa lalu tampak di masa depan? Singkatnya, saya ingin tahu apakah PostgreSQL akan berada dalam situasi "kehilangan data" setelah pembungkus ID transaksi oleh autovacuum。
Untuk pandangan pribadi saya, kita bisa mendapatkan ID transaksi saat ini dengan menggunakan fungsi whox txid_current () output 64 bit dan tidak akan didaur ulang. oleh fungsi txid_current (). Kecuali bahwa Anda akan menggunakan pg_resetxlog reset mereset ID transaksi setelah mematikan PostgreSQL Server. Apakah saya benar ? Terima kasih
sumber
Jawaban:
Mereka tidak melakukannya. Teks yang dikutip hanya menjelaskan mengapa postgres perlu menggunakan modulo 2 31 arithmatic (yang berarti transaksi dapat membungkus selama transaksi lama 'beku' cukup awal):
untuk lebih spesifik:
atau membungkus XID sekitar akan menyebabkan hal-hal rusak. Untuk mencegahnya, postgres akan mulai mengeluarkan peringatan, dan akhirnya ditutup dan menolak untuk memulai transaksi baru jika perlu:
Dengan kata lain "transaksi yang di masa lalu tampaknya di masa depan" dan "kehilangan data" sepenuhnya bersifat teoritis dan tidak akan disebabkan oleh pembungkus ID transaksi dalam praktiknya.
sumber
Blok yang Anda tempel tampaknya menjawab pertanyaan. Itu semua tergantung pada logika yang digunakan untuk menyembunyikan transaksi 'masa depan'.
Penghitung ID transaksi (XID) dibatasi hingga 32 bit dan jika pernah mencapai angka berikutnya, alih-alih mengganti transaksi maks yang lama, ia mulai dari nol.
Nah, sekarang nol, jadi PostgreSQL menyembunyikan semua transaksi> 0 darinya. Jadi meskipun Transaksi # 2.147.483.633 terjadi 20 detik yang lalu, PostgreSQL berpikir itu tidak akan terjadi untuk 2.147.483.633 transaksi lainnya.
sumber