Nie można wykonać kopii lustrzanej bazy danych SQL Server 2012

11

Podczas próby dublowania bazy danych za pomocą następującego polecenia

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

Pojawia się następujący błąd

Msg 1475, poziom 16, stan 105, wiersz 1
Baza danych „test0916aj8CJ” może zawierać masowo zarejestrowane zmiany, których nie utworzono kopii zapasowej. Wykonaj kopię zapasową dziennika w głównej bazie danych lub podstawowej bazie danych. Następnie przywróć tę kopię zapasową albo w lustrzanej bazie danych, aby włączyć dublowanie bazy danych, albo w każdej dodatkowej bazie danych, aby umożliwić dołączenie do grupy dostępności.

Czy można to zrobić bez tworzenia kopii zapasowej bazy danych? Czy powinienem wykonać kopię zapasową, a następnie odrzucić kopię zapasową. To jest dla nowo utworzonej bazy danych, więc i tak nie potrzebuję w tym momencie kopii zapasowej.

Próbowałem następujące ...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = Ntest-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO

ale powyższa metoda też nie działała.

Dzięki

Rachunek
źródło
Kilka rzeczy ... W rzeczywistości nie tworzysz kopii lustrzanej za pomocą tego polecenia, ale dodajesz bazę danych do grupy dostępności. Co powoduje, że pytam o konfigurację AG, w jakim trybie odzyskiwania znajdują się twoje bazy danych i dlaczego, aby rozwiązać problem z logiem, wykonujesz kopię zapasową COPY_ONLY, która pozostawia nienaruszony dziennik, co nie jest tym, co określa błąd ? Wydaje mi się, że brakuje ci kilku kroków lub jesteś bardzo zdezorientowany co do tego, co próbujesz zrobić.
Steve Mangiameli

Odpowiedzi:

15

Łatwo jest naprawić błąd, który masz

  • Utwórz bazę danych w trybie pełnego odzyskiwania na Podstawowym.
  • Utwórz bazę danych w trybie pełnego odzyskiwania w Secondary.
  • Uruchom GUI i spróbuj skonfigurować dublowanie między podstawowym a dodatkowym.

Poniżej znajduje się błąd, który otrzymasz:

Baza danych „test_mirroring_kin” może zawierać masowo zarejestrowane zmiany, których nie utworzono kopii zapasowej. Wykonaj kopię zapasową dziennika w głównej bazie danych lub podstawowej bazie danych. Następnie przywróć tę kopię zapasową albo w lustrzanej bazie danych, aby włączyć dublowanie bazy danych, albo w każdej dodatkowej bazie danych, aby umożliwić dołączenie do grupy dostępności. (Microsoft SQL Server, błąd: 1475)

wprowadź opis zdjęcia tutaj

Pozwala zrozumieć, czym jest ten błąd:

Skonfigurowałeś bazę danych w trybie odzyskiwania PEŁNYM i myślisz, że baza danych jest rzeczywiście w trybie odzyskiwania PEŁNYM.

Powyższe nie jest prawdą. Po utworzeniu bazy danych, jeśli nie wykonasz PEŁNEJ kopii zapasowej, nawet jeśli baza danych jest w trybie odzyskiwania PEŁNEGO, jest w trybie odzyskiwania pseudo-PROSTEGO

Możesz to łatwo zweryfikować za pomocą dbcc dbinfo-> dbi_dbbackupLSNposiadającego wartość 0:0:0(0x00000000:00000000:0000)lub używając skryptu Paula Randala

dbcc traceon (3604)
go
dbcc dbinfo('test_mirroring_kin') with tableresults
go
dbcc traceoff (3604)

wprowadź opis zdjęcia tutaj

Edycja: Nawet wykonanie pierwszej pełnej kopii zapasowej z COPY_ONLYopcją nie ustanawia również łańcucha kopii zapasowych

backup database test_mirroring_kin
to disk = 'D:\test_mirroring_kin_FULL.bak'
with init, stats=10, COPY_ONLY

dbcc dbinfo-> dbi_dbbackupLSNnadal ma wartość 0:0:0(0x00000000:00000000:0000). Oznacza to, że baza danych nadal znajduje się w pseudo-prostym trybie odzyskiwania.

Co musisz zrobić, aby rozwiązać powyższy błąd?

Musisz wykonać pełną kopię zapasową + jedną kopię dziennika transakcji na podstawowej, a następnie przywrócić ją na dodatkowej bazie danych, with norecoverya następnie dołączyć do bazy danych w grupie AG lub Mirroring.

Na marginesie i dla kompletności, dla twojego skryptu backup to NUL, przeczytaj ten post na blogu autorstwa Gail Shaw.

Kin Shah
źródło
5

Dlaczego TO DISK = N’NUL’?

Nie rozumiem, dlaczego używasz TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

Jeśli to zrobisz, kopia zapasowa zostanie zapisana w NUL(tj. = Nigdzie / nic) i nie będzie można jej użyć, ponieważ jej plik nie istnieje.

Chociaż NULmoże być również używany jako miejsce docelowe kopii zapasowych LOG, nie należy go również używać, szczególnie na serwerach Prod, ponieważ dzienniki zostaną utracone, a łańcuch kopii zapasowych zostanie zerwany. (~ podobny do a SHRINKFILE)

Kopia zapasowa dziennika

Przed dodaniem bazy danych do grupy należy ją przygotować. Aby przygotować pomocniczą bazę danych, należy wykonać i przywrócić co najmniej 1 kopię zapasową dziennika transakcji. Serwer lustrzany używa go do ustalenia, które transakcje zostały już zsynchronizowane na dodatkowej bazie danych, a które transakcje nie są jeszcze zsynchronizowane z podstawową bazą danych.

Dlatego należy wykonać kopię zapasową dzienników transakcji na podstawowej bazie danych:

BACKUP LOG [test0916aj8CJ] TO  DISK = N'....bak' 
WITH  COPY_ONLY, FORMAT, INIT,  NAME = N'test0916aj8CJ-Transaction Log  Backup', STATS = 10

COPY_ONLYOpcja musi być używany. Zapewnia to, że dzienniki nie są obcinane na końcu kopii zapasowej dziennika.

Główny łańcuch kopii zapasowych DB

Nie można jednak przywrócić samej kopii zapasowej dziennika, tzn. Bez łańcucha kopii zapasowych (patrz także odpowiedź Kin). Oznacza to, że kopia zapasowa dziennika transakcji musi zostać wykonana po wykonaniu kopii zapasowej PEŁNEJ bazy danych (w razie potrzeby opcjonalnej funkcji różnicowej).

Ponieważ COPY_ONLYopcja nie przerywa łańcucha kopii zapasowych, nie tworzy również łańcucha kopii zapasowych. COPY_ONLYOpcja nie może być używany do kopii zapasowej bazy danych.

Kopie zapasowe w kolejności:

  • PEŁNA kopia zapasowa bazy danych bez COPY_ONLYopcji
  • Opcjonalna kopia zapasowa różnicowa
  • 1 kopia zapasowa dziennika z COPY_ONLYopcją
  • kolejna (lub więcej) kopia zapasowa dziennika, jeśli to konieczne ...

Przywróć pomocniczą bazę danych

Następnie należy przywrócić kopię zapasową bazy danych (+ Różnicowy) na urządzeniu pomocniczym.

Musi zostać przywrócona z NORECOVERYopcją, ponieważ chcesz również przywrócić kopię zapasową dziennika po przywróceniu PEŁNEJ kopii zapasowej.

Na koniec przywrócisz kopię zapasową dziennika. Nadal musisz skorzystać z tej NORECOVERYopcji, ponieważ kopia lustrzana będzie przywracać transakcje po założeniu.

  • Przywróć PEŁNĄ kopię zapasową z NORECOVERYopcją
  • Przywróć kopię zapasową DIFF z NORECOVERYopcją
  • Przywróć wszystkie kopie zapasowe dziennika w kolejności z NORECOVERYopcją

Zbierzmy to wszystko razem (dostosuj do swojej env)

  • Na podstawowym serwerze uruchom:

    USE master
    Go
    BACKUP DATABASE [test0916aj8CJ] TO DISK = N'....bak'
    WITH FORMAT, INIT, NAME = N'test0916aj8CJ-Full Database Backup', STATS = 10
    GO
    BACKUP LOG [test0916aj8CJ] TO DISK = N'....bak' 
    WITH COPY_ONLY, FORMAT, INIT, NAME = N'test0916aj8CJ-Transaction Log Backup', STATS = 10
    GO
  • Na serwerze pomocniczym uruchom:

    USE master
    Go
    RESTORE DATABASE [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
    GO
    RESTORE LOG [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
  • Następnie możesz przystąpić do dodawania nowej dodatkowej bazy danych do grupy dostępności ...

Działania opcjonalne

  • Lepiej ustawić opcję DYSK na folder współdzielony, który jest dostępny zarówno z serwera głównego, jak i pomocniczego.
  • Lepiej jest również przechowywać pliki DB na podobnym dysku i lokalizacji zarówno na serwerze głównym, jak i pomocniczym.
Julien Vavasseur
źródło