DIFF dipromosikan menjadi FULL
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
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.
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_lsndisys.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_lsndisys.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_lsndisys.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:
Dapatkan nilai
differntial_base_lsnuntuk database saat iniJika jenis cadangan DIFF maka ...
- Baca
is_snapshotkolom dimsdb.dbo.backupsettabel untuk database saat ini dengan@CurrentDifferentialBaseLSNdan cadangannyatypeadalahD(Database backup) - Jika
@ChanageBackupType isY` dan@CurrentBackupTypeadalah `DIFF dan@CurrentDifferentialBaseIsSnapshotaku s1
- Kemudian
- Setel
@CurrentBackupTypekeFULL
- Setel
- Baca
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 ...
- dimodifikasi untuk hidup berdampingan
- diminimalkan menjadi satu solusi cadangan.