Dlaczego różnicowa kopia zapasowa nie może określić swojej bazy?

18

To jest mój pierwszy post DBA.SE, więc proszę o poinformowanie mnie o wszelkich błędach, dzięki!

Jestem nowym DBA (nie informatykiem, po prostu nikt inny w firmie tego nie robi), więc im bardziej podstawowe wyjaśnienie, tym lepiej. Czytałem o strategiach tworzenia kopii zapasowych baz danych (lub, jak nauczyłem się je nazywać, „strategiach przywracania”). Rozumiem, co robią kopie zapasowe dziennika pełnego, różnicowego i dziennika transakcji, ale chcę wiedzieć, dlaczego różnicowa kopia zapasowa może być oparta tylko na najnowszej pełnej kopii zapasowej.

Jeśli różnicowa kopia zapasowa to wszystko, co zmieniło się od czasu ostatniej pełnej kopii zapasowej, to dlaczego różnicowanie nie może być oparte na żadnej wybranej przeze mnie kopii zapasowej? Aby być bardziej zrozumiałym, pytam o określenie bazy podczas tworzenia kopii zapasowej , a nie podczas przywracania. Zakładam, że podczas przywracania wybrałbyś prawidłową bazę i odpowiedni mechanizm różnicowy, aby wykonać przywracanie (nie używając mechanizmu różnicowego wykonanego z bazy B do przywracania z bazy A).

Jaki jest powód, który uniemożliwia tę funkcjonalność? Myślę, że musi być jakiś powód, po prostu nie wiem co to jest.

Uwaga: Rozumiem, że nie można określić podstawy, ale moje pytanie brzmi: dlaczego nie ? (Nie jestem również zainteresowany dyskusją na temat „dlaczego miałbyś?”)

Analogia

Oto analogia do tego, jak rozumiem różnicową kopię zapasową:

Mam plik Excel z niektórymi danymi w komórkach.

Pierwszego dnia robię kopię tego pliku i przechowuję go w innym miejscu („pełna kopia zapasowa”).

W dniu 2 patrzę na plik i porównuję go z kopią zapasową, którą wykonałem w dniu 1, i odnotowuję wszystkie zmienione komórki oraz ich nowe wartości („różnicowa kopia zapasowa”). Nie odnotowuję każdej zmiany dokonanej w komórce, a jedynie jej ostatecznej wartości. Gdyby komórka A1 zaczynała się jako „Alfred”, zmieniła się na „Betty”, „Charlie”, a następnie „Dave”, chciałbym tylko zauważyć, że „A1 to teraz Dave”.

W dniu 3 ponownie porównuję bieżący plik z plikiem kopii zapasowej i odnotowuję zmiany (kolejna „różnicowa kopia zapasowa” z tą samą bazą co dzień 2). Ponownie, odnotowując tylko końcowe wartości na komórkę w obserwowanym czasie, nie wszystkie wartości, które komórka występowała przez cały dzień.

W dniu 4 ponownie porównuję i ponownie odnotowuję zmiany. Kontynuując z komórką A1, teraz mówi „Sarah”, nawet jeśli w ciągu dnia było 10 innych imion, a wszystko, co zauważam, to „Teraz A1 to Sarah”.

Piątego dnia mój plik się popsuł; więc patrzę na kopię zapasową, którą wykonałem w dniu 1, a następnie w stanach końcowych zanotowałem w dniu 4, i stosuję zmiany zanotowane w kopii zapasowej, a teraz mam plik „przywrócony” do stanu z dnia 4 Tak więc patrzę na kopię zapasową wykonaną pierwszego dnia, widzę, że w czwartym dniu komórka A1 zakończyła się jako „Sarah” i zmieniam komórkę zapasową A1 na „Sarah”.

Dlaczego miałoby to mieć znaczenie, jeśli wykonałem kolejną kopię zapasową („pełną”) pliku w dniu 2? Dlaczego nadal nie byłoby możliwe porównanie (odczytanie, „różnicowa kopia zapasowa”) pliku w dniu 3 lub 4 z kopią wykonaną w dniu 1? Jak rozumiem, SQL Server wymagałby ode mnie porównania (podczas wykonywania innej różnicowej kopii zapasowej) z pełną kopią zapasową wykonaną w dniu 2 (jeśli taka została utworzona) - żadna inna opcja.

elmer007
źródło

Odpowiedzi:

14

