อาการ
เมื่อคุณใช้การมิเรอร์ฐานข้อมูลใน Microsoft SQL Server 2012 หรือ Microsoft SQL Server 2014 คุณอาจพบสภาวะ Assert และการมิเรอร์ฐานข้อมูลเข้าสู่สถานะหยุดชั่วคราว
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจาก เมื่อจัดสรรหน้าใหม่ SQL Server ได้รับ X Lock บนหน้าใหม่ SQL Server จะใส่ hobt_id (Heap หรือ B-Tree ID) ซึ่งหน้าใหม่อยู่ในคําขอล็อก อย่างไรก็ตาม SQL Server ไม่สามารถใส่ hobt_id ในบันทึกการมิเรอร์ และส่งผลให้มีลักษณะการล็อกระหว่างไฟล์หลักและมิเรอร์แตกต่างกัน
ซึ่งสามารถอธิบายรายละเอียดได้ดังนี้:
- T1 ล็อค IX ในหน้า P1
- T2 ทําการแยกหน้าบน P1 จัดสรรหน้าใหม่ P2 ทรานแซคชันระบบ TX ถูกใช้ที่นี่ มันถือ X Lock บน P2 ที่นี่ SQL Server ไม่ได้ใส่ hobt_id ในบันทึกการมิเรอร์
- TX ทําการโยกย้ายล็อกสําหรับ T1 เพื่อย้ายล็อก IX จาก P1 ไปยัง P2
- TX แล้ว ตอนนี้ T2 สามารถใช้หน้า P2 และ T2 รับการล็อก IX อื่นบนหน้า P2
- ตอนนี้ T2 เป็นคนเดียวที่ล็อค IX บน P2
- หลังจากการแทรกหลายครั้ง การเลื่อนระดับการล็อกจะเกิดขึ้น บนรายการหลัก T2 จะปล่อย IX บน P2 แต่บนมิเรอร์ ระหว่างการเลื่อนระดับการล็อก T2 ไม่ได้ปลดล็อค IX
- หลังจากลบหลายครั้ง หน้า P2 กลายเป็นพื้นที่ว่างเปล่าและถูกยกเลิกการจัดสรร
- 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 ที่แสดงไว้ในส่วน "นำไปใช้กับ"