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 ในหน้าใหม่ SQL Server จะใส่ hobt_id (Heap หรือ B-Tree ID) ที่มีหน้าใหม่อยู่ในคําขอล็อก อย่างไรก็ตาม SQL Server ไม่สามารถใส่ hobt_id ในบันทึกการทํามิเรอร์ และส่งผลให้เกิดลักษณะการทํางานการล็อกที่แตกต่างกันระหว่างหลักและมิเรอร์

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

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