Tentang “Sampul ID Transaksi”


10

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


Saya pikir hasil edit terakhir Anda mungkin harus menjadi pertanyaan baru jika memungkinkan
Jack mengatakan coba topanswers.xyz

Jawaban:


10

Mengapa setelah basis data menderita ID transaksi, transaksi yang di masa lalu tampak di masa depan?

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):

XID normal dibandingkan menggunakan modulo-2 ^ 31 aritmatika. Ini berarti bahwa untuk setiap XID normal, ada dua miliar XID yang "lebih tua" dan dua miliar yang "lebih baru"

untuk lebih spesifik:

versi baris lama harus dipindahkan XID FrozenXID beberapa saat sebelum mereka mencapai tanda dua miliar transaksi-lama

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:

Jika karena alasan tertentu autovacuum gagal menghapus XID lama dari sebuah tabel, sistem akan mulai memancarkan pesan peringatan seperti ini ketika XID tertua di database mencapai sepuluh juta transaksi dari titik sampul:

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

(VACUUM manual harus memperbaiki masalah, seperti yang disarankan oleh petunjuk; tetapi perhatikan bahwa VACUUM harus dilakukan oleh pengguna super, jika tidak akan gagal untuk memproses katalog sistem dan dengan demikian tidak dapat memajukan datfrozenxid database.) Jika peringatan ini diabaikan, sistem akan dimatikan dan menolak untuk memulai transaksi baru begitu ada kurang dari 1 juta transaksi yang tersisa sampai sampul

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.



5

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.


1
Dokumen diperbaiki pada bulan Desember 2013. XID dihitung menggunakan modulo-2 ^ 31.
eradman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.