การสำรองข้อมูลตรวจพบความเสียหาย แต่ CHECKDB ไม่ได้


12

ฉันมีฐานข้อมูลที่เมื่อฉันรันคำสั่ง backup

BACKUP DATABASE [MyDatabase] TO     
DISK =  'G:\Backup\MyDatabase_01_01_2018.bak'   
WITH    NOFORMAT, NOSKIP, COMPRESSION, INIT, BUFFERCOUNT = 100

ฉันได้รับข้อความแสดงข้อผิดพลาด

เกี่ยวกับ 3043 ระดับ 16 สถานะ 1 บรรทัด 8
สำรอง 'MyDatabase' ตรวจพบข้อผิดพลาดในหน้า (1: 745345) ในแฟ้ม 'F: \ Data \ MyDatabase_1.ndf'
ข่าวสารเกี่ยวกับ 3013, ระดับ 16, สถานะ 1,
ฐานข้อมูลการสำรอง8 บรรทัดถูกยกเลิกอย่างผิดปกติ

ฉันใช้ CHECKDB เต็ม แต่กลับมาสะอาด ฉันสังเกตเห็นว่าตัวเลือก Page Verify ได้รับการตั้งค่าเป็น NONE (ไม่ใช่ของฉัน) ดังนั้นฉันจึงเปลี่ยนเป็น CHECKSUM และสร้างดัชนีทั้งหมดใน DB ใหม่เพื่อให้มันเขียนไปยังทุกหน้าและสร้าง checksums หลังจากนี้การสำรองข้อมูลยังคงล้มเหลวและ checkdb ยังคงแสดงข้อมูลที่สะอาด (ดังนั้นจึงไม่มีการเปลี่ยนแปลง)

DBCC CHECKDB('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS,
DATA_PURITY, EXTENDED_LOGICAL_CHECKS;

จากบันทึก SQL:

DBCC CHECKDB (MyDatabase) ด้วย all_errormsgs, no_infomsgs, data_purity ดำเนินการโดย xxx พบ 0 ข้อผิดพลาดและซ่อมแซมข้อผิดพลาด 0 ข้อ เวลาที่ผ่านไป: 0 ชั่วโมง 21 นาที 46 วินาที สแน็ปช็อตฐานข้อมูลภายในมีจุดแยก LSN = 000ab776: 0000112f: 0001 และ LSN แรก = 000ab776: 0000112d: 0001

ฉันรัน DBCC PAGE แต่ข้อผิดพลาด (ดูเหมือนจะไม่ได้กลับหน้าขวาในตอนแรก) ฉันสามารถรันด้วยตัวเลือกการพิมพ์ 2 และกลับมา แต่โดยสุจริตฉันไม่รู้ว่าฉันกำลังมองหาที่นั่น

DBCC PAGE ('MyDatabase',1,745345,3)
หน้า: (3: 513793)

กันชน:


BUF @ 0x00000003811F8280

bpage = 0x00000000F2D70000 bhash = 0x00000000000000000000 bpageno = (1: 745345)
bdbid = 5 Breferences = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 44283 bstat = 0x809
บล็อก = 0x5adb215a bnext = 0x00000000000000000000          

ส่วนหัวของหน้า:


หน้า @ 0x00000000F2D70000

m_pageId = (3: 513793) m_headerVersion = 1 m_type = 2
m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x0
m_objId (AllocUnitId.idObj) = 1075937538 m_indexId (AllocUnitId.idInd) = 2
ข้อมูลเมตา: AllocUnitId = 633462595911680 ข้อมูลเมตา: PartitionId = 0
ข้อมูลเมตา: ดัชนีรหัส = -1 ข้อมูลเมตา: ObjectId = 0 m_prevPage = (3: 513795)
m_nextPage = (3: 513820) pminlen = 17 m_slotCnt = 426
m_freeCnt = 2 m_freeData = 7338 m_reservedCnt = 0
m_lsn = (608841: 643611: 411) m_xactReserved = 0 m_xdesId = (0: 0)
m_ghostRecCnt = 0 m_tornBits = 0 DB Frag ID = 1

สถานะการจัดสรร

GAM (1: 511232) = จัดสรร SGAM (1: 511233) = ไม่จัดสรร     
PFS (1: 744096) = 0x40 จัดสรร 0_PCT_FULL DIFF (1: 511238) = ไม่เปลี่ยนแปลง
ML (1: 511239) = ไม่ MIN_LOGGED      

เกี่ยวกับข่าวสาร 2514 ระดับ 16 สถานะ 8 บรรทัด 20
A เกิดข้อผิดพลาด DBCC PAGE: ข้อมูลเมตาของเพจไม่ถูกต้อง - ลักษณะการถ่ายโอนข้อมูล 3 เป็นไปไม่ได้

ความคิดใดที่ฉันจะลองต่อไป รุ่นเซิร์ฟเวอร์คือ

select @@version
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64) 
    21 กุมภาพันธ์ 2018 12:19:47 
    ลิขสิทธิ์ (c) Microsoft Corporation
    Developer Edition (64 บิต) บน Windows NT 6.3 (รุ่น 9600:) (Hypervisor)

