การบีบอัดข้อมูลสำรองทำให้เกิดความเสียหายในฐานข้อมูล TDE SQL 2017


13

บน SQL Server 2017 (CU3) เมื่อใดก็ตามที่ฉันเปิดใช้งานการบีบอัดข้อมูลสำรองในหนึ่งในฐานข้อมูล TDE ของฉันกระบวนการสำรองข้อมูลจะทำให้หน้าเว็บที่ระบุในฐานข้อมูลเสียหาย ถ้าฉันเรียกใช้การสำรองข้อมูลโดยไม่มีการบีบอัดจะไม่ได้รับความเสียหาย นี่คือขั้นตอนที่ฉันได้ดำเนินการเพื่อตรวจสอบและทำให้เกิดปัญหานี้อีกครั้ง:

  1. รัน DBCC CheckDB บนฐานข้อมูล "TDE_DB1"; ทุกอย่างดีไม่มีข้อผิดพลาด
  2. สำรองฐานข้อมูลได้สำเร็จโดยไม่ต้องบีบอัด RESTORE VERIFYONLY กล่าวว่าทุกอย่างดี
  3. กู้คืนฐานข้อมูลเป็น "TDE_DB2" ได้สำเร็จ; ทั้งหมดเป็นสิ่งที่ดี DBCC CheckDB ไม่แสดงข้อผิดพลาด;
  4. สำรองฐานข้อมูล "TDE_DB1" สำเร็จด้วยการบีบอัด กู้คืนข้อผิดพลาดยืนยันว่า "ตรวจพบความเสียหายต่อชุดข้อมูลสำรอง";
  5. พยายามกู้คืนฐานข้อมูลเป็น "TDE_DB2"; ข้อผิดพลาดการพูดว่า "RESTORE ตรวจพบข้อผิดพลาดในหน้า (1: 92454) ในฐานข้อมูล"
  6. ทำซ้ำขั้นตอนที่ 1-3; ทั้งหมดเป็นสิ่งที่ดี;
  7. DROP "TDE_DB1" และ "TDE_DB2"; กู้คืน "TDE_DB1" จากการสำรองข้อมูล ทั้งหมดเป็นสิ่งที่ดี;
  8. ทำซ้ำขั้นตอนที่ 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

คำตอบ:


8

ดูเหมือนว่าปัญหานี้เกิดขึ้นกับฐานข้อมูลที่มีการดำเนินการ SHRINK กับพวกเขา ในกรณีของฉันฉันกำลังคัดลอกหนึ่งในฐานข้อมูลการผลิตของเราใน SQL Server 2014 (ซึ่งถูกเข้ารหัสด้วย TDE แล้ว) รัน DBCC SHRINKFILE ทั้งข้อมูลและไฟล์บันทึกจากนั้นทำการสำรองข้อมูลและเรียกคืนบน SQL ใหม่ของฉัน เซิร์ฟเวอร์ 2017 (สาเหตุของการย่อขนาดคือเพื่อลดขนาดเพื่อให้การถ่ายโอนการสำรองข้อมูลเร็วขึ้น)

ในการทดสอบฉันกู้คืนสำเนาของฐานข้อมูลที่ฉันไม่ได้รัน DBCC SHRINKFILE บนและไม่มีปัญหาความเสียหายเมื่อทำการบีบอัดข้อมูลสำรอง

ดังนั้นเพื่อสรุปผลการทดสอบของฉันมีดังนี้:

  • การสำรองข้อมูล / คืนค่าปกติในฐานข้อมูล TDE“ ที่ถูกย่อ” นี้ทำงานอย่างถูกต้องใน SQL 2017
  • การบีบอัดข้อมูลสำรองของฐานข้อมูล“ shrunken” TDE ดูเหมือนจะทำให้เกิดความเสียหายในตาราง sys.sysmultiobjrefs
  • บีบอัดการสำรองข้อมูลของฐานข้อมูล TDE ปกติ (ไม่มีการเรียกใช้ SHRINKFILE DBCC) ทำงานอย่างถูกต้องและไม่รายงานความเสียหาย

ฉันไม่ทราบว่านี่เป็นข้อผิดพลาดที่ยืนยันแล้วใน SQL Server 2017 แต่ฉันได้ส่งการค้นพบของฉันไปยัง Microsoft เพื่อให้พวกเขาดู

ดังนั้นคุณธรรมของเรื่องนี้คือ: อย่าหดฐานข้อมูลของคุณ! เคย! :)

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