DIFF promowane do FULLs

Nov 06 2020

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

6 alroc Nov 09 2020 at 23:00

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.

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

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_lsnw sys.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_lsnw sys.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_lsnw sys.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:

  1. Uzyskaj wartość differntial_base_lsndla bieżącej bazy danych

  2. Jeśli typ kopii zapasowej to DIFF, to ...

    • Odczytaj is_snapshotkolumnę w msdb.dbo.backupsettabeli dla bieżącej bazy danych z, @CurrentDifferentialBaseLSNa kopia zapasowa typeto D(Kopia zapasowa bazy danych)
    • Jeśli
      • @ChanageBackupType is Y` i
      • @CurrentBackupType jest `DIFF i
      • @CurrentDifferentialBaseIsSnapshot jest 1
    • Następnie
      • Ustaw @CurrentBackupTypenaFULL

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 ...

  1. zmodyfikowane, aby współistnieć
  2. zminimalizowane do jednego rozwiązania do tworzenia kopii zapasowych.