บน SQL Server 2017 (CU3) เมื่อใดก็ตามที่ฉันเปิดใช้งานการบีบอัดข้อมูลสำรองในหนึ่งในฐานข้อมูล TDE ของฉันกระบวนการสำรองข้อมูลจะทำให้หน้าเว็บที่ระบุในฐานข้อมูลเสียหาย ถ้าฉันเรียกใช้การสำรองข้อมูลโดยไม่มีการบีบอัดจะไม่ได้รับความเสียหาย นี่คือขั้นตอนที่ฉันได้ดำเนินการเพื่อตรวจสอบและทำให้เกิดปัญหานี้อีกครั้ง:
- รัน DBCC CheckDB บนฐานข้อมูล "TDE_DB1"; ทุกอย่างดีไม่มีข้อผิดพลาด
- สำรองฐานข้อมูลได้สำเร็จโดยไม่ต้องบีบอัด RESTORE VERIFYONLY กล่าวว่าทุกอย่างดี
- กู้คืนฐานข้อมูลเป็น "TDE_DB2" ได้สำเร็จ; ทั้งหมดเป็นสิ่งที่ดี DBCC CheckDB ไม่แสดงข้อผิดพลาด;
- สำรองฐานข้อมูล "TDE_DB1" สำเร็จด้วยการบีบอัด กู้คืนข้อผิดพลาดยืนยันว่า "ตรวจพบความเสียหายต่อชุดข้อมูลสำรอง";
- พยายามกู้คืนฐานข้อมูลเป็น "TDE_DB2"; ข้อผิดพลาดการพูดว่า "RESTORE ตรวจพบข้อผิดพลาดในหน้า (1: 92454) ในฐานข้อมูล"
- ทำซ้ำขั้นตอนที่ 1-3; ทั้งหมดเป็นสิ่งที่ดี;
- DROP "TDE_DB1" และ "TDE_DB2"; กู้คืน "TDE_DB1" จากการสำรองข้อมูล ทั้งหมดเป็นสิ่งที่ดี;
- ทำซ้ำขั้นตอนที่ 1-5; รับผลลัพธ์เดียวกัน
ในการสรุป: ฐานข้อมูลและการสำรองข้อมูลตามปกติดูเหมือนจะใช้ได้การเรียกใช้ CHECKDB บนฐานข้อมูลและ VERIFYONLY บนการสำรองข้อมูลจะไม่รายงานข้อผิดพลาดใด ๆ การสำรองฐานข้อมูลด้วยการบีบอัดดูเหมือนว่าจะทำให้เกิดความเสียหาย
ด้านล่างนี้เป็นตัวอย่างรหัสที่มีข้อผิดพลาด (หมายเหตุ: จำเป็นต้องใช้ MAXTRANSFERSIZE สำหรับการใช้การบีบอัดกับฐานข้อมูล TDE )
-- Good, completes with no corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1a.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- Bad, I haz corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM, COMPRESSION, MAXTRANSFERSIZE = 131072;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM;
-- ERROR
--Msg 3189, Level 16, State 1, Line 1
--Damage to the backup set was detected.
--Msg 3013, Level 16, State 1, Line 1
--VERIFY DATABASE is terminating abnormally.
RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1b.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- ERROR
--Msg 3183, Level 16, State 1, Line 7
--RESTORE detected an error on page (1:92454) in database "TDE_DB2" as read from the backup set.
--Msg 3013, Level 16, State 1, Line 7
--RESTORE DATABASE is terminating abnormally.
ฉันพยายามตรวจสอบหน้าที่รายงานว่ามีข้อผิดพลาด (เป็นหน้าเดียวกันเสมอ) แต่หน้า DBCC รายงานว่า ObjectId คือ 0 อ้างอิงจากบทความโดย Paul Randalซึ่งหมายความว่าไม่พบข้อมูลเมตาและ หนึ่งในสาเหตุอาจเป็นได้ว่าหน้าตัวเองเสียหายและมีการใช้ค่าที่ไม่ถูกต้องเพื่อค้นหาข้อมูลเมตา คำแนะนำของเขาคือเรียกใช้ CHECKDB ซึ่งฉันไม่สามารถทำได้เนื่องจากการสำรองข้อมูลที่เสียหายจะไม่คืนค่า
ฉันลองคำแนะนำจากโพสต์ SO นี้ (การเพิ่ม INIT และ FORMAT ในคำสั่ง BACKUP) เพื่อรีเซ็ตเมทาดาทา แต่ดูเหมือนว่าไม่ได้เปลี่ยนอะไรเลยฉันยังคงได้รับความเสียหายในการสำรองข้อมูลที่บีบอัด
สิ่งนี้จะเกิดขึ้นกับหนึ่งในฐานข้อมูล TDE ของฉัน ฉันมี 4 ฐานข้อมูล TDE อื่น ๆ บนเซิร์ฟเวอร์เดียวกันนี้และพวกเขาไม่มีปัญหานี้ ที่บอกฉันว่าอาจมีปัญหาพื้นฐานกับฐานข้อมูลเฉพาะนี้ ฉันรู้ว่าทางออกที่ง่ายคือไม่ใช้การบีบอัด แต่ฉันรู้สึกว่านี่อาจเป็นการเตือนล่วงหน้าถึงปัญหาที่ใหญ่กว่าที่ตามมา
มีใครเคยเห็นสิ่งนี้มาก่อนหรือมีความคิดว่าทำไมการบีบอัดจะทำให้หน้านั้นเสียหาย? เมื่อมาถึงจุดนี้ฉันค่อนข้างจะสูญเสียว่าจะทำอย่างไรต่อไป ฉันถือว่าการกู้คืนหน้าจากการสำรองข้อมูลก่อนหน้านี้ แต่ฉันไม่คิดว่ามันจะมีความสำคัญเนื่องจากหน้าในฐานข้อมูลปกติดูเหมือนจะใช้ได้
อัปเดต 1: ด้านล่างนี้เป็นผลลัพธ์จาก DBCC PAGE พร้อมตัวเลือก 0:
การดำเนินการ DBCC เสร็จสมบูรณ์ ถ้า DBCC พิมพ์ข้อความผิดพลาดติดต่อผู้ดูแลระบบของคุณ
หน้า: (1: 92454)
กันชน:
BUF @ 0x000002187AE55640
bpage = 0x000002184865E000 bhash = 0x0000000000000000
bpageno = (1: 92,454) bdbid = 8 breferences = 0 bcputicks = 563 bsampleCount = 1
bUse1 = 51,429 bstat = 0x809 = บล็อก 0x15a
bnext = 0x0000000000000000 bDirtyContext = 0x0000000000000000 bstat2 = 0x0ส่วนหัวของหน้า:
หน้า @ 0x000002184865E000
m_pageId = (1: 92,454) m_headerVersion = 111
m_type = 189 m_typeFlagBits = 0x2d m_level = 197
m_flagBits = 0x525e m_objId (AllocUnitId.idObj) = 788,815,194
m_indexId (AllocUnitId.idInd) = 515 Metadata: AllocUnitId = 145011308798541824 Metadata: PartitionId = 0 Metadata: IndexId = -1 ข้อมูลเมตา: ObjectId = 0 m_prevPage = (32842: 1881351155) m_nextPage = (13086: -560562340)
pminlen = 36067 m_slotCnt = 8189 m_freeData 14755
m_xdesId = (12811: 1559482793) m_ghostRecCnt = 12339
m_tornBits = -1381699202 DB Frag ID = 1สถานะการจัดสรร
GAM (1: 2) = จัดสรร SGAM (1: 3) = ไม่จัดสรร
PFS (1: 88968) = 0x0 0_PCT_FULL DIFF (1: 6) = ไม่เปลี่ยน
ML (1: 7) = ไม่ MIN_LOGGED
ถ้าฉันพยายามรัน DBCC PAGE ด้วยตัวเลือกอื่น ๆ ฉันจะได้รับข้อผิดพลาดด้านล่าง:
DBCC PAGE พร้อมตัวเลือก 1: ข่าวสารเกี่ยวกับ 0, ระดับ 11, สถานะ 0, บรรทัด 0 เกิดข้อผิดพลาดร้ายแรงในคำสั่งปัจจุบัน ควรยกเลิกผลลัพธ์หากมี
DBCC PAGE พร้อมตัวเลือก 3: ข่าวสารเกี่ยวกับ 2514, ระดับ 16, สถานะ 5, บรรทัดที่ 3 เกิดข้อผิดพลาดของ DBCC PAGE: ประเภทหน้าไม่ถูกต้อง - ลักษณะการถ่ายโอนข้อมูล 3 เป็นไปไม่ได้
UPDATE 2: นี่คือผลลัพธ์บางส่วนจาก sys.dm_db_database_page_allocations DMO:
object_id = 75 index_id = 1 rowset_id = 281474981625856 allocation_unit_id = 281474981625856
allocation_unit_type = 1 allocation_unit_type_desc = IN_ROW_DATA extent_file_id = 1 extent_page_id = 92,448
allocated_page_iam_file_id = 1 allocated_page_iam_page_id = 104
allocated_page_file_id = 1 allocated_page_page_id = 92,454
is_allocated = 0 = 0 is_iam_page is_mixed_page_allocation = 0