Czy można jednocześnie przywrócić serwer sql bak i zmniejszyć dziennik?

26

Mamy plik BAK od klienta, który przesłaliśmy do naszych biur programistów w celu zbadania problemu. Kopia zapasowa ma obecnie 25 GB, a przywrócona baza danych ma mniej więcej taki sam rozmiar, jednak do przywrócenia potrzebuje 100 GB. Uważam, że dzieje się tak, ponieważ baza danych jest skonfigurowana tak, aby mieć dziennik transakcji o wielkości 75 GB. Po przywróceniu bazy danych możemy zmniejszyć plik dziennika, ale czy można to zrobić w trakcie przywracania?

Adam Butler
źródło
3
Mam świadomość, że nie możesz zmienić bazy danych, dopóki nie zakończy ona przywracania.
Shawn Melton
3
Byłem w tej samej sytuacji i czekam na odpowiedź. Aby skomentować, istnieje produkt: przywracanie wirtualne SQL red-gate. Nigdy nie korzystałem z tego, ale według strony: „Zamontowana baza danych wymaga prawie zerowego dodatkowego miejsca na plik kopii zapasowej”.
StanleyJohns

Odpowiedzi:

16

Nie ma możliwości zmniejszenia kopii zapasowej w ramach procesu przywracania. Przywrócona baza danych musi wyglądać dokładnie tak jak źródłowa baza danych, z jedynym wyjątkiem, że można zmieniać litery dysków i foldery.

mrdenny
źródło
34

Istnieje hack typu „nie-nigdy-nie-rób-to-w-na-życie”, którego można użyć tam, gdzie jest mało miejsca, przywracając plik dziennika do skompresowanego folderu. Spróbuj to, kompresując istniejący folder i przywracając go, spowoduje błąd, więc musisz oszukiwać za pomocą dowiązania symbolicznego.

  1. Utwórz skompresowany folder D:\LogCompressed\
  2. Utwórz symboliczne łącze do skompresowanego folderu mklink /D /J D:\Log\ D:\LogCompressed\

  3. Przywróć bazę danych z plikiem ldf wskazującym na D:\Log\

  4. Zmniejsz plik dziennika do odpowiedniego rozmiaru

  5. Odłącz bazę danych, przenieś plik dziennika do nieskompresowanego folderu, dołącz

Jest brudny, oszukuje, nigdy nie rób tego na żywo , ale działa. Szybki test nowo utworzonej bazy danych z plikiem dziennika o wielkości 32 MB pokazuje, że po skompresowaniu zajmuje 330 KB na dysku, dekompresuje folder, a rozmiar dysku powraca do 32 MB.

Mark Storey-Smith
źródło
2
@ Mark: Ten hack działa, ale nie jest idealny. Nawet jeśli plik dziennika zajmuje znacznie mniej miejsca niż jego rzeczywisty rozmiar, nie można przywrócić bazy danych, chyba że na dysku rzeczywiście jest tyle wolnego miejsca, co rzeczywisty rozmiar bazy danych. Podczas przywracania rozmiar aktorski pliku dziennika zmniejsza się powoli od rzeczywistego rozmiaru, co jest bolesne. Jest to jednak wciąż bardzo dobry hack. Dzięki.
chenwq,
9

Uważam, że powodem, dla którego twoja kopia zapasowa jest 25 GB, a przywrócona baza danych ma 100 GB, nie wynika z dziennika transakcji. Domyślam się, że twoje pliki bazy danych mają 100 GB przydzielonego miejsca i 25 GB rzeczywistych danych w bazie danych.

Istnieje różnica między przydzielonym obszarem plików bazy danych a wykorzystanym obszarem danych . W tym przypadku pierwszy z nich ma pojemność 100 GB, a drugi 25 GB.

Thomas Stringer
źródło
1
Klient przydziela 75 GB do dziennika transakcji. Po przywróceniu aktualnie zmieniam przydział dziennika na 1 GB. Jeśli to możliwe, chciałbym przywrócić tę bazę danych na serwerze, na którym dyski mają mniej niż 100 GB wolnego miejsca. Bez konieczności przywracania na inny serwer, obetnij, wykonaj kopię zapasową i przywróć ponownie.
Adam Butler
@Adam Butler, czy można tymczasowo przywrócić na pierwszym serwerze, aby zmniejszyć rozmiary plików, a następnie wykonać kopię zapasową i przywrócić ją na serwerze docelowym?
DForck42,