DIFF dipromosikan menjadi FULL

Nov 06 2020

Kami menggunakan DatabaseBackupprosedur tersimpan Ola Hallengren untuk mencadangkan beban database SharePoint pada contoh SQL Server 2012 ke penyimpanan blob Azure. Kami telah melakukan ini cukup lama tanpa masalah. Namun, selama 6 minggu terakhir kami DIFFsdipromosikan secara acak FULLdan kami tidak dapat menemukan alasannya.

Ini adalah keluaran dari langkah agen

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*'

Jika Anda melihat URL generted, Anda akan melihat bahwa prosedurnya disimpan di direktori DIFF, tetapi membuat file cadangan LENGKAP.

https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak
                                                                        --^           --^

DatabaseBackup (Ola proc) berasal dari 2019-06-14 sehingga perlu peningkatan agar adil, tetapi telah bekerja dengan baik selama lebih dari 18 bulan.

Kami tidak memanggil kode Ola secara langsung karena kami memiliki prosedur pembungkus kecil yang membangun nama jalur virtual untuk Azure, tetapi pada dasarnya inilah cara kami memanggil kode Ola.

Ini adalah masalah karena beberapa alasan yang tidak diketahui pencadangan DIFF sedang dipromosikan menjadi LENGKAP, ini menyebabkan petabyte cadangan blob Azure, bukan gigabyte - setiap hari.

EXECUTE dbo.DatabaseBackup
    @Database = @DatabaseName,
    @URL = @BackupPath,
    @Credential = @StorageAccount,
    @BackupType = @backupType,
    @Compress = @Compression,
    @LogToTable = 'Y',
    @ChangeBackupType = 'Y',
    @Updateability = @DatabaseReadOnlyState,
    @DirectoryStructure = NULL,
    @AvailabilityGroupDirectoryStructure = NULL

Apakah Anda memiliki pemikiran tentang itu?

Jawaban

6 alroc Nov 09 2020 at 23:00

Anda mengatakan bahwa promosi backup DIFF ke FULL ini "acak" tetapi saya yakin Anda dapat menemukan hubungan antara aktivitas ini dan churn data (atau pemeliharaan indeks) dalam database itu sendiri.

Karena Anda menggunakan ChangeBackupType='Y', pekerjaan pencadangan melihat sys.dm_db_file_space_usage untuk melihat seberapa banyak database telah diubah, dan melakukan pencadangan LENGKAP jika melebihi ambang batas (saya mengalami kesulitan membedakan ambang default dari kode sumber ). Anda dapat mengubah ambang tersebut dengan menyesuaikan ModificationLevelparameternya, yaitu persentase. Dari dokumentasi

ModificationLevel
Tentukan persentase saat cadangan diferensial akan diubah menjadi cadangan penuh. Opsi ini hanya dapat digunakan bersama dengan @ChangeBackupType = 'Y'. DatabaseBackup memeriksa alokasi_extent_page_count dan modified_extent_page_count di sys.dm_db_file_space_usage untuk menghitung berapa banyak database yang telah dimodifikasi.

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

pengantar

Melihat kode Anda, tampaknya Anda sudah menggunakan @ChangeBackupTypeparameter Ola yang disediakan dalam solusi pemeliharaan SQL Server untuk prosedur tersimpan DatabaseBackup . Dokumentasi parameter ini memberikan sedikit informasi berikut:

DatabaseBackup cek differential_base_lsndi sys.master_filesuntuk menentukan apakah cadangan diferensial dapat dilakukan. Jika cadangan diferensial tidak memungkinkan, maka database akan dilewati secara default. Atau, Anda dapat menyetel ChangeBackupType ke Y agar pencadangan penuh dilakukan.

relevan ... dan ...

DatabaseBackup cek last_log_backup_lsndi sys.database_recovery_statusuntuk menentukan apakah transaksi log cadangan dalam model pemulihan penuh atau bulk-login dapat dilakukan. Jika backup log transaksi tidak memungkinkan, maka database akan dilewati secara default. Alternatifnya, Anda dapat menyetel ChangeBackupType ke Y untuk menjalankan pencadangan diferensial atau penuh.

tidak berhubungan

Referensi: DatabaseBackup (ola.hallengren.com)

Anggapan

Melihat saat Anda menggunakan parameter yang dimaksud dan dengan asumsi bahwa semua database Anda berjalan dalam model pemulihan LENGKAP, maka saya berharap skrip Ola melakukan seperti yang diperintahkan dan hanya melakukan pencadangan diferensial, seperti yang sebelumnya Anda amati ... ..

Namun

... ada sesuatu yang mengubah database SharePoint sedemikian rupa, sehingga prosedur Ola mengasumsikan bahwa database memerlukan cadangan LENGKAP. Ola memeriksa berbagai situasi, salah satunya berdasarkan parameter ....

ModificationLevel

Ada parameter tambahan @ModificationLevelyang akan mengubah cadangan DIFF menjadi cadangan LENGKAP jika parameter pertama @ChangeBackupType = 'Y'ditetapkan. Melihat kode Ola memberi kami ini:

  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

Artinya, jika parameter @ModifcationLeveldisetel ke nilai dan @ChangeBackupTypedisetel ke Y, maka prosedur pencadangan akan mengubah cadangan DIFF menjadi cadangan LENGKAP Jika jumlah halaman yang diubah memicu kasus ini .

Karena Anda belum mengaturnya @ModificationLeveltetap NULLseperti yang dapat dilihat di kode Ola:

@ModificationLevel int = NULL,

Tampaknya tidak demikian halnya dalam situasi Anda, kecuali tentu saja nilai parameter Anda @ModificationLeveltidak NULL.

Solusi 1

Dalam hal ini, kami telah menemukan pelakunya. Ubah nilai untuk @ModificationLevelkembali ke NULLdan semuanya baik-baik saja.

Alasan Lebih Lanjut untuk Konversi

Alasan lain cadangan akan berubah dari DIFFmenjadi FULLadalah karena parameter @ChangeBackupTypeitu sendiri.

Deskripsi (dari atas) ditulis sebagai:

DatabaseBackup (prosedur) cek differential_base_lsndi sys.master_filesuntuk menentukan apakah cadangan diferensial dapat dilakukan. Jika cadangan diferensial tidak memungkinkan, maka database akan dilewati secara default. Atau, Anda dapat menyetel ChangeBackupType ke Y agar pencadangan penuh dilakukan.

Memeriksa Kode

Ola menulis ini di kode:

SELECT @CurrentDifferentialBaseLSN = differential_base_lsn
FROM sys.master_files
WHERE database_id = DB_ID(@CurrentDatabaseName)
AND [type] = 0
AND [file_id] = 1

dan bagian ini di sini:

   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;

Apa artinya ini?

Menerjemahkan Kode Ola

Bunyinya seperti ini:

  1. Dapatkan nilai differntial_base_lsnuntuk database saat ini

  2. Jika jenis cadangan DIFF maka ...

    • Baca is_snapshotkolom di msdb.dbo.backupsettabel untuk database saat ini dengan @CurrentDifferentialBaseLSNdan cadangannya typeadalah D(Database backup)
    • Jika
      • @ChanageBackupType is Y` dan
      • @CurrentBackupType adalah `DIFF dan
      • @CurrentDifferentialBaseIsSnapshot aku s 1
    • Kemudian
      • Setel @CurrentBackupTypekeFULL

Di sini Anda memiliki kemungkinan situasi ...

Solusi 2

... jika database Anda dicadangkan oleh solusi pihak ketiga (CommVault, NetApp, dkk.), maka solusi pihak ketiga akan membuat cadangan database yang valid dan konsisten menggunakan layanan SQL Server VSS Writer, yang mana akan membuat catatan msdb.dbo.backupsetbahwa salinan snapshot dari database telah diambil, yang menetapkan is_snapshotparameter untuk database tersebut differntial_base_lsnyang akan menjadi dasar DIFF Anda.

Karenanya, pencadangan DIFF yang Anda coba lakukan tidak dapat lagi didasarkan pada is_snapshotpencadangan dan harus membuat cadangan LENGKAP baru lagi, untuk mengatur ulang is_snapshotdan differntial_base_lsnnilai, dan untuk membuat basis baru untuk pencadangan DIFF di masa mendatang.

Temukan Backup Lainnya

Anda harus menentukan pihak ke-3 (atau solusi cadangan lainb) yang mengganggu solusi yang Anda terapkan dan memastikan bahwa mereka ...

  1. dimodifikasi untuk hidup berdampingan
  2. diminimalkan menjadi satu solusi cadangan.