ไม่สามารถกู้คืนได้ (ข้อผิดพลาด 3456)


9

ฉันมีสถานการณ์ที่ไม่สามารถเข้าใจได้ง่ายและคิดว่าฉันจะถามในฟอรัมนี้หากผู้อื่นอาจมีคำแนะนำ

ฉันใช้ SQL Server 2008 R2 SP3 มาตรฐานบน Windows Server 2008R2 Enterprise

ฐานข้อมูลต้องการการบำรุงรักษาและหลังจากที่ฉันต้องกู้คืนบนเซิร์ฟเวอร์อื่น ฉันมีการสำรองฐานข้อมูลเต็มรูปแบบโดยใช้ COPY_ONLY บวกชุดสำเนาสำรอง 4 ชุด

  1. ก่อนที่จะเริ่มสร้าง tlogbackup1
  2. เปลี่ยนจากFULLเป็นBULK_LOGGEDโมเดลการกู้คืน
  3. เพิ่มกลุ่มไฟล์ใหม่
  4. เพิ่มไฟล์ไปยัง newfilegroup
  5. ตั้ง newfilegroup ให้เป็นค่าเริ่มต้น
  6. เลือกลงในตาราง (ใน newfilegroup)
  7. วางตารางต้นฉบับ
  8. ลบไฟล์ต้นฉบับ
  9. ลบกลุ่มไฟล์ดั้งเดิม
  10. เปลี่ยนชื่อของตารางใหม่เพื่อให้ตรงกับตารางเดิม
  11. เปลี่ยนชื่อไฟล์ของ newfilegroup เพื่อให้ตรงกับกลุ่มไฟล์ดั้งเดิม
  12. เปลี่ยนชื่อไฟล์ในแค็ตตาล็อกเพื่อให้ตรงกับชื่อไฟล์ต้นฉบับ
  13. เปลี่ยนชื่อไฟล์ที่ระดับ OS เพื่อให้ตรงกับชื่อไฟล์ต้นฉบับ
  14. กำหนด filegroup เริ่มต้นให้เป็นต้นฉบับ
  15. นำ db ออนไลน์
  16. เปลี่ยนจากBULK_LOGGEDเป็นFULLโมเดลการกู้คืน
  17. หลังจากเสร็จสิ้นทุกขั้นตอนให้สร้าง tlogbackup2

การคืนค่าการสำรองข้อมูลทั้งหมดจะต้องใช้กับ MOVE เนื่องจากการเปลี่ยนอักษรชื่อไดรฟ์บนเซิร์ฟเวอร์การคืนค่า

ขั้นตอนการกู้คืน:

RESTORE database SomeDB FROM DISK = 'D:\REPRO\SomeDB.bak'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

RESTORE LOG SomeDB FROM DISK = 'D:\REPRO\tlogbackup1.trn'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

RESTORE LOG SomeDB FROM DISK = 'D:\REPRO\tlogbackup2.trn'   
WITH 
MOVE 'SystemData' TO 'D:\SQLDATA\SomeDB.mdf'
,MOVE 'SystemDataPDS' TO 'D:\SqlData\SomeDB.ndf'
,MOVE 'SystemData_log' TO 'D:\SQLLogs\SomeDB.LDF'
,NORECOVERY
,stats = 1

การคืนค่า tlog ครั้งสุดท้ายได้รับ 100% แล้วล้มเหลวด้วยข้อผิดพลาด 3456:

ดำเนินการแล้ว 368 หน้าสำหรับฐานข้อมูล 'SomeDB', ไฟล์ 'SystemData' ในไฟล์ 1

ประมวลผลแล้ว 7656520 หน้าสำหรับฐานข้อมูล 'SomeDB', ไฟล์ 'SystemDataPDS' ในไฟล์ 1

ดำเนินการ 172430 หน้าสำหรับฐานข้อมูล 'SomeDB', ไฟล์ 'SystemData_log' ในไฟล์ 1

ข่าวสารเกี่ยวกับ 3456, ระดับ 16, สถานะ 1, บรรทัด 1
ไม่สามารถทำซ้ำบันทึกบันทึก (210388: 123648: 232), สำหรับรหัสธุรกรรม (0: 1016710921), หน้า (4: 8088), ฐานข้อมูล 'SomeDB' (ฐานข้อมูล 6) . หน้า: LSN = (0: 0: 1), พิมพ์ = 11 บันทึก: OpCode = 4, บริบท 11, PrevPageLSN: (210388: 122007: 1) กู้คืนจากการสำรองฐานข้อมูลหรือซ่อมแซมฐานข้อมูล ข่าวสารเกี่ยวกับ 3013 ระดับ 16 สถานะ 1 บรรทัด 1 RESTORE LOG ถูกยกเลิกอย่างผิดปกติ

