Jakie jest polecenie obcięcia pliku dziennika programu SQL Server?

192

Muszę opróżnić plik LDF przed wysłaniem do kolegi. Jak zmusić program SQL Server do obcinania dziennika?

Aidan Ryan
źródło

Odpowiedzi:

131

jeśli dobrze pamiętam ... w analizatorze zapytań lub równoważnym:

BACKUP LOG  databasename  WITH TRUNCATE_ONLY

DBCC SHRINKFILE (  databasename_Log, 1)
ila
źródło
2
Jest to zdecydowanie lepsze niż ustawienie modelu odzyskiwania bazy danych na SIMPLE (jak w odpowiedzi Blorgbearda), ponieważ jeśli twój model odzyskiwania jest PEŁNY, musisz ustawić go w ten sposób z jakiegoś powodu.
Scott Whitlock,
52
truncate_only jest przestarzałe w SQL Server 2008, więc musisz przełączyć db na proste odzyskiwanie msdn.microsoft.com/en-us/library/ms143729(SQL.90).aspx
Justin Moore
10
W przypadku SQL Server 2012 działa to, ale bez WITH TRUNCATE_ONLY.
net_prog
4
Dodając do tego, co powiedział net_prog, dla SQL Server 2012 zastąpiłem pierwszą linię BACKUP LOG DatabaseNameHere TO DISK='NUL:'.
Aaron Newton
„TRUNCATE_ONLY” nie jest rozpoznawaną opcją BACKUP. (SQL Server 2019 RC1)
Tomasz Gandor
304

W studio zarządzania:

  • Nie rób tego w środowisku na żywo, ale aby mieć pewność, że zmniejszysz db db jak najwięcej:
    • Kliknij bazę danych prawym przyciskiem myszy, wybierz Properties, a następnie Options.
    • Upewnij się, że „Model odzyskiwania” jest ustawiony na „Prosty”, a nie „Pełny”
    • Kliknij OK
  • Kliknij ponownie bazę danych prawym przyciskiem myszy, wybierz Tasks-> Shrink->Files
  • Zmień typ pliku na „Log”
  • Kliknij OK.

Alternatywnie, SQL, aby to zrobić:

 ALTER DATABASE mydatabase SET RECOVERY SIMPLE
 DBCC SHRINKFILE (mydatabase_Log, 1)

Patrz: http://msdn.microsoft.com/en-us/library/ms189493.aspx

Blorgbeard wyszedł
źródło
1
Twoja odpowiedź właśnie uratowała mi dzień! Nie wiedziałem o opcji „kliknij prawym przyciskiem myszy - Zadania -> Zmniejsz”. Dziękuję Ci!
René
7
Co robisz w środowisku na żywo? Najpierw wykonać kopię zapasową dzienników?
John Bubriski
1
Nie jestem DBA, ale tak, wierzę, że wykonanie kopii zapasowej dziennika ją obetnie: technet.microsoft.com/en-us/library/ms179478.aspx
Blorgbeard jest niedostępny
2
@JohnBubriski Jeśli używasz modelu odzyskiwania innego niż prosty, dzienniki są podstawą do odzyskiwania danych lub wycofywania transakcji. W produkcji musisz najpierw wykonać kopię zapasową tych dzienników, aby zmniejszyć pliki dziennika. W przeciwnym razie nie byłoby rzeczywistej możliwości odzyskania. Niestety, jeśli jesteś w sytuacji odzyskiwania, będziesz musiał ponownie załadować wszystkie kopie zapasowe dziennika transakcji, aby w pełni odzyskać bazę danych. Czasy zabawy, dla pewności! :)
definiuje
1
w SQL Server 2012 musiałem to zrobić use mydatabaseprzed uruchomieniemdbcc shrinkfile
knb
62

W przypadku SQL Server 2008 polecenie to:

ALTER DATABASE ExampleDB SET RECOVERY SIMPLE
DBCC SHRINKFILE('ExampleDB_log', 0, TRUNCATEONLY)
ALTER DATABASE ExampleDB SET RECOVERY FULL

Spowodowało to zmniejszenie mojego pliku dziennika 14 GB do 1 MB.

Nathan R.
źródło
5
Ponieważ pytanie jest niejednoznaczne, która wersja i zaakceptowana odpowiedź nie dotyczy SQL Server 2008, odpowiedź ta jest nadal ważna niezależnie od wieku.
James Law
Dzięki, pomogło mi to zmniejszyć duży plik dziennika, który nie zareagował na DBCC SHRINKFILE
Christian Navelot,
6
Nie zapomnij zmienić modelu odzyskiwania z powrotem na FULL, gdy skończysz!
Dan Bechard
Należy wykonać kopię zapasową przed zrobieniem tego (lub jakiejkolwiek innej opcji obcięcia). Jeśli wykonasz pełną kopię zapasową i zaznaczysz opcję „Kopiuj tylko kopię zapasową” w SSMS, nie będziesz już potrzebować dziennika. (To tylko kopia zapasowa punktu w czasie).
Simon_Weaver
37

W przypadku SQL 2008 można wykonać kopię zapasową dziennika na nulurządzenie:

BACKUP LOG [databaseName]
TO DISK = 'nul:' WITH STATS = 10

A następnie użyj DBCC SHRINKFILEdo obcięcia pliku dziennika.

Matej
źródło
2
To jedyny, który skończył działać w mojej sytuacji ...
Wystąpił
Uwaga: może to zająć sporo czasu, nawet na dyskach SSD (musi przeczytać dziennik, aby móc go odrzucić). W przypadku pliku dziennika o wielkości 30 GB na maszynie wirtualnej platformy Azure o umiarkowanym zasilaniu 40% zajmuje 10 minut. Pamiętaj, aby przejść do „Wiadomości” w SSMS, aby zobaczyć procent przetworzony.
Simon_Weaver,
3

dziennik kopii zapasowej nazwa dziennika z truncate_only, po którym następuje komenda dbinkfile dbcc

SQLMenace
źródło
0

Ponieważ odpowiedź dla mnie została pochowana w komentarzach. W SQL Server 2012 i nowszych wersjach możesz użyć:

BACKUP LOG Database TO DISK='NUL:'
DBCC SHRINKFILE (Database_Log, 1)
rip747
źródło
-5

Inną opcją jest odłączenie bazy danych za pośrednictwem Management Studio. Następnie wystarczy usunąć plik dziennika lub zmienić jego nazwę i usunąć później.

Z powrotem w Management Studio ponownie dołącz bazę danych. W oknie dołączania usuń plik dziennika z listy plików.

Baza danych dołącza i tworzy nowy pusty plik dziennika. Po sprawdzeniu, że wszystko jest w porządku, możesz usunąć plik dziennika o zmienionej nazwie.

Prawdopodobnie nie powinieneś tego używać w produkcyjnych bazach danych.

Rask
źródło
4
Nigdy tego nie rób! W dzienniku mogą znajdować się dane, które nie zostały jeszcze zatwierdzone w pliku danych. Utraciłbyś takie dane.
Paul
Jeśli w swojej odpowiedzi ostrzegasz, aby nie wypróbowywać go w produkcji, nie warto go w ogóle publikować.
Stan Shaw
9
Nie zgadzam się z downvoters - jest to opcja. Administratorzy muszą tylko zrozumieć ich scenariusz. Na przykład - nie będzie żadnych „nieprzydzielonych” danych, jeśli nie będzie otwartych transakcji.
Gerard ONeill
3
To jedyne rozwiązanie, które działało dla mnie. Mój dysk był zapełniony i nie mogłem wykonać kopii zapasowej ani się skurczyć i nic innego nie działało. Dziękuję Ci!
Brian
3
Zgadzam się; nie jest to najlepsza praktyka, ale jest cennym narzędziem, które można mieć, jeśli nie masz innych opcji, takich jak scenariusz Briana.
ScottFoster1000,