DIFFs เลื่อนระดับเป็น FULL
เราใช้DatabaseBackupขั้นตอนการจัดเก็บของ Ola Hallengren เพื่อสำรองข้อมูลฐานข้อมูล SharePoint บนอินสแตนซ์ SQL Server 2012 ลงในที่เก็บข้อมูล Azure Blob เราดำเนินการมาระยะหนึ่งแล้วโดยไม่มีปัญหาใด ๆ อย่างไรก็ตามในช่วง 6 สัปดาห์ที่ผ่านมาเราDIFFsสุ่มได้รับการเลื่อนระดับFULLและเราไม่สามารถหาสาเหตุได้
นี่คือผลลัพธ์จากขั้นตอนตัวแทน
BACKUP DATABASE [Database] TO URL = N'https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak' WITH NO_CHECKSUM, COMPRESSION, CREDENTIAL = N'*storeageaccountname*'
หากคุณดู URL ที่สร้างขึ้นคุณจะทราบว่าโพรซีเดอร์ถูกจัดเก็บไว้ในไดเร็กทอรี DIFF แต่สร้างไฟล์สำรองข้อมูลแบบเต็ม
https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak
--^ --^
DatabaseBackup (Ola proc) มาจากวันที่ 2019-06-14 ดังนั้นจึงจำเป็นต้องมีการอัปเกรดเพื่อให้มีความยุติธรรม แต่ก็ใช้งานได้ดีมานานกว่า 18 เดือน
เราไม่ได้เรียกรหัส Ola โดยตรงเนื่องจากเรามีขั้นตอนการห่อเล็ก ๆ ซึ่งสร้างชื่อพา ธ เสมือนสำหรับ Azure แต่โดยพื้นฐานแล้วนี่คือวิธีที่เราเรียกรหัสของ Ola
นี่เป็นปัญหาที่เกิดจากสาเหตุที่ไม่ทราบสาเหตุการสำรองข้อมูล DIFF ได้รับการเลื่อนระดับเป็น FULL ทำให้เกิดการสำรองข้อมูล Azure blob จำนวนเพตะไบต์แทนที่จะเป็นกิกะไบต์ - ในแต่ละวัน
EXECUTE dbo.DatabaseBackup
@Database = @DatabaseName,
@URL = @BackupPath,
@Credential = @StorageAccount,
@BackupType = @backupType,
@Compress = @Compression,
@LogToTable = 'Y',
@ChangeBackupType = 'Y',
@Updateability = @DatabaseReadOnlyState,
@DirectoryStructure = NULL,
@AvailabilityGroupDirectoryStructure = NULL
คุณมีความคิดเกี่ยวกับเรื่องนี้หรือไม่?
คำตอบ
คุณบอกว่าการส่งเสริมการสำรองข้อมูล DIFF เป็นแบบเต็มนี้เป็นแบบ "สุ่ม" แต่ฉันอยากเดิมพันว่าคุณจะพบการเชื่อมต่อระหว่างกิจกรรมนี้กับการปั่นข้อมูล (หรือการบำรุงรักษาดัชนี) ในฐานข้อมูลเอง
เนื่องจากคุณกำลังใช้ChangeBackupType='Y'งานการสำรองข้อมูลจึงดูที่sys.dm_db_file_space_usageเพื่อดูว่าฐานข้อมูลมีการเปลี่ยนแปลงมากน้อยเพียงใดและทำการสำรองข้อมูลแบบเต็มหากเกินเกณฑ์ (ฉันมีปัญหาในการแยกแยะเกณฑ์เริ่มต้นจากซอร์สโค้ด ). คุณสามารถเปลี่ยนขีด จำกัด นั้นได้โดยการปรับModificationLevelพารามิเตอร์ซึ่งเป็นเปอร์เซ็นต์ จากเอกสารประกอบ
ModificationLevel
ระบุเปอร์เซ็นต์เมื่อการสำรองข้อมูลส่วนต่างจะถูกเปลี่ยนเป็นการสำรองข้อมูลทั้งหมด ตัวเลือกนี้สามารถใช้ร่วมกับ @ChangeBackupType = 'Y' เท่านั้น DatabaseBackup จะตรวจสอบการจัดสรร_extent_page_countและ modified_extent_page_count ใน sys.dm_db_file_space_usage เพื่อคำนวณจำนวนฐานข้อมูลที่ถูกแก้ไข
บทนำ
เมื่อดูรหัสของคุณดูเหมือนว่าคุณกำลังใช้@ChangeBackupTypeพารามิเตอร์ Ola ที่ให้ไว้ในโซลูชันการบำรุงรักษาเซิร์ฟเวอร์ SQLของเขาสำหรับขั้นตอนการจัดเก็บDatabaseBackup เอกสารประกอบของพารามิเตอร์นี้ให้ข้อมูลบิตต่อไปนี้:
ตรวจสอบ DatabaseBackup
differential_base_lsnในsys.master_filesการตรวจสอบว่าการสำรองข้อมูลที่แตกต่างกันสามารถทำได้ หากไม่สามารถสำรองข้อมูลส่วนต่างได้ฐานข้อมูลจะถูกข้ามไปโดยค่าเริ่มต้น หรือคุณสามารถตั้งค่า ChangeBackupType เป็น Y เพื่อทำการสำรองข้อมูลทั้งหมดแทน
เกี่ยวข้อง ... และ ...
ตรวจสอบ DatabaseBackup
last_log_backup_lsnในsys.database_recovery_statusการตรวจสอบว่าการสำรองข้อมูลล็อกธุรกรรมในรูปแบบการกู้คืนเต็มหรือเป็นกลุ่มเข้าสู่ระบบสามารถดำเนินการได้ หากไม่สามารถสำรองข้อมูลบันทึกธุรกรรมได้ฐานข้อมูลจะถูกข้ามไปโดยค่าเริ่มต้น หรือคุณสามารถตั้งค่า ChangeBackupType เป็น Y เพื่อให้ทำการสำรองข้อมูลส่วนต่างหรือสำรองทั้งหมดแทน
ไม่เกี่ยวข้อง
อ้างอิง: DatabaseBackup (ola.hallengren.com)
อัสสัมชัญ
เห็นในขณะที่คุณใช้พารามิเตอร์ที่เป็นปัญหาและสมมติว่าฐานข้อมูลของคุณทั้งหมดทำงานในรูปแบบการกู้คืนแบบเต็มดังนั้นฉันคาดว่าสคริปต์ของ Ola จะทำตามที่ได้รับแจ้งและทำการสำรองข้อมูลที่แตกต่างกันเช่นที่คุณเคยสังเกต ... ..
อย่างไรก็ตาม
... มีบางอย่างกำลังเปลี่ยนแปลงฐานข้อมูล SharePoint ในลักษณะดังกล่าวขั้นตอนของ Ola ถือว่าฐานข้อมูลต้องการการสำรองข้อมูลแบบเต็ม Ola ตรวจสอบสถานการณ์ต่างๆซึ่งหนึ่งในนั้นขึ้นอยู่กับพารามิเตอร์ ....
การปรับเปลี่ยนระดับ
มีพารามิเตอร์เพิ่มเติม@ModificationLevelที่จะแปลงการสำรองข้อมูล DIFF เป็นการสำรองข้อมูลแบบเต็มหาก@ChangeBackupType = 'Y'ตั้งค่าพารามิเตอร์แรก การดูรหัสของ Ola ทำให้เรามีสิ่งนี้:
IF @ModificationLevel IS NOT NULL AND @BackupType <> 'DIFF'
BEGIN
INSERT INTO @Errors ([Message], Severity, [State])
SELECT 'The value for the parameter @ModificationLevel is not supported.', 16, 3
END
นั่นหมายความว่าถ้าพารามิเตอร์@ModifcationLevelจะถูกตั้งค่าและ@ChangeBackupTypeมีการตั้งค่าYแล้วขั้นตอนการสำรองข้อมูลจะแปลงสำรอง DIFF เพื่อการสำรองข้อมูลทั้งหมดหากจำนวนเงินของหน้าเว็บที่มีการเปลี่ยนแปลงในกรณีที่ทริกเกอร์
เนื่องจากคุณยังไม่ได้ตั้งค่า@ModificationLevelดังNULLที่เห็นได้จากรหัสของ Ola:
@ModificationLevel int = NULL,
ดูเหมือนว่าจะไม่เป็นเช่นนั้นในสถานการณ์ของคุณเว้นแต่ค่าพารามิเตอร์ของคุณ@ModificationLevelจะไม่NULLแน่นอน
โซลูชันที่ 1
ซึ่งในกรณีนี้เราพบผู้กระทำผิดแล้ว เปลี่ยนค่าสำหรับ@ModificationLevelกลับไปNULLและทุกอย่างเรียบร้อยดี
เหตุผลเพิ่มเติมสำหรับการเปลี่ยนใจเลื่อมใส
เหตุผลการสำรองข้อมูลจะเปลี่ยนจากที่อื่นDIFFจะFULLเป็นพารามิเตอร์@ChangeBackupTypeตัวเอง
คำอธิบาย (จากด้านบน) เขียนว่า:
DatabaseBackup (ขั้นตอน) การตรวจสอบ
differential_base_lsnในsys.master_filesการตรวจสอบว่าการสำรองข้อมูลที่แตกต่างกันสามารถทำได้ หากไม่สามารถสำรองข้อมูลส่วนต่างได้ฐานข้อมูลจะถูกข้ามไปโดยค่าเริ่มต้น หรือคุณสามารถตั้งค่า ChangeBackupType เป็น Y เพื่อทำการสำรองข้อมูลทั้งหมดแทน
Chekcing the Code
Ola เขียนสิ่งนี้ในรหัส:
SELECT @CurrentDifferentialBaseLSN = differential_base_lsn FROM sys.master_files WHERE database_id = DB_ID(@CurrentDatabaseName) AND [type] = 0 AND [file_id] = 1
และส่วนนี้ที่นี่:
IF @CurrentBackupType = 'DIFF' BEGIN SELECT @CurrentDifferentialBaseIsSnapshot = is_snapshot FROM msdb.dbo.backupset WHERE database_name = @CurrentDatabaseName AND [type] = 'D' AND checkpoint_lsn = @CurrentDifferentialBaseLSN END IF @ChangeBackupType = 'Y' BEGIN IF @CurrentBackupType = 'DIFF' AND @CurrentDifferentialBaseIsSnapshot = 1 BEGIN SET @CurrentBackupType = 'FULL' END END;
สิ่งนี้หมายความว่า?
การแปลรหัสของ Ola
มันอ่านแบบนี้:
รับค่าของ
differntial_base_lsnฐานข้อมูลปัจจุบันหากประเภทการสำรองข้อมูลเป็น DIFF แล้ว ...
- อ่าน
is_snapshotคอลัมน์ในmsdb.dbo.backupsetตารางสำหรับฐานข้อมูลปัจจุบันด้วย@CurrentDifferentialBaseLSNและการสำรองข้อมูลtypeคือD(การสำรองฐานข้อมูล) - ถ้า
@ChanageBackupType isY` และ@CurrentBackupTypeคือ `DIFF และ@CurrentDifferentialBaseIsSnapshotคือ1
- แล้ว
- ตั้งค่า
@CurrentBackupTypeเป็นFULL
- ตั้งค่า
- อ่าน
ที่นี่คุณมีสถานการณ์ที่เป็นไปได้ ...
โซลูชันที่ 2
... หากฐานข้อมูลของคุณได้รับการสำรองข้อมูลโดยโซลูชันของบุคคลที่สาม (CommVault, NetApp และอื่น ๆ ) ดังนั้นโซลูชันของบุคคลที่สามจะสร้างการสำรองฐานข้อมูลที่ถูกต้องและสอดคล้องกันโดยใช้บริการ SQL Server VSS Writer จะจดบันทึกmsdb.dbo.backupsetว่ามีการถ่ายสำเนาสแนปชอตของฐานข้อมูลซึ่งตั้งis_snapshotค่าพารามิเตอร์สำหรับฐานข้อมูลนั้นตามdifferntial_base_lsnที่ DIFF ของคุณกำหนด
ด้วยเหตุนี้การสำรองข้อมูล DIFF ที่คุณพยายามดำเนินการจึงไม่สามารถใช้การis_snapshotสำรองข้อมูลได้อีกต่อไปและต้องสร้างการสำรองข้อมูลแบบเต็มใหม่อีกครั้งเพื่อรีเซ็ตค่าis_snapshotและdifferntial_base_lsnค่าและสร้างฐานใหม่สำหรับการสำรองข้อมูล DIFF ในอนาคต
ค้นหาการสำรองข้อมูลอื่น ๆ
คุณจะต้องพิจารณาว่าบุคคลที่สาม (หรือโซลูชันสำรองอื่น ๆ b) ใดที่แทรกแซงการแก้ปัญหาที่นำมาใช้ของคุณและตรวจสอบให้แน่ใจว่า ...
- แก้ไขเพื่ออยู่ร่วมกัน
- ย่อขนาดให้เหลือเพียงโซลูชันสำรองข้อมูลเดียว