เพียงเพื่อตรวจสอบว่าการสำรองข้อมูลฐานข้อมูลเต็มก็โอเคฉันเรียกคืนมันวิ่งCHECKDBและไม่มีข้อผิดพลาด

ยินดีรับข้อเสนอแนะทั้งหมด

ขอบคุณล่วงหน้า,

เน็ดนาก


1
คุณสามารถอธิบายเพิ่มเติมว่าทำไมคุณถึงคิดว่าคุณมีบันทึกการเชื่อมต่อที่ไม่เสียหาย? ทันทีที่คุณพลิกฐานข้อมูลเข้าสู่โหมด BULK_LOGGED และเริ่มยุ่งกับสคีมาการเดิมพันทั้งหมดที่มีการล็อกเครือข่ายจะไม่ถูกทำลาย
โทมัส Kejser

ขอบคุณสำหรับคำตอบของคุณโธมัส ฉันเห็นแล้วว่าชื่อโพสต์ของฉันไม่ถูกต้อง ฉันไม่ต้องการการกู้คืนทันเวลา แต่การกู้คืนแบบเต็มไปจนถึงจุดสิ้นสุดของการสำรองข้อมูล tlog ครั้งที่ 4 ดังนั้นการตั้งค่า BULK_LOGGED ไม่ควรทำให้เกิดปัญหาใด ๆ ฉันไม่เห็นว่าสิ่งที่ฉันทำจะทำให้การสำรองข้อมูล tlog ครั้งที่ 2 ล้มเหลว - คำสั่งทั้งหมดได้รับการสนับสนุนโดย SQL Server และฉันรันขั้นตอนเดียวกันทุกประการ (แม้ว่าจะไม่ใช่ข้อมูลเดียวกัน) ในฐานข้อมูลขนาดเล็กและสามารถ เพื่อคืนค่าการสำรองข้อมูล tlog ครั้งที่ 2 โดยไม่มีปัญหา
NedOtter

ข้อผิดพลาดดูเหมือนความเสียหาย มันเป็นข้อผิดพลาดภายใน คุณสามารถตรวจสอบความถูกต้องของไฟล์สำรองทั้งหมดได้หรือไม่? พวกเขามี checksums หรือไม่
usr

ฉันตรวจสอบว่าการสำรองข้อมูลฐานข้อมูลเต็มมี 0 ข้อผิดพลาดโดยใช้ CHECKDB ฉันจะต้องตรวจสอบเพื่อดูว่า CHECKSUM ถูกใช้
NedOtter

1
หากการสำรองข้อมูลเปิดใช้งานการตรวจสอบแล้วคุณควรใช้การตรวจสอบสำหรับการเรียกคืนเช่นกัน Page type 11 เป็นเพจ PFS ซึ่งหมายความว่าคุณไม่สามารถแก้ไขได้คุณสามารถกู้คืนได้อย่างสมบูรณ์ นอกจากนี้คุณไม่ต้องพูดว่าเมื่อมีการคัดลอกเฉพาะการสำรองข้อมูล การสำรองข้อมูลนั้นอยู่ที่ไหนในเส้นเวลา
Robert L Davis

คำตอบ:


9

เพื่อที่จะเข้าใจว่าทำไมข้อผิดพลาด 3456 จึงถูกโยนออกไปเราต้องย้อนกลับไปเล็กน้อยและเข้าใจว่า SQL Server จัดการกับมุมการกู้คืนนี้ได้อย่างไร

เมื่อ SQL Server ทำการทำการดำเนินการซ้ำและการทำซ้ำนั้นเป็นการปรับเปลี่ยนหน้าจะเป็นการตรวจสอบอย่างรวดเร็ว ในส่วนหัวของหน้าในที่สุดก็จะเป็นPageLSNซึ่งเป็นข้อบ่งชี้ของ LSN ล่าสุดที่มีการแก้ไขหน้านั้นบันทึกโดยหน้า ลองคิดดูอย่างนี้หน้าจะติดตาม LSN ล่าสุดที่ได้ทำการแก้ไข PageLSNนี่คือ

ทุกครั้งที่มีการดำเนินการปรับเปลี่ยนหน้าบันทึกรายการบันทึกนั้นจะมี LSN อยู่สองสามรายการ คือบันทึกของ LSN (คิดว่า ... LSN ปัจจุบัน ) แล้วมีสิ่งที่เรียกว่าหน้าก่อนหน้า LSN ( PrevPageLSNไปข้างหน้า) ดังนั้นเมื่อเราปรับเปลี่ยนหน้าหนึ่งในชิ้นส่วนของข้อมูลที่จะใส่ลงในบันทึกบันทึกเป็นสิ่งที่หน้าแสดงให้เห็นว่าเป็นLSN สุดท้ายก่อนที่จะให้คุณได้แก้ไขหน้า

ลองคิดดูเช่นนี้ ... รถของคุณต้องทำงานให้เสร็จ Mechanic John ทำงานบนรถของคุณและในช่องเครื่องยนต์มีแท็กเล็กน้อยและ Mechanic John เขียนว่า "John ทำงานกับรถคันนี้เป็นครั้งสุดท้าย" จากนั้นในครั้งต่อไปที่คุณนำรถของคุณไปที่ร้านอื่น Mechanic Mark จะมองในช่องเครื่องยนต์และเห็นว่า Mechanic John ทำงานกับรถคันนี้ได้นาน บนแผ่นข้อมูลของเขาเขาเขียนข้อมูลนี้ แนวคิดเดียวกันกับ SQL Server

สิ่งนี้อาจทำให้เกิดความสับสนดังนั้นโปรดดูภาพด้านล่างเกี่ยวกับการแก้ไขหน้าตามลำดับและวิธีการPageLSNและPrevPageLSNความสัมพันธ์:

ป้อนคำอธิบายรูปภาพที่นี่

ลองวนกลับมาเพราะสิ่งนี้เข้ามาเล่นเมื่อคุณต้องการทำซ้ำการดำเนินการบนหน้า (คืนค่าการกู้คืน HA ฯลฯ ) เมื่อ SQL Server จำเป็นต้องทำการทำซ้ำหน้าการทำมันจะตรวจสอบสติเพื่อดูว่าPageLSNในหน้าตรงกับPrevPageLSNที่บันทึกรวมถึง หากไม่เท่ากันคุณจะเห็นข้อผิดพลาด 3456 ถูกโยน

ไม่PageLSNเท่ากับPrevPageLSN ? ไม่มี ??? หยุดและเพิ่มข้อผิดพลาด 3456 ...

มาวิเคราะห์ข้อความแสดงข้อผิดพลาดของคุณซึ่งประกอบด้วย:

ไม่สามารถทำซ้ำบันทึกบันทึก (210388: 123648: 232), สำหรับ ID ธุรกรรม (0: 1016710921), หน้า (4: 8088), ฐานข้อมูล 'SomeDB' (ID ฐานข้อมูล 6) หน้า: LSN = (0: 0: 1)พิมพ์ = 11 เข้าสู่ระบบ: opcode = 4 บริบท 11 PrevPageLSN: (210388: 122007: 1) กู้คืนจากการสำรองฐานข้อมูลหรือซ่อมแซมฐานข้อมูล ข่าวสารเกี่ยวกับ 3013 ระดับ 16 สถานะ 1 บรรทัด 1 RESTORE LOG ถูกยกเลิกอย่างผิดปกติ

ฉันมีตัวหนาสองชิ้นของข้อมูลที่มีความไม่เท่าเทียมกันทำให้เกิดข้อผิดพลาด คุณจะเห็นว่าเราPageLSNคือ0: 0: 1 (พบในส่วนหัวของหน้า) และของเราPrevPageLSNคือ210388: 122007: 1 (พบได้ในข้อมูลในบันทึกการทำงานที่พยายามจะทำซ้ำ) เห็นได้ชัดว่าไม่เท่ากันดังนั้น err3456

ดังนั้นเพื่อที่จะค้นหาสาเหตุของเหตุการณ์นี้คือเพื่อค้นหาว่าทำไมจึงมีความไม่เท่าเทียมกันที่นี่ เราจำเป็นต้องติดตามวงจรชีวิตของหน้า 4: 8088 และดูว่าการตัดการเชื่อมต่ออยู่ที่ไหน น่าเสียดายที่ไม่มีข้อมูลเพิ่มเติมหรือการแก้ไขปัญหาเบื้องต้นอย่างอื่นมีอะไรอีกมากมายที่ฉันสามารถทำได้นอกจากให้พื้นหลังของการดำเนินการกู้คืนนี้และสิ่งที่ทำให้เกิดข้อผิดพลาด


ฉันรู้ว่ามันประเดี๋ยว แต่ก็ยัง ... สิ่งที่ดีขอบคุณสำหรับคำอธิบายอย่างละเอียด!
RThomas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.