ระดับความเข้ากันได้ของฐานข้อมูลคือ 100 (SQL 2008)


ความคิดเห็นเกี่ยวกับคำถามนี้ได้รับการย้ายไปแชท
พอลไวท์ 9

คำตอบ:


9

คำตอบนี้นำมาจากปัญหาของจดหมายข่าว SQLskills.com ที่เขียนโดย Paul Randal เกี่ยวกับ "ฐานข้อมูลที่จะล้มเหลวในการสำรองข้อมูลด้วยข้อผิดพลาดในการตรวจสอบหน้า แต่ผ่านDBCC CHECKDB"

ครั้งเดียวที่สิ่งนี้สามารถเกิดขึ้นได้คือเมื่อขอบเขตเป็นขอบเขตผสม (โดยที่ 8 หน้าในขอบเขตสามารถจัดสรรให้กับหน่วยการจัดสรรที่แตกต่างกัน 8 หน่วย - ดูที่นี่ ) และบางหน้าถูกทำเครื่องหมายผิดพลาดตามที่จัดสรรโดยหน้า PFS ที่เกี่ยวข้อง

เมื่อเกิดเหตุการณ์นี้ขึ้นDBCC CHECKDBจะไม่พยายามอ่านหน้าเหล่านั้นเนื่องจากจะได้รับหน้าที่อ่านจากหน้า IAM ของหน่วยการจัดสรร (หน้าแรกที่แสดงรายการหน้าที่ได้รับการจัดสรรจากส่วนต่าง ๆ ) กรณีนี้เป็นช่องว่างในDBCC CHECKDBตรรกะการตรวจจับการทุจริต

[เนื่องจาก] DBCC CHECKDBตรวจไม่พบความเสียหายจึงไม่สามารถทำการซ่อมแซมที่จำเป็นในการแก้ไขได้ ดังนั้นการใช้DBCC WRITEPAGEงานฉันจึงทำการเปลี่ยนแปลงที่จำเป็นในสถานะการจัดสรรสำหรับหน้าที่จัดสรรอย่างไม่ถูกต้องโดยตรงในหน้า PFS และทำงานได้!

นี่เป็นกรณีที่หายากมาก - มันเป็นเรื่องธรรมดามากที่การDBCC CHECKDB ล้มเหลว แต่การสำรองข้อมูลจะสำเร็จ

ในความคิดของฉันการแก้ปัญหาของ Paul นั้นเหนือกว่าการส่งออกและนำเข้าข้อมูลเหมือนที่คุณทำดังนั้นฉันคิดว่าคุณทำในสิ่งที่ถูกต้อง

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