DIFFs เลื่อนระดับเป็น FULL

Nov 06 2020

เราใช้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

คุณมีความคิดเกี่ยวกับเรื่องนี้หรือไม่?

คำตอบ

6 alroc Nov 09 2020 at 23:00

คุณบอกว่าการส่งเสริมการสำรองข้อมูล 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 เพื่อคำนวณจำนวนฐานข้อมูลที่ถูกแก้ไข

3 JohnK.N. Nov 10 2020 at 00:32

บทนำ

เมื่อดูรหัสของคุณดูเหมือนว่าคุณกำลังใช้@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

มันอ่านแบบนี้:

  1. รับค่าของdifferntial_base_lsnฐานข้อมูลปัจจุบัน

  2. หากประเภทการสำรองข้อมูลเป็น DIFF แล้ว ...

    • อ่านis_snapshotคอลัมน์ในmsdb.dbo.backupsetตารางสำหรับฐานข้อมูลปัจจุบันด้วย@CurrentDifferentialBaseLSNและการสำรองข้อมูลtypeคือD(การสำรองฐานข้อมูล)
    • ถ้า
      • @ChanageBackupType is Y` และ
      • @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) ใดที่แทรกแซงการแก้ปัญหาที่นำมาใช้ของคุณและตรวจสอบให้แน่ใจว่า ...

  1. แก้ไขเพื่ออยู่ร่วมกัน
  2. ย่อขนาดให้เหลือเพียงโซลูชันสำรองข้อมูลเดียว