ตอนนี้ฉันอ่านเอกสารเกี่ยวกับ "Transaction ID Wraparound" แต่มีบางอย่างที่ฉันไม่เข้าใจจริงๆเอกสารเป็น url ต่อไปนี้ http://www.postgresql.org/docs/9.0/static/routine-vacuuming .html # สูญญากาศ-FOR-วิจิตร
23.1.4 การป้องกันการล้มเหลวของการห่อธุรกรรม ID
ความหมายของธุรกรรม MVCC ของ PostgreSQL นั้นขึ้นอยู่กับความสามารถในการเปรียบเทียบหมายเลขรหัสธุรกรรม (XID): เวอร์ชันแถวที่มีการแทรก XID มากกว่า XID ของธุรกรรมปัจจุบันคือ "ในอนาคต" และไม่ควรมองเห็นธุรกรรมปัจจุบัน แต่เนื่องจาก ID ธุรกรรมมีขนาดที่ จำกัด (32 บิต) คลัสเตอร์ที่รันเป็นเวลานาน (มากกว่า 4 พันล้านธุรกรรม) จะได้รับการใช้งาน ID ของรายการ: ตัวนับ XID ล้อมรอบเป็นศูนย์และธุรกรรมทั้งหมดที่อยู่ใน อดีตดูเหมือนจะเป็นในอนาคต - ซึ่งหมายความว่าผลผลิตของพวกเขาจะมองไม่เห็น ในระยะสั้นการสูญเสียข้อมูลหายนะ (ที่จริงแล้วข้อมูลยังคงอยู่ที่นั่น แต่มันก็สบายดีถ้าคุณไม่สามารถทำได้) เพื่อหลีกเลี่ยงสิ่งนี้จำเป็นต้องดูดทุกตารางในฐานข้อมูลทุก ๆ อย่างน้อยหนึ่งครั้งทุกๆสองพันล้านธุรกรรม
ฉันไม่เข้าใจคำแถลงว่า "จะได้รับการรบกวนการทำธุรกรรม ID: ตัวนับ XID ล้อมรอบเป็นศูนย์และธุรกรรมทั้งหมดที่เกิดขึ้นทันทีในอดีตดูเหมือนจะเป็นในอนาคต - ซึ่งหมายความว่าผลลัพธ์ของพวกเขาจะมองไม่เห็น"
มีคนอธิบายเรื่องนี้ได้ไหม เหตุใดหลังจากที่ฐานข้อมูลมีปัญหา ID การพันธุรกรรมที่เกิดขึ้นในอดีตจะปรากฏเป็นอนาคต ในระยะสั้นฉันต้องการที่จะรู้ว่า PostgreSQL จะอยู่ในสถานการณ์ "การสูญเสียข้อมูล" หลังจากการทำรายการ ID โดยการ autovacuum โดยอัตโนมัติหรือไม่?
สำหรับมุมมองส่วนตัวของฉันเราสามารถรับ ID ธุรกรรมปัจจุบันโดยใช้ฟังก์ชัน txid_current () whoes output เป็น 64 บิตและจะไม่ถูกกรณืดังนั้นฉันคิดว่า ID ธุรกรรมการแทรกของ tuples ซึ่งรู้ว่า xmin จะเป็นผู้ดูแลมากกว่า xid ที่ได้รับ โดย txid_current () ฟังก์ชั่น ยกเว้นว่าคุณจะใช้ pg_resetxlog รีเซ็ต ID ธุรกรรมการรีเซ็ตหลังจากปิดเซิร์ฟเวอร์ PostgreSQL ฉันถูกไหม ? ขอบคุณ