Bazy danych serwera SQL utknęły w stanie przywracania

79

Mam serwer Sharepoint. Wystąpił problem z naszym narzędziem do tworzenia kopii zapasowych, a teraz niektóre z moich baz danych utknęły w stanie przywracania!

Obraz przedstawiający przywracanie baz danych

Czy można zatrzymać proces przywracania? a także: Jak mogę się upewnić, że integralność bazy danych nie została naruszona?

Pooya Yazdani
źródło

Odpowiedzi:

129

Jest to prawdopodobnie spowodowane dodaniem WITH NORECOVERYparametru przez skrypt przywracania , aby baza danych była gotowa na dziennik transakcji po przywróceniu.

Baza danych oczekuje teraz na najnowszy plik dziennika transakcji.

Możesz albo:

  1. Zastosuj najnowszy dziennik transakcji , używając RESTORE LOG database_name FROM backup_device WITH RECOVERY;... lub
  2. Przywróć bazę danych ponownie, ale tym razem używając ... WITH RECOVERY;... lub
  3. Wymuś wyjście bazy danych z trybu przywracania, wykonując: RESTORE DATABASE YourDb WITH RECOVERY;

Zanim to zrobisz, upewnij się, że rozumiesz implikacje tych opcji. Jeśli nie będziesz ostrożny, możesz spowodować utratę danych.

Zobacz szczegóły:

Thomas Kejser
źródło
Gdy te nie działają, zobacz dba.stackexchange.com/questions/11175/… - ponownie, MIĘDZY OSTRZEŻENIAMI DOOM, jeśli nie wiesz, co robisz i rozumiesz pełne ryzyko utraty danych. Ale jeśli jesteś w związku z serwerem nieprodukcyjnym, masz dobre kopie zapasowe, aby wykonać nowe przywracanie i możesz sobie pozwolić na ponowne uruchomienie SQL na tym serwerze, to działa.
NateJ
6
„Wymuś wyjście bazy danych z trybu przywracania, wykonując: PRZYWRÓĆ BAZĘ DANYCH Z ODZYSKIEM”. 20 minut drapania głowy i restartowania usług, a następnie naprawione za pomocą jednej wkładki. Dzięki!
Echilon,
2
Utknąłem z tą samą sytuacją, co mój deweloper. Opcja 3 działała jak urok!
Moiz Tankiwala
Próbowałem przywrócić bazę danych DB z .bak do nowej bazy danych, ale zapomniałem zmienić nazwy plików na dysku. Przywracanie nie powiodło się, chociaż nie dlatego, że pliki były używane przez istniejącą bazę danych, ale jakiś inny błąd. To pomieszało istniejącą bazę danych (utknęło w stanie przywracania). # 3 wróć do trybu online w sekundę i sprawdzanie danych wszystko wygląda dobrze. Dzięki!
CoDEmanX
44

Prosty skrypt T-SQL do rozwiązania tego problemu:

napisz ten skrypt w oknie Nowe zapytanie i wykonaj:

RESTORE DATABASE [DataBase Name] WITH RECOVERY;
Sina
źródło
PRZYWRÓĆ BAZY DANYCH [nazwa_bazy_danych] Z ODZYSKIEM .... Działa idealnie dla mnie. Dziękuję Ci!
10
Bądź bardzo ostrożny, aby zrozumieć konsekwencje tego. Jeśli DB oczekuje na przywrócenie dziennika, co może spowodować znaczną utratę danych.
David Spillett
2
Nie działa z powodu błędu: „Nie można odzyskać bazy danych, ponieważ dziennik nie został przywrócony”.
Ian Boyd,
0

Właśnie miałem taką sytuację, a lekarstwo było dość zaskakujące:

ALTER DATABASE DBName SET ONLINE;

Najwyraźniej przywrócenie NetBackup, które złamało, sprawiło, że był w dziwnym stanie. Żadne inne rozwiązanie nie działało (chociaż nie próbowałem jeszcze zrestartować usługi SQL Server)

Będę jednak ostrożny z bazą danych, ponieważ teoretycznie po przywróceniu danych, które zakończy się niepowodzeniem, dane mogły zostać uszkodzone. W każdym razie zamierzam przywrócić bazę danych, więc nie ma to dla mnie znaczenia.

ErikE
źródło
To jest zła odpowiedź na to pytanie, jeśli spróbujesz ustawić bazę danych, która jest w trybie „Przywracania” w trybie online, pojawi się błąd „ZMIEŃ bazę danych nie jest dozwolona, ​​gdy baza danych jest w stanie przywracania”.
James Jenkins
Być może nie wiesz, jak na StackOverflow czasami odpowiadamy na pytania nieco inne niż opublikowane. Zapewnia to wartość, ponieważ ludzie często przychodzą do pytań podobnych do swoich po wyszukiwaniu w Internecie. Jeśli chodzi o twoje faktyczne roszczenie o ALTER DATABASEniedozwoleniu, zapewniam cię, że w moim przypadku baza danych faktycznie pokazywała, że ​​jest w stanie przywracania, a użycie SET ONLINEw rzeczywistości działało . Więc zdaj sobie sprawę, że nazywasz mnie błędnym lub kłamliwym. Czy to jest to, co naprawdę musisz zrobić, gdy dostępna jest alternatywa?
ErikE
@JamesJenkins A co to za alternatywa? Alternatywą jest hipoteza, że ​​baza danych może pokazać przywracanie stanu, ale w rzeczywistości nie może być przywracaniem. Lub może być na ostatnim etapie przywracania, z przywracaniem faktycznie zakończonym, tak aby można było faktycznie ustawić ONLINEstan. Tak krótko mówiąc, myślę, że twój komentarz i opinia są niezgodne z prawdą dla tej strony, a twoje informacje są w rzeczywistości niepoprawne, ponieważ nie są odpowiednio zakwalifikowane z danymi, które przedstawiłem.
ErikE
0

Jak wiemy, domyślną opcją przywracania bazy danych jest Odzyskiwanie, która zapewnia dostępność bazy danych i Online do użycia po zakończeniu przywracania bazy danych.

Przykład:

RESTORE DATABASE YourDB FROM DISK= 'C:\\Data\\YourDBBackup.bak'
WITH RECOVERY
GO

Zobaczmy ważne punkty dotyczące przywracania bez odzyskiwania

  • Baza danych nie jest użyteczna
  • Pozostaje w trybie przywracania
  • Następną sekwencję przywracania można wykonać
  • Nie wycofuje żadnych niezaangażowanych transakcji

Przywróć za pomocą NoRecovery

Ta opcja jest szczególnie przydatna w przypadku przywracania wielu kopii zapasowych. Oznacza to, że po wykonaniu polecenia przywracania z opcją norecovery oznacza to, że baza danych nie jest udostępniana użytkownikom do czasu przywrócenia ostatniej kopii zapasowej w sekwencji. W przypadku ostatniej kopii zapasowej używana jest opcja odzyskiwania i baza danych przechodzi w tryb online.

Przykład:

RESTORE DATABASE YourDB FROM DISK - 'C:\\Data\\Backup_part1.bak' 
WITH NORECOVERY
GO

I wtedy:

RESTORE LOG YourDB FROM DISK = 'C:\\Data\\BackupLog-part2.trn'
WITH RECOVERY
GO
Priyanka
źródło
1
Możesz mieć literówkę w swojej odpowiedzi. W sekcji oznaczonej ... o Przywracaniu z odzyskiwaniem wymieniono wszystkie opcje, które dotyczą tej RESTORE ...WITH NORECOVERYopcji. Czy mógłbyś to dwukrotnie sprawdzić?
hot2use,