DIFF promowane do FULLs
Używamy DatabaseBackupprocedury składowanej Oli Hallengren do tworzenia kopii zapasowych obciążenia baz danych programu SharePoint w wystąpieniu programu SQL Server 2012 w usłudze Azure Blob Storage. Robiliśmy to od dłuższego czasu bez żadnych problemów. Jednak od 6 tygodni DIFFsjesteśmy losowo awansowani na awans FULLi nie wiemy dlaczego.
To jest wynik kroku agenta
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*'
Jeśli spojrzysz na wygenerowany adres URL, zauważysz, że procedury są przechowywane w katalogu DIFF, ale tworzą PEŁNĄ kopię zapasową.
https://strorgage.blob.core.windows.net/server/instance/Database/2020/11/diff/Database_FULL_20201105_200000.bak
--^ --^
DatabaseBackup (Ola proc) pochodzi z 14.06.2019, więc aby była sprawiedliwa, wymaga aktualizacji, ale działa dobrze przez ponad 18 miesięcy.
Nie wywołujemy kodu Ola bezpośrednio, ponieważ mamy małą procedurę opakowującą, która tworzy nazwę ścieżki wirtualnej dla Azure, ale zasadniczo tak nazywamy kod Oli.
Jest to problem, który powstał z nieznanego powodu kopie zapasowe DIFF są promowane do PEŁNEGO, co powoduje, że kopie zapasowe obiektów blob platformy Azure są w petabajtach zamiast gigabajtów - każdego dnia.
EXECUTE dbo.DatabaseBackup
@Database = @DatabaseName,
@URL = @BackupPath,
@Credential = @StorageAccount,
@BackupType = @backupType,
@Compress = @Compression,
@LogToTable = 'Y',
@ChangeBackupType = 'Y',
@Updateability = @DatabaseReadOnlyState,
@DirectoryStructure = NULL,
@AvailabilityGroupDirectoryStructure = NULL
Czy masz jakieś przemyślenia na ten temat?
Odpowiedzi
Mówisz, że ta promocja DIFF na PEŁNE kopie zapasowe jest „losowa”, ale założę się, że możesz znaleźć związek między tym działaniem a zmianą danych (lub utrzymaniem indeksu) w samej bazie danych.
Ponieważ używasz ChangeBackupType='Y', zadanie tworzenia kopii zapasowej sprawdza sys.dm_db_file_space_usage, aby zobaczyć, jaka część bazy danych została zmieniona i wykonuje PEŁNĄ kopię zapasową, jeśli przekracza próg (mam trudności z odróżnieniem domyślnego progu na podstawie kodu źródłowego ). Możesz zmienić ten próg, dostosowując ModificationLevelparametr, który jest wartością procentową. Z dokumentacji
ModificationLevel
Określ procent, w jakim różnicowa kopia zapasowa zostanie zmieniona na pełną kopię zapasową. Ta opcja może być używana tylko razem z @ChangeBackupType = 'Y'. DatabaseBackup sprawdza numer strony_tekstowej_tekstowej_konto i numer_strony_tekstowej_zmodyfikowanej w sys.dm_db_file_space_usage, aby obliczyć, jaka część bazy danych została zmodyfikowana.
Wprowadzenie
Patrząc na Twój kod, wydaje się, że używasz już @ChangeBackupTypeparametru podanego przez Ola w jego rozwiązaniu SQL Server Maintenance dla procedury składowanej DatabaseBackup . Dokumentacja tego parametru zawiera następujące informacje:
DatabaseBackup kontrole
differential_base_lsnwsys.master_filescelu ustalenia, czy różnicowa kopia zapasowa może być wykonana. Jeśli różnicowa kopia zapasowa nie jest możliwa, baza danych jest domyślnie pomijana. Alternatywnie możesz ustawić ChangeBackupType na Y, aby zamiast tego wykonać pełną kopię zapasową.
istotne ... i ...
DatabaseBackup kontrole
last_log_backup_lsnwsys.database_recovery_statuscelu ustalenia, czy kopia zapasowa dziennika transakcji w całości lub rejestrowane zbiorczej model odzyskiwanie może być wykonana. Jeśli kopia zapasowa dziennika transakcji nie jest możliwa, baza danych jest domyślnie pomijana. Alternatywnie możesz ustawić ChangeBackupType na Y, aby zamiast tego wykonać różnicową lub pełną kopię zapasową.
nieistotne
Źródła : DatabaseBackup (ola.hallengren.com)
Założenie
Widząc, że używasz omawianego parametru i zakładając, że wszystkie twoje bazy danych działają w modelu PEŁNEGO odzyskiwania, spodziewałbym się, że skrypty Oli zrobią to, co im powiedziano i po prostu wykonają różnicową kopię zapasową, tak jak wcześniej obserwowałeś ... ..
jednak
... coś zmienia bazy danych SharePoint w taki sposób, że procedura Oli zakłada, że baza danych wymaga PEŁNEGO backupu. Ola sprawdza różne sytuacje, z których jedna bazuje na parametrze ....
ModificationLevel
Istnieje dodatkowy parametr @ModificationLevel, który przekształciłby kopię zapasową DIFF w PEŁNĄ kopię zapasową, jeśli @ChangeBackupType = 'Y'zostanie ustawiony pierwszy parametr . Spojrzenie na kod Oli daje nam to:
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
Oznacza to, że jeśli parametr @ModifcationLeveljest ustawiony na wartość i @ChangeBackupTypejest ustawiony na Y, procedura tworzenia kopii zapasowej przekształci kopię zapasową DIFF w PEŁNĄ kopię zapasową, jeśli liczba zmienionych stron wyzwoli sprawę .
Ponieważ nie ustawiłeś @ModificationLevel, pozostaje NULLtak, jak widać w kodzie Oli:
@ModificationLevel int = NULL,
Wydaje się, że tak nie jest w twojej sytuacji, chyba że oczywiście wartość twojego parametru dla @ModificationLevelnie jest NULL.
Rozwiązanie 1
W takim przypadku znaleźliśmy winowajcę. Zmień wartość z @ModificationLevelpowrotem na NULLi wszystko jest w porządku.
Dalsze powody nawrócenia
Innym powodem zmiany kopii zapasowej z DIFFna FULLjest @ChangeBackupTypesam parametr .
Opis (z góry) został napisany jako:
DatabaseBackup (procedura) kontrole
differential_base_lsnwsys.master_filescelu ustalenia, czy różnicowa kopia zapasowa może być wykonana. Jeśli różnicowa kopia zapasowa nie jest możliwa, baza danych jest domyślnie pomijana. Alternatywnie możesz ustawić ChangeBackupType na Y, aby zamiast tego wykonać pełną kopię zapasową.
Sprawdzanie kodu
Ola napisała w kodzie to:
SELECT @CurrentDifferentialBaseLSN = differential_base_lsn FROM sys.master_files WHERE database_id = DB_ID(@CurrentDatabaseName) AND [type] = 0 AND [file_id] = 1
a ta część tutaj:
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;
Co to znaczy?
Tłumaczenie kodu Oli
Cóż, brzmi trochę tak:
Uzyskaj wartość
differntial_base_lsndla bieżącej bazy danychJeśli typ kopii zapasowej to DIFF, to ...
- Odczytaj
is_snapshotkolumnę wmsdb.dbo.backupsettabeli dla bieżącej bazy danych z,@CurrentDifferentialBaseLSNa kopia zapasowatypetoD(Kopia zapasowa bazy danych) - Jeśli
@ChanageBackupType isY` i@CurrentBackupTypejest `DIFF i@CurrentDifferentialBaseIsSnapshotjest1
- Następnie
- Ustaw
@CurrentBackupTypenaFULL
- Ustaw
- Odczytaj
Tutaj masz możliwą sytuację ...
Rozwiązanie 2
... jeśli kopia zapasowa bazy danych została utworzona przez rozwiązanie innej firmy (CommVault, NetApp i in.), to rozwiązanie innej firmy utworzy prawidłową i spójną kopię zapasową bazy danych za pomocą usługi SQL Server VSS Writer, która zwróci uwagę w tym, msdb.dbo.backupsetże została wykonana migawka bazy danych, co ustawia is_snapshotparametr dla tej bazy danych dla danego, na differntial_base_lsnktórym będzie oparty twój DIFF.
Z powodu tej kopii zapasowej diff próbujesz wykonać nie może być oparta na is_snapshottworzenie kopii zapasowych i musi stworzyć nową pełną kopię zapasową ponownie, aby zresetować is_snapshoti na differntial_base_lsnwartości, i utworzyć nową bazę dla tworzenia kopii zapasowych przyszłość Diff.
Znajdź inną kopię zapasową
Będziesz musiał określić, która firma zewnętrzna (lub inne rozwiązanie do tworzenia kopii zapasowychb) ingeruje w Twoje wdrożone rozwiązanie i upewnić się, że są one albo ...
- zmodyfikowane, aby współistnieć
- zminimalizowane do jednego rozwiązania do tworzenia kopii zapasowych.