อาการ
เมื่อคุณใช้การมิเรอร์ฐานข้อมูลใน Microsoft SQL Server 2012 หรือ Microsoft SQL Server 2014 คุณอาจพบเงื่อนไข assert และการจําลองฐานข้อมูลจะเข้าสู่สถานะหยุดชั่วคราว
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจากเมื่อจัดสรรหน้าใหม่ SQL Server ได้รับการล็อก X ในหน้าใหม่ SQL Server จะใส่ hobt_id (Heap หรือ B-Tree ID) ที่มีหน้าใหม่อยู่ในคําขอล็อก อย่างไรก็ตาม SQL Server ไม่สามารถใส่ hobt_id ในบันทึกการทํามิเรอร์ และส่งผลให้เกิดลักษณะการทํางานการล็อกที่แตกต่างกันระหว่างหลักและมิเรอร์
สามารถอธิบายรายละเอียดได้ดังนี้:
- T1 ล็อก IX บนหน้า P1 ค้างไว้
- T2 ทําการแบ่งหน้าบน P1, จัดสรรหน้า P2 ใหม่, ใช้ TX ทรานแซคชันระบบที่นี่ ซึ่งจะล็อก X บน P2 ที่นี่ SQL Server ไม่ได้ใส่ hobt_id ในแฟ้มบันทึกการมิเรอร์
- TX ทําการล็อกการโยกย้ายสําหรับ T1 เพื่อย้าย IX Lock จาก P1 ไปยัง P2
- TX ยอมรับ ตอนนี้ T2 สามารถใช้หน้า P2 และ T2 รับ IX lock อื่นบนหน้า P2
- T1 ยอมรับ ตอนนี้ T2 เป็นเพียงคนเดียวที่ถือล็อก IX บน P2
- หลังจากการแทรกจํานวนมากการเลื่อนระดับล็อคเกิดขึ้นใน T2 หลักจะปล่อย IX บน P2 แต่บนกระจกระหว่างการเลื่อนระดับล็อค T2 ไม่ได้ปล่อย IX lock
- หลังจากการลบจํานวนมาก Page P2 กลายเป็นว่างเปล่าและ deallocated
- T3 ต้องการหน้าใหม่ และเกิดขึ้นเพื่อจัดสรร P2 ซึ่งต้องใช้การล็อก X แต่บนมิเรอร์ ขั้นตอนนี้ล้มเหลวเนื่องจากขั้นตอนที่ 6
บนมิเรอร์ ขั้นตอนที่ 6 ไม่ปลดล็อก IX เนื่องจาก hobt_id ในบล็อกล็อคไม่ถูกต้อง hobt_id ที่ไม่ถูกต้องนี้เกิดขึ้นในระหว่างขั้นตอนที่ 2 และเนื่องจาก SQL Server ไม่ได้ใส่ hobt_id ในบันทึกการมิเรอร์
โดยปกติแล้วคุณจะไม่เห็นปัญหาใด ๆ เนื่องจาก TX ในขั้นตอนที่ 2 สั้นมากและบล็อกล็อคที่มี hobt_id ไม่ถูกต้องจะถูกปล่อยออกมาเมื่อยอมรับ อย่างไรก็ตาม เนื่องจากการโยกย้ายล็อกในขั้นตอนที่ 3 และขั้นตอนต่อไปนี้ (4 และ 5) บล็อกล็อกนี้ด้วย hobt_id ที่ไม่ถูกต้องจะถูกเก็บรักษาไว้และสุดท้ายทําให้เกิดปัญหา
หลักไม่มีปัญหานี้เนื่องจากใช้ hobt_id ที่ถูกต้องในขั้นตอนที่ 2 แต่เรกคอร์ดบันทึกไม่มี hobt_id ที่ถูกต้อง
การแก้ปัญหา
ปัญหานี้ได้รับการแก้ไขเป็นครั้งแรกในการอัปเดตแบบสะสมของ SQL Server ต่อไปนี้
การอัปเดตสะสม 1 สําหรับ SQL Server 2014 /en-us/help/2931693
การอัปเดตสะสม 9 สําหรับ SQL Server 2012 SP1 /en-us/help/2931078
เกี่ยวกับการอัปเดตสะสมสําหรับ SQL Server
แต่ละปรับปรุงสะสมใหม่สําหรับ SQL Server ประกอบด้วยโปรแกรมแก้ไขด่วนทั้งหมด และการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการปรับปรุงสะสมก่อนหน้านี้ ดูการอัปเดตแบบสะสมล่าสุดสําหรับ SQL Server:
วิธีแก้ไขปัญหาชั่วคราว
เมื่อต้องการแก้ไขปัญหานี้ ให้เตรียมใช้งานมิเรอร์ใหม่เพื่อสิ้นสุดสถานะถูกระงับ
สถานะ
Microsoft ได้ยืนยันว่านี่เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในส่วน "นำไปใช้กับ"