Różnicowa kopia zapasowa używa tak zwanej mapy zmian różnicowych do utworzenia listy stron zmodyfikowanych od czasu ostatniej pełnej kopii zapasowej. Ta lista jest listą „różnicową”, stąd nazwa typu kopii zapasowej i powód, dla którego kopię zapasową można przywrócić tylko nad powiązaną pełną kopią zapasową.

Wykonanie pełnej kopii zapasowej resetuje mapę zmian różnicowych. Od tego momentu każda zmodyfikowana strona jest zapisywana na mapie. Jeśli następnie zastosujesz różnicę, ta kopia zapasowa zawiera tylko strony, które zostały zmodyfikowane od czasu ostatniej pełnej kopii zapasowej i zapisane na mapie.

Analogicznie dwie pełne kopie zapasowe, które służą jako podstawa dla całego procesu przywracania, prawdopodobnie miałyby inną zawartość, a zatem różne mapy różnicowe. Jeśli przywrócisz różnicę na podstawie pierwszej kopii zapasowej nad drugą kopią zapasową, baza danych prawdopodobnie zostanie uszkodzona. W rzeczywistości SQL Server zapobiega przywróceniu kopii zapasowej różnic na czymkolwiek oprócz oryginalnej pełnej kopii zapasowej, na której jest oparty.

Gdy poprosisz SQL Server o zrobienie różnicowej kopii zapasowej, jedyną „podstawą” różnicowania jest mapa pojedynczej zmiany różnicowej obecna w bazie danych w momencie uruchamiania różnicowej kopii zapasowej. Dlatego nie można określić podstawy różnicowej kopii zapasowej.


W odpowiedzi na komentarz @MartinSmith - możesz użyć COPY_ONLYkopii zapasowych, aby przywrócić różnicową kopię zapasową w przypadku wielu pełnych kopii zapasowych. Rozważ następujący scenariusz:

  1. BACKUP DATABASE xyz TO DISK = 'path_to_backup.bak';
  2. BACKUP DATABASE xyz TO DISK = 'path_to_backup_2.bak' WITH COPY_ONLY;
  3. BACKUP DATABASE xyz TO DISK = 'path_to_backup_3.bak' WITH COPY_ONLY;
  4. BACKUP DATABASE xyz TO DISK = 'path_to_backup_4.bak' WITH COPY_ONLY;
  5. BACKUP DATABASE xyz TO DISK = 'path_to_backup_diff.bak' WITH DIFFERENTIAL;

Różnicową kopię zapasową w kroku 5 należy odtworzyć na dowolnej kopii zapasowej wykonanej w krokach od 1 do 4, ponieważ mapa zmiany różnicowej jest usuwana tylko wtedy, gdy nastąpi pełna kopia zapasowa w kroku 1. Te COPY_ONLYkopie zapasowe w krokach 2, 3 i 4, nie nie zresetować mapę zmian. Ponieważ mapa zmian różnicowych gromadzi zmiany wprowadzone od czasu pełnej kopii zapasowej, każda kolejna kopia zapasowa COPY_ONLYzawiera wystarczającą ilość informacji, aby różnicowa kopia zapasowa mogła działać z którąkolwiek z 4 poprzednich kopii zapasowych.

Chociaż wydaje się, że powinno to działać, w praktyce przywrócenie mechanizmu różnicowego ponad kopię zapasową copy_only powoduje następujący błąd:

Msg 3136, poziom 16, stan 1, wiersz 1
Nie można przywrócić różnicowej kopii zapasowej, ponieważ baza danych nie została przywrócona do prawidłowego wcześniejszego stanu.
Msg 3013, poziom 16, stan 1, wiersz 1
PRZYWRÓĆ BAZY DANYCH kończy się nienormalnie.

Utworzyłem repozytorium platformy SQL Server 2012 do testowania przywracania różnic i kopiowania tylko i zapisałem plik na gist.github.com - OSTRZEŻENIE skrypt usunie bazę danych o nazwie RestoreTestjako pierwszy krok.

Max Vernon
źródło
Wykonanie pełnej kopii zapasowej resetuje mapę zmian różnicowych tylko wtedy, gdy nie jest COPY_ONLY- Jeśli OP COPY_ONLYmiałby wykonać regularną pełną kopię zapasową w dniu 1 i pełną kopię w dniu 2, to jakie problemy byłyby spowodowane przez zastosowanie późniejszej różnicy z tej samej bazy do kopii zapasowej dnia 2?
Martin Smith
Właśnie go przetestowałem iw praktyce nie pozwala on na przywrócenie późniejszego mechanizmu różnicowego na copy_only, chociaż „Nie można przywrócić tej różnicowej kopii zapasowej, ponieważ baza danych nie została przywrócona do prawidłowego wcześniejszego stanu”. - Nie jestem pewien, czy istnieje jakiś powód, dla którego to nie działałoby lub po prostu nie zostało zaimplementowane.
Martin Smith
1
@MartinSmith - shooot. Też to potwierdziłem.
Max Vernon
5

Funkcja, którą chcesz, może istnieć w zasadzie. Nie byłoby wydajne z obecnymi strukturami bazy danych (patrz odpowiedź Maxa Vernona). SQL Server musiałby albo utrzymywać zestaw map różnic lub porównać bieżącą zawartość bazy danych z pełną kopią zapasową, którą określisz jako bazę.

Istnieją aplikacje, które deduplikują duże pliki. Możesz wykonać dwie pełne kopie zapasowe i tylko zmienione dane zostaną faktycznie zapisane. To jest jak różnica z niestandardową bazą. exdupena przykład może to zrobić.

Zaletą jest to, że w ogóle działa z dowolnym zestawem plików kopii zapasowych. W rzeczywistości, począwszy od trzeciego pełnego pliku kopii zapasowej, zapłacisz tylko za przyrostowe (nie różnicowe) wykorzystanie miejsca. Wykorzystanie miejsca jest różnicą w stosunku do poprzedniego pliku kopii zapasowej (nie pierwszego). Pamięć do deduplikacji działa podobnie.

Dlaczego opisywana funkcja nie istnieje? Każda funkcja zużywa budżet, przez co inne funkcje nie są obecne. Ten najwyraźniej nie zrobił wystarczająco daleko na liście priorytetów. Nie jestem pewien, do czego by to było dobre. Wygląda na dość ezoteryczny wymóg korzystania z niestandardowych baz.

usr
źródło
3

Nie myl kopii zapasowych dziennika transakcji z różnicowymi kopiami zapasowymi, mają one różne cele! To, co nazywacie „różnicową kopią zapasową”, w której „zauważacie wszystkie zmiany w komórkach”, jest w rzeczywistości a dziennikiem transakcji .

Różnicowa kopia zapasowa ma na celu utrzymanie małego rozmiaru wynikowego pliku kopii zapasowej tylko poprzez rejestrowanie informacji, które zmieniły się od czasu ostatniej pełnej kopii zapasowej, oraz utrzymanie czasu przywracania w ramach celu czasu odzyskiwania (RTO).

Kopia zapasowa dziennika transakcji ma na celu umożliwienie odtworzenia transakcji w dowolnym momencie - często, ale niekoniecznie, w celu „najnowszego, co się wydarzy”.

To, o czym mówisz, jest w rzeczywistości możliwe - ale musisz przywrócić pełną kopię zapasową, a następnie przywrócić dzienniki transakcji.

Jeśli masz pełną kopię zapasową z pierwszego dnia i wszystkie kopie zapasowe dziennika transakcji od 1 do 5 dnia, nic nie stoi na przeszkodzie, aby przywrócić kopię zapasową z pierwszego dnia i odtworzyć dziennik transakcji, dopóki nie uzyskasz danych w takim stanie, jak w dniu 4. można również rozpocząć od kopii zapasowej z 2 dnia, którą przywrócenie byłoby nieco szybsze, ponieważ odtwarzano by mniej transakcji. Możesz także przywrócić pełną kopię zapasową pierwszego dnia, różnicową kopię zapasową trzeciego dnia, a następnie przywrócić dzienniki transakcji do 4 dnia.

Edycja: OK, edytowana przez ciebie analogia ma trochę więcej sensu. Odpowiedź brzmi: „ponieważ możesz już osiągnąć to, co chcesz dzięki kopiom zapasowym dziennika transakcji”. Różnicowa kopia zapasowa jest jedynie tanim i wygodnym sposobem rejestrowania całej gamy aktywności dziennika transakcji. Nie oferuje żadnej szczegółowości odzyskiwania danych, której nie oferuje kopia zapasowa dziennika transakcji. Jest tylko tyle funkcji, które oferują „zwykłą wygodę”, które sprawiają, że jest to produkt.

dpw
źródło
Chyba źle sformułowałem tę analogię,
czekam
Edytowane dla twojej nowej analogii.
dpw
1

Analogia do Excela polega na porównywaniu jabłek i pomarańczy. Dlaczego ? Excel nie jest bazą danych, ponieważ nie ma integralności danych. Excel jest ładną aplikacją do arkuszy kalkulacyjnych i może stanowić uzupełnienie bazy danych.

SQL Server to system relacyjnych baz danych, który pozwala przechowywać wszystkie dane i zapewnia mechanizm ich wyszukiwania. Ważną częścią jest „relacyjny”, ponieważ ważna jest relacja danych wraz z integralnością danych (właściwości ACID).

Podstawy:

Dane w bazie danych są zorganizowane w logiczne komponenty (tabele, widoki, procy, wyzwalacze itp.), Które są widoczne dla użytkownika. Baza danych jest co najmniej fizycznie implementowana jako dwa (dane i plik dziennika) lub więcej (wtórny plik danych) na dysku.

  • Baza danych zawiera stronę, która jest podstawową jednostką przechowywania danych używaną do przechowywania rekordów .
  • Strona bazy danych to fragment pliku danych bazy danych o wielkości 8192 bajtów (8 KB).
  • 8 fizycznie sąsiadujących stron (8 * 8 KB = 64 KB) w pliku bazy danych stanowi zakres .
  • Strona IAM (mapa alokacji indeksu) śledzi około 4 GB miejsca w jednym pliku, wyrównanym do granicy 4 GB. Te 4 GB fragmenty nazywane są interwałami GAM .

dlaczego różnicowa kopia zapasowa może być oparta tylko na najnowszej pełnej kopii zapasowej. - lub - Jeśli różnicowa kopia zapasowa to wszystko, co zmieniło się od czasu ostatniej pełnej kopii zapasowej, to dlaczego różnicowanie nie może być oparte na żadnej wybranej przeze mnie kopii zapasowej?

W oparciu o twoją analogię do programu Excel, robisz to, co zmieniłeś w stosunku do poprzedniej. Dotyczy to wszystkich zatwierdzonych transakcji z dziennika transakcji with STOP AT(uwaga: w dniu 5 plik jest pomieszany, a ty zatrzymujesz się w dniu 4)

W każdej sekcji 4 GB (zwanej interwałem GAM) każdego pliku danych znajduje się specjalna strona bazy danych zwana różnicową bitmapą, która śledzi, które części (zwane zakresami) tej sekcji 4 GB zmieniły się od czasu ostatniej pełnej kopii zapasowej, wskazując dane, które uległy zmianie lub został dodany do bazy danych.

Różnicowa kopia zapasowa skanuje te mapy bitowe i tworzy jedynie kopie plików danych, które są oznaczone jako zmienione. Mapy bitowe są resetowane przez następną pełną kopię zapasową (stąd różnicowa kopia zapasowa może być oparta tylko na najnowszej pełnej kopii zapasowej) , dzięki czemu można zauważyć, że wraz ze wzrostem liczby zmian w bazie danych, więcej zostanie zaznaczonych w różnicowych mapach bitowych a kolejne różnicowe kopie zapasowe będą coraz większe.

Możesz nawet użyć tego skryptu, aby dowiedzieć się, ile bazy danych zmieniło się od czasu ostatniej pełnej kopii zapasowej? .

Informacje o bazie różnicowej są przechowywane w masterbazie danych - sys.database_filelub ( sys.master_files- przydatne, gdy baza danych jest tylko do odczytu lub offline).

Istnieją 3 ważne kolumny, które przechowują informacje związane z bazą różnicową .

  • Jest differential_base_lsnto podstawa różnicowych kopii zapasowych. Zakresy danych, które zostaną zmienione po, differential_base_lsnzostaną uwzględnione w różnicowej kopii zapasowej.
  • Jest differential_base_guidto unikalny identyfikator podstawowej kopii zapasowej, na której opiera się różnicowa kopia zapasowa.
  • Jest differential_base_timeto czas, który odpowiadadifferential_base_lsn

Różnicowa kopia zapasowa jest przydatna, aby przyspieszyć RTO (czas odzyskiwania celu = czas potrzebny do odzyskania bazy danych), w przeciwieństwie do częstszych pełnych kopii zapasowych, które będą problemem dla dużych baz danych lub przywracania dużej liczby kopii dzienników transakcji, ponieważ mogą one wzrosnąć z biegiem czasu.

Uwaga: Pełna kopia zapasowa COPY_ONLY nie resetuje bazy różnicowej, więc kopia zapasowa COPY_ONLY nie może służyć jako baza różnicowa.

Bibliografia :

Kin Shah
źródło
2
@PaulSRandal napisał Strony istnieją do przechowywania rekordów. na swoim blogu, więc odniosłem się do niego w niezmienionej formie. Przyjmowanie logicznego odniesienia to, co mówisz (na podstawie odniesienia) jest również prawdą!
Kin Shah,