KB2938828 - แก้ไข: การจําลองฐานข้อมูล ฮิต ยืนยัน และการมิเรอร์เซสชันแสดงสถานะถูกระงับใน SQL Server 2012 หรือ SQL Server 2014

นำไปใช้กับ
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

อาการ

เมื่อคุณใช้การมิเรอร์ฐานข้อมูลใน 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 ในบันทึกการมิเรอร์ และส่งผลให้มีลักษณะการล็อกระหว่างไฟล์หลักและมิเรอร์แตกต่างกัน

ซึ่งสามารถอธิบายรายละเอียดได้ดังนี้:

  1. T1 ล็อค IX ในหน้า P1
  2. T2 ทําการแยกหน้าบน P1 จัดสรรหน้าใหม่ P2 ทรานแซคชันระบบ TX ถูกใช้ที่นี่ มันถือ X Lock บน P2 ที่นี่ SQL Server ไม่ได้ใส่ hobt_id ในบันทึกการมิเรอร์
  3. TX ทําการโยกย้ายล็อกสําหรับ T1 เพื่อย้ายล็อก IX จาก P1 ไปยัง P2
  4. TX แล้ว ตอนนี้ T2 สามารถใช้หน้า P2 และ T2 รับการล็อก IX อื่นบนหน้า P2
  5. ตอนนี้ T2 เป็นคนเดียวที่ล็อค IX บน P2
  6. หลังจากการแทรกหลายครั้ง การเลื่อนระดับการล็อกจะเกิดขึ้น บนรายการหลัก T2 จะปล่อย IX บน P2 แต่บนมิเรอร์ ระหว่างการเลื่อนระดับการล็อก T2 ไม่ได้ปลดล็อค IX
  7. หลังจากลบหลายครั้ง หน้า P2 กลายเป็นพื้นที่ว่างเปล่าและถูกยกเลิกการจัดสรร
  8. 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 ที่แสดงไว้ในส่วน "นำไปใช้กับ"