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


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)

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


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.


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.


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


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)

-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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.