Wie löscht man das SQL Server-Transaktionsprotokoll?


577

Ich bin kein SQL-Experte und werde jedes Mal daran erinnert, wenn ich etwas tun muss, das über die Grundlagen hinausgeht. Ich habe eine Testdatenbank, die nicht groß ist, aber das Transaktionsprotokoll ist es definitiv. Wie lösche ich das Transaktionsprotokoll?



3
In Managment Studio sollte ein Befehl vorhanden sein: "Click to Shrink Log" und Sie sind fertig.
Frenchie

Antworten:


749

Das Verkleinern einer Protokolldatei sollte wirklich für Szenarien reserviert werden, in denen unerwartetes Wachstum aufgetreten ist, von dem Sie nicht erwarten, dass es erneut auftritt. Wenn die Protokolldatei wieder auf die gleiche Größe anwächst, wird durch vorübergehendes Verkleinern nicht viel erreicht. Abhängig von den Wiederherstellungszielen Ihrer Datenbank sollten Sie diese Maßnahmen ergreifen.

Erstellen Sie zunächst eine vollständige Sicherung

Nehmen Sie niemals Änderungen an Ihrer Datenbank vor, ohne sicherzustellen, dass Sie sie wiederherstellen können, falls etwas schief geht.

Wenn Sie sich für die Wiederherstellung zu einem bestimmten Zeitpunkt interessieren

(Und mit der Wiederherstellung zu einem bestimmten Zeitpunkt ist es Ihnen wichtig, dass Sie alles andere als eine vollständige oder differenzielle Sicherung wiederherstellen können.)

Vermutlich befindet sich Ihre Datenbank im FULLWiederherstellungsmodus. Wenn nicht, stellen Sie sicher, dass es sich um Folgendes handelt:

ALTER DATABASE testdb SET RECOVERY FULL;

Selbst wenn Sie regelmäßig vollständige Sicherungen durchführen, wächst und wächst die Protokolldatei, bis Sie eine Protokollsicherung durchführen. Dies dient Ihrem Schutz, um nicht unnötig Speicherplatz zu verbrauchen. Sie sollten diese Protokollsicherungen entsprechend Ihren Wiederherstellungszielen ziemlich häufig durchführen. Wenn Sie beispielsweise eine Geschäftsregel haben, die besagt, dass Sie es sich leisten können, im Katastrophenfall nicht mehr als 15 Minuten Daten zu verlieren, sollten Sie einen Job haben, der das Protokoll alle 15 Minuten sichert. Hier ist ein Skript, das Dateinamen mit Zeitstempel basierend auf der aktuellen Zeit generiert (aber Sie können dies auch mit Wartungsplänen usw. tun, wählen Sie einfach keine der Verkleinerungsoptionen in Wartungsplänen aus, sie sind schrecklich).

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

Beachten Sie, dass \\backup_share\sich dieser Computer auf einem anderen Computer befinden sollte, der ein anderes zugrunde liegendes Speichergerät darstellt. Das Sichern dieser Daten auf demselben Computer (oder auf einem anderen Computer, der dieselben zugrunde liegenden Festplatten verwendet, oder auf einer anderen VM, die sich auf demselben physischen Host befindet) hilft Ihnen nicht wirklich, da Sie Ihre Datenbank verloren haben, wenn der Computer in die Luft sprengt und seine Backups. Abhängig von Ihrer Netzwerkinfrastruktur ist es möglicherweise sinnvoller, lokal zu sichern und diese dann hinter den Kulissen an einen anderen Ort zu übertragen. In beiden Fällen möchten Sie sie so schnell wie möglich vom primären Datenbankcomputer entfernen.

Sobald Sie regelmäßige Protokollsicherungen ausgeführt haben, sollte es sinnvoll sein, die Protokolldatei auf einen vernünftigeren Wert zu verkleinern, als dies bisher der Fall war. Dies bedeutet nicht, dass SHRINKFILEdie Protokolldatei immer wieder ausgeführt wird, bis sie 1 MB groß ist. Selbst wenn Sie das Protokoll häufig sichern, muss die Summe aller gleichzeitig auftretenden Transaktionen berücksichtigt werden. Autogrow-Ereignisse für Protokolldateien sind teuer, da SQL Server die Dateien auf Null setzen muss (im Gegensatz zu Datendateien, wenn die sofortige Dateiinitialisierung aktiviert ist) und Benutzertransaktionen warten müssen, während dies geschieht. Sie möchten diese Grow-Shrink-Grow-Shrink-Routine so wenig wie möglich ausführen, und Sie möchten Ihre Benutzer auf keinen Fall dafür bezahlen lassen.

Beachten Sie, dass Sie das Protokoll möglicherweise zweimal sichern müssen, bevor ein Verkleinern möglich ist (danke Robert).

Sie müssen also eine praktische Größe für Ihre Protokolldatei festlegen. Niemand hier kann Ihnen sagen, was das ist, ohne viel mehr über Ihr System zu wissen, aber wenn Sie die Protokolldatei häufig verkleinert haben und sie wieder gewachsen ist, ist ein gutes Wasserzeichen wahrscheinlich 10-50% höher als das größte, das es war . Angenommen, das sind 200 MB, und Sie möchten, dass alle nachfolgenden Autogrowth-Ereignisse 50 MB betragen. Dann können Sie die Größe der Protokolldatei folgendermaßen anpassen:

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

Beachten Sie, dass Sie möglicherweise zuerst Folgendes ausführen müssen, wenn die Protokolldatei derzeit> 200 MB ist:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO

Wenn Sie sich nicht für die Wiederherstellung zu einem bestimmten Zeitpunkt interessieren

Wenn es sich um eine Testdatenbank handelt und Sie sich nicht für die Wiederherstellung zu einem bestimmten Zeitpunkt interessieren, sollten Sie sicherstellen, dass sich Ihre Datenbank im SIMPLEWiederherstellungsmodus befindet.

ALTER DATABASE testdb SET RECOVERY SIMPLE;

Wenn Sie die Datenbank in den SIMPLEWiederherstellungsmodus versetzen, wird sichergestellt, dass SQL Server Teile der Protokolldatei wiederverwendet (im Wesentlichen inaktive Transaktionen auslaufen lässt), anstatt zu wachsen, um alle Transaktionen aufzuzeichnen (wie dies bei der FULLWiederherstellung der Fall ist, bis Sie das Protokoll sichern). CHECKPOINTEreignisse helfen dabei, das Protokoll zu steuern und sicherzustellen, dass es nicht wachsen muss, es sei denn, Sie generieren eine Menge T-Log-Aktivitäten zwischen CHECKPOINTs.

Als nächstes sollten Sie unbedingt sicherstellen, dass dieses Protokollwachstum tatsächlich auf ein abnormales Ereignis (z. B. einen jährlichen Frühjahrsputz oder die Neuerstellung Ihrer größten Indizes) und nicht auf den normalen täglichen Gebrauch zurückzuführen ist. Was haben Sie gewonnen, wenn Sie die Protokolldatei auf eine lächerlich kleine Größe verkleinert haben und SQL Server sie nur erneut vergrößern muss, um Ihrer normalen Aktivität gerecht zu werden? Konnten Sie den Speicherplatz nutzen, den Sie nur vorübergehend freigegeben haben? Wenn Sie eine sofortige Lösung benötigen, können Sie Folgendes ausführen:

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO

Andernfalls stellen Sie eine geeignete Größe und Wachstumsrate ein. Gemäß dem Beispiel im Fall der Wiederherstellung zu einem bestimmten Zeitpunkt können Sie denselben Code und dieselbe Logik verwenden, um die geeignete Dateigröße zu bestimmen und angemessene Parameter für das automatische Wachstum festzulegen.

Einige Dinge, die Sie nicht tun möchten

  • Sichern Sie das Protokoll mit TRUNCATE_ONLYOption und dannSHRINKFILE . Zum einen ist diese TRUNCATE_ONLYOption veraltet und in aktuellen Versionen von SQL Server nicht mehr verfügbar. Zweitens, wenn Sie sich im FULLWiederherstellungsmodell befinden, wird Ihre Protokollkette zerstört und eine neue, vollständige Sicherung erforderlich.

  • Trennen Sie die Datenbank, löschen Sie die Protokolldatei und hängen Sie sie erneut an . Ich kann nicht betonen, wie gefährlich das sein kann. Ihre Datenbank wird möglicherweise nicht wiederhergestellt, sie wird möglicherweise als verdächtig angezeigt, Sie müssen möglicherweise auf eine Sicherung zurückgreifen (falls vorhanden) usw. usw.

  • Verwenden Sie die Option "Datenbank verkleinern" . DBCC SHRINKDATABASEund die Wartungsplanoption, um dasselbe zu tun, sind schlechte Ideen, insbesondere wenn Sie wirklich nur ein Protokollproblem lösen müssen. Richten Sie die Datei, die Sie anpassen möchten, gezielt aus und passen Sie sie mithilfe von DBCC SHRINKFILEoder ALTER DATABASE ... MODIFY FILE(Beispiele oben) unabhängig an .

  • Verkleinern Sie die Protokolldatei auf 1 MB . Das sieht verlockend aus, denn mit SQL Server kann ich es in bestimmten Szenarien tun und mir den gesamten freien Speicherplatz ansehen! Wenn Ihre Datenbank nicht schreibgeschützt ist (und Sie sollten sie als solche markieren ALTER DATABASE), führt dies absolut nur zu vielen unnötigen Wachstumsereignissen, da das Protokoll aktuelle Transaktionen unabhängig vom Wiederherstellungsmodell berücksichtigen muss. Was bringt es, diesen Speicherplatz vorübergehend freizugeben, damit SQL Server ihn langsam und schmerzhaft zurücknehmen kann?

  • Erstellen Sie eine zweite Protokolldatei . Dies entlastet vorübergehend das Laufwerk, das Ihre Festplatte gefüllt hat. Dies entspricht jedoch dem Versuch, eine durchstochene Lunge mit einem Pflaster zu reparieren. Sie sollten sich direkt mit der problematischen Protokolldatei befassen, anstatt nur ein weiteres potenzielles Problem hinzuzufügen. Abgesehen davon, dass eine Transaktionsprotokollaktivität auf ein anderes Laufwerk umgeleitet wird, hat eine zweite Protokolldatei (im Gegensatz zu einer zweiten Datendatei) wirklich nichts für Sie zu tun, da immer nur eine der Dateien gleichzeitig verwendet werden kann. Paul Randal erklärt auch, warum mehrere Protokolldateien Sie später beißen können .

Sei proaktiv

Anstatt Ihre Protokolldatei auf eine kleine Menge zu verkleinern und sie ständig mit einer kleinen Geschwindigkeit automatisch wachsen zu lassen, stellen Sie sie auf eine relativ große Größe ein (eine, die die Summe Ihrer größten Anzahl gleichzeitiger Transaktionen berücksichtigt) und legen Sie eine angemessene automatische Zunahme fest Einstellung als Fallback, damit es nicht mehrmals wachsen muss, um einzelne Transaktionen zu erfüllen, und dass es relativ selten vorkommt, dass es während des normalen Geschäftsbetriebs jemals wachsen muss.

Die schlechtesten Einstellungen sind hier 1 MB Wachstum oder 10% Wachstum. Komischerweise sind dies die Standardeinstellungen für SQL Server (über die ich mich beschwert und vergeblich um Änderungen gebeten habe ) - 1 MB für Datendateien und 10% für Protokolldateien. Ersteres ist heutzutage viel zu klein, und letzteres führt jedes Mal zu immer längeren Ereignissen (z. B. Ihre Protokolldatei ist 500 MB groß, das erste Wachstum beträgt 50 MB, das nächste Wachstum beträgt 55 MB, das nächste Wachstum beträgt 60,5 MB usw. usw. - und bei langsamer E / A, glauben Sie mir, Sie werden diese Kurve wirklich bemerken.

Weiterführende Literatur

Bitte hör hier nicht auf; Während viele der Ratschläge, die Sie dort draußen zum Verkleinern von Protokolldateien sehen, von Natur aus schlecht und sogar potenziell katastrophal sind, gibt es einige Leute, denen die Datenintegrität wichtiger ist als die Freigabe von Speicherplatz.

Ein Blog-Beitrag, den ich 2009 geschrieben habe, als ich einige Beiträge zum Thema "So verkleinern Sie die Protokolldatei" gesehen habe .

Ein Blog-Beitrag, den Brent Ozar vor vier Jahren schrieb und auf mehrere Ressourcen hinwies, als Antwort auf einen Artikel im SQL Server Magazine, der nicht hätte veröffentlicht werden dürfen .

Ein Blog-Beitrag von Paul Randal, in dem erklärt wird, warum die Wartung von T-Logs wichtig ist und warum Sie Ihre Datendateien auch nicht verkleinern sollten .

Mike Walsh hat eine großartige Antwort, die auch einige dieser Aspekte abdeckt, einschließlich der Gründe, warum Sie Ihre Protokolldatei möglicherweise nicht sofort verkleinern können .


5
Die Wiederherstellung zu einem bestimmten Zeitpunkt ist nicht der einzige Grund, das vollständige Wiederherstellungsmodell zu verwenden. Der Hauptgrund ist, Datenverlust zu verhindern. Ihr Potenzial für Datenverlust ist die Länge zwischen den Sicherungen. Wenn Sie nur eine tägliche Sicherung durchführen, besteht ein Datenverlust von 24 Stunden. Wenn Sie dann jede halbe Stunde Protokollsicherungen hinzufügen, beträgt das Risiko eines Datenverlusts 30 Minuten. Darüber hinaus sind Protokollsicherungen erforderlich, um jede Art von schrittweiser Wiederherstellung durchzuführen (z. B. zur Wiederherstellung nach Beschädigung).
Robert L Davis

9
Abgesehen davon ist dies die vollständigste und korrekteste Antwort auf dieser Seite.
Robert L Davis

11
Ich möchte auch hinzufügen, dass das Löschen des Protokolls durch Sichern des Protokolls (bei vollständiger oder massenprotokollierter Wiederherstellung) oder eines Prüfpunkts (bei einfacher Wiederherstellung) erfolgt. Wenn Sie sich jedoch in einer Situation befinden, in der Sie die Protokolldatei verkleinern müssen, reicht dies nicht aus. Sie müssen veranlassen, dass die aktuell aktive VLF zum Anfang der Protokolldatei zurückkehrt. Sie können dies in SQL 2008 und höher erzwingen, indem Sie zwei Protokollsicherungen oder Prüfpunkte hintereinander ausgeben. Der erste löscht es und der zweite schaltet es zum Anfang der Datei zurück.
Robert L Davis

2
@Doug_Ivison, da zu jedem Zeitpunkt Protokolldatensätze gelöscht werden könnten. Was wäre der Sinn, wenn Sie ein unvollständiges Protokoll sichern könnten? Bei der einfachen Wiederherstellung wird das Protokoll nur verwendet, um Rollbacks von Transaktionen zu ermöglichen. Sobald eine Transaktion festgeschrieben oder zurückgesetzt wurde, kann sie in der nächsten Sekunde aus dem Protokoll entfernt werden.
Aaron Bertrand

3
@zinczinc Ok, danke für dein Feedback. Das Problem, das ich sehe, wenn ich die Antwort zuerst und die Erklärung später stelle, ist, dass sie niemals die wichtigen Teile lesen werden. Der Vortrag, mit dem ich den Leser ertrinke, ist tatsächlich weitaus wichtiger als die Antwort am Ende, und meiner Meinung nach ist der Hintergrund, den ich zur Verfügung stelle, ziemlich wichtig, um diese Entscheidungen zu treffen. Aber hey, wenn Sie eine einzeilige Antwort einreichen möchten, weil Sie der Meinung sind, dass dies für das OP besser ist, können Sie diesen Teil meiner Antwort verwenden, um eine bessere zu erstellen, von der wir alle lernen können.
Aaron Bertrand

200
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1]) 


USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

Von: DBCC SHRINKFILE (Transact-SQL)

Möglicherweise möchten Sie zuerst eine Sicherungskopie erstellen.


danke Maimonides, es ist aus den Dokumenten, also würde ich sagen, es ist das Beste: P vor allem, weil es nicht von mir erfunden wurde :)
Rui Lima

1
Danach hat sich meine Protokollgröße nicht ein wenig geändert. habe ich etwas falsch gemacht?
Chester89

1
Dieser Ansatz setzt den Wiederherstellungstyp auf "FULL", auch wenn der Wiederherstellungstyp zuvor etwas anderes war
Vil

1
Arbeitete wie Magie! Beachten Sie, dass der Name der Protokolldatei tatsächlich der logische Name ist (der in db-> properties-> files zu finden ist)
Bizhan

2
Ich würde eine BACKUP DATABASE-Klausel in dieses Skript aufnehmen, damit niemand diesen Teil vergisst. Ich sage das, weil ich vor einigen Jahren eine Datenbank auf einer Festplatte verkleinert habe, auf der zu wenig freier Speicherplatz vorhanden ist. Beim Verkleinern wurden die Dateien größer und ein Out of Space-Fehler wurde ausgelöst. Ergebnis: Ich habe die Datenbank verloren. Zum Glück war eine Protokolldatenbank, die an Toleranz verloren hatte.
Cesar

185

HAFTUNGSAUSSCHLUSS: Bitte lesen Sie die folgenden Kommentare sorgfältig durch, und ich gehe davon aus, dass Sie die akzeptierte Antwort bereits gelesen haben. Wie ich vor fast 5 Jahren sagte:

Wenn jemand Kommentare für Situationen hat, in denen dies KEINE angemessene oder optimale Lösung ist, kommentieren Sie diese bitte unten


  • Klicken Sie mit der rechten Maustaste auf den Datenbanknamen.

  • Wählen Sie Aufgaben → Verkleinern → Datenbank

  • Dann klicken Sie OK!

Normalerweise öffne ich das Windows Explorer-Verzeichnis mit den Datenbankdateien, damit ich den Effekt sofort sehen kann.

Ich war eigentlich ziemlich überrascht, dass das funktioniert hat! Normalerweise habe ich DBCC schon einmal verwendet, aber ich habe es nur versucht und es hat nichts geschrumpft, also habe ich die GUI (2005) ausprobiert und es hat großartig funktioniert - 17 GB in 10 Sekunden freizugeben

Im vollständigen Wiederherstellungsmodus funktioniert dies möglicherweise nicht. Sie müssen entweder zuerst das Protokoll sichern oder zu Einfache Wiederherstellung wechseln und dann die Datei verkleinern. [danke @onupdatecascade dafür]

- -

PS: Ich weiß zu schätzen, was einige zu den Gefahren gesagt haben, aber in meiner Umgebung hatte ich selbst keine Probleme damit, zumal ich immer zuerst ein vollständiges Backup mache. Berücksichtigen Sie daher bitte Ihre Umgebung und wie sich dies auf Ihre Sicherungsstrategie und die Arbeitsplatzsicherheit auswirkt, bevor Sie fortfahren. Ich habe nur auf eine Funktion von Microsoft hingewiesen!


50
Im vollständigen Wiederherstellungsmodus funktioniert dies möglicherweise nicht. Sie müssen also entweder zuerst das Protokoll sichern oder zu Einfache Wiederherstellung wechseln und dann die Datei verkleinern.
Onupdatecascade

7
@onupdatecascade - guter Aufruf zum vollständigen Wiederherstellungstrick. hatte eine andere Datenbank mit einem riesigen Protokoll: auf einfach umgestellt, dann Datenbank verkleinert und wieder auf voll umgestellt. Protokolldatei bis zu 500kb!
Simon_Weaver

26
Es tut uns leid. Aber diese Antwort könnte einfach NICHT falscher sein. Durch Verkleinern der Datenbank wird die Transaktionsprotokolldatei vergrößert. Jedes Mal, wenn Sie Daten in einer SQL Server-Datenbank verschieben, müssen Sie die Protokolldatei protokollieren und aufblähen. Um die Protokollgröße zu verringern, setzen Sie entweder die Datenbank auf Einfache Wiederherstellung ODER sichern Sie das Protokoll (wenn Sie protokollierte Daten benötigen / benötigen - und dies fast immer in der Produktion). Weitere Details in diesen einfachen, kostenlosen Videos: sqlservervideos.com/video/logging-essentials sqlservervideos.com/video/sql2528-log-files
Michael K. Campbell

30
Wow, ein großes Lob dafür, dass ich 1300+ Wiederholungen für diese Antwort bekommen habe, aber es ist wirklich ein schrecklicher Rat.
Aaron Bertrand

8
Hier ist eine Übertreibung, um zu demonstrieren, was passiert und warum das Schrumpfen in regelmäßigen Abständen absolut kritisch ist: Datensatz A wird 1 Million Mal geändert, bevor eine Sicherung durchgeführt wird. Was ist im Protokoll? 999.999 Daten, die irrelevant sind. Wenn die Protokolle niemals verkleinert werden, wissen Sie nie, wie hoch die tatsächlichen Betriebskosten der Datenbank sind. Außerdem verbrauchen Sie höchstwahrscheinlich wertvolle Ressourcen in einem SAN. Schrumpfen ist eine gute Wartung und hält Sie in Kontakt mit Ihrer Umgebung. Zeigen Sie mir jemanden, der meint, Sie sollten niemals schrumpfen, und ich zeige Ihnen jemanden, der seine Umgebung ignoriert.
Newclique

54

Unten finden Sie ein Skript zum Verkleinern des Transaktionsprotokolls. Ich würde jedoch auf jeden Fall empfehlen, das Transaktionsprotokoll vor dem Verkleinern zu sichern.

Wenn Sie die Datei nur verkleinern, verlieren Sie eine Menge Daten, die im Katastrophenfall lebensrettend sein können. Das Transaktionsprotokoll enthält viele nützliche Daten, die mit einem Transaktionsprotokollleser eines Drittanbieters gelesen werden können (es kann manuell gelesen werden, jedoch mit extremem Aufwand).

Das Transaktionsprotokoll ist auch ein Muss, wenn es um die Wiederherstellung zu einem bestimmten Zeitpunkt geht. Werfen Sie es also nicht einfach weg, sondern sichern Sie es vorher.

Hier sind einige Beiträge, in denen Personen Daten verwendet haben, die im Transaktionsprotokoll gespeichert sind, um die Wiederherstellung durchzuführen:

 

USE DATABASE_NAME;
GO

ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);

ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO

Möglicherweise wird ein Fehler angezeigt, der so aussieht, wenn die obigen Befehle ausgeführt werden

"Protokolldatei (Name der Protokolldatei) kann nicht verkleinert werden, da die logische Protokolldatei am Ende der Datei verwendet wird."

Dies bedeutet, dass TLOG verwendet wird. Versuchen Sie in diesem Fall, dies mehrmals hintereinander auszuführen, oder suchen Sie nach einer Möglichkeit, die Datenbankaktivitäten zu reduzieren.


30

Hier ist ein einfacher und sehr uneleganter und potenziell gefährlicher Weg.

  1. Sicherungsdatenbank
  2. DB abnehmen
  3. Protokolldatei umbenennen
  4. DB anhängen
  5. Neue Protokolldatei wird neu erstellt
  6. Umbenannte Protokolldatei löschen.

Ich vermute, dass Sie keine Protokollsicherungen durchführen. (Welche das Protokoll abschneiden). Mein Rat ist, das Wiederherstellungsmodell von vollständig auf einfach zu ändern . Dies verhindert das Aufblähen des Protokolls.


15
Das Löschen / Umbenennen / Neuerstellen / Ersetzen des Protokolls ist respektvoll eine sehr schlechte Idee. Schrumpfen ist weniger riskant und außerdem ziemlich einfach.
Onupdatecascade

12
+1 - Unelegant oder nicht, diese Methode hat mich ein paar Mal mit Datenbankprotokollen, die die gesamte Festplatte gefüllt haben, aus dem heißen Wasser gebracht, sodass selbst ein Verkleinerungsbefehl nicht ausgeführt werden kann.
Shaul Behr

3
Besteht nicht das Risiko, dass im Protokoll ungeprüfte Transaktionen vorhanden sind?
Paul

Dies ist möglicherweise auch für kleinere DBs in Ordnung, aber wenn Sie eine DB mit 3 oder 4 TB haben, ist dies möglicherweise nicht die beste Lösung.
Jaques

Dies scheint in Ordnung zu sein, wenn Sie schon lange ein System entwickelt und während des Entwicklungszeitraums Tausende von Datensätzen geladen / gelöscht haben. Wenn Sie diese Datenbank dann für die Live-Bereitstellung verwenden möchten, sind die protokollierten Test- / Entwicklungsdaten redundant und spielen daher keine Rolle, ob sie verloren gehen, oder?
JsonStatham

28

Wenn Sie die Transaktionsprotokolle nicht für Wiederherstellungen verwenden (dh Sie führen immer nur vollständige Sicherungen durch), können Sie den Wiederherstellungsmodus auf "Einfach" setzen. Das Transaktionsprotokoll wird in Kürze verkleinert und nie wieder gefüllt.

Wenn Sie SQL 7 oder 2000 verwenden, können Sie auf der Registerkarte "Datenbankoptionen" die Option "Anmeldepunkt abschneiden" aktivieren. Dies hat den gleichen Effekt.

Dies wird in Produktionsumgebungen offensichtlich nicht empfohlen, da Sie zu einem bestimmten Zeitpunkt keine Wiederherstellung durchführen können.


1
Wenn Sie den Wiederherstellungsmodus auf einfach setzen, wird das Transaktionsprotokoll nicht auf magische Weise verkleinert.
Aaron Bertrand

@ Aaron Nicht alleine, nein. Ich ging davon aus, dass das OP seine Testdatenbank verwenden würde, und daher "wird das Transaktionsprotokoll sehr bald verkleinert", aber Sie haben Recht, da dies eher ein Nebeneffekt ist: Der einfache Wiederherstellungsmodus führt wahrscheinlich dazu, dass Sie geschrumpft werden Transaktionsprotokoll bald
Jonathan

" Simple... und nie wieder auffüllen" - nicht wahr. Ich habe es (in den letzten 48 Stunden) in einer Datenbank gesehen, in der das Wiederherstellungsmodell auf "EINFACH" eingestellt war. Das Dateigewachsen der Protokolldatei war auf "eingeschränkt" eingestellt, und wir hatten einige immense Aktivitäten durchgeführt ... Ich verstehe, dass es eine ungewöhnliche Situation war. (In unserer Situation, in der wir viel Speicherplatz auf der Festplatte hatten, haben wir die Größe der Protokolldatei erhöht und das Protokolldateigrammwachstum auf "uneingeschränkt" gesetzt ... was übrigens - Schnittstellenfehler - nach der Änderung als "eingeschränkt" angezeigt wird "mit einer maximalen Größe von 2.097.152 MB.)
Doug_Ivison

2
@Doug_Ivison Ja, das Transaktionsprotokoll enthält offene Transaktionen, die jedoch im einfachen Modus entfernt werden, sobald ein Prüfpunkt stattgefunden hat. Diese Antwort ist nur als kurze "meine Entwicklungs- / Testbox hat ein großes Transaktionsprotokoll und ich möchte, dass es verschwindet, damit ich mich nicht zu oft darum kümmern muss" gedacht, anstatt jemals in eine Produktion zu gehen Umgebung. Um es noch einmal zu wiederholen: Tun Sie dies nicht in der Produktion .
Jonathan

1
Das ist alles wahr, und ich verstehe, dass es ein schneller Entwicklungsansatz war. Warum ich kommentierte: Bis es mir passierte, dachte ich tatsächlich, das einfache Wiederherstellungsmodell könnte sich NIEMALS füllen ... und ich glaube, ich habe länger gebraucht, um herauszufinden / zu lösen, während ich begriff, dass ungewöhnlich große Transaktionen dies können.
Doug_Ivison

9

Diese von John empfohlene Technik wird nicht empfohlen, da nicht garantiert werden kann, dass die Datenbank ohne die Protokolldatei angehängt wird. Ändern Sie die Datenbank von "voll" in "einfach", erzwingen Sie einen Prüfpunkt und warten Sie einige Minuten. Der SQL Server löscht das Protokoll, das Sie dann mit DBCC SHRINKFILE verkleinern können.


... aber ich habe es Dutzende Male ohne Probleme gemacht. Vielleicht könnten Sie erklären, warum die Datenbank möglicherweise nicht erneut angehängt wird.
Johnno Nolan

Ich habe gelegentlich (nicht sehr oft) gesehen, dass der SQL Server die Datenbank nicht wieder an die Datenbank anhängen kann, wenn die Protokolldatei gelöscht wurde. Dadurch erhalten Sie eine nutzlose MDF-Datei. Es gibt verschiedene Möglichkeiten, die das Problem verursachen können. Transaktionen, deren Rollback aussteht, fallen mir ein.
Mrdenny

4
Ich stimme dieser Taktik zu, sie sollte jedoch für Fälle reserviert werden, in denen das Protokoll aufgrund eines unvorhergesehenen und / oder außergewöhnlichen Ereignisses gesprengt wurde. Wenn Sie jede Woche einen Job dafür einrichten, machen Sie das sehr, sehr falsch.
Aaron Bertrand

2
Sehr, sehr wahr Aaron.
Mrdenny

Ja, das ist uns gerade passiert. Wir wollten 20 G Protokolldatei weglassen, da wir gerade die Daten gesichert hatten, bevor wir die Datenbank verschoben haben. MSSQL würde es uns auf keinen Fall erlauben, die neue Datenbank ohne die riesige Protokolldatei erneut anzuhängen.
George M stellt Monica

9

Bei den meisten Antworten wird bisher davon ausgegangen, dass Sie die Transaktionsprotokolldatei nicht benötigen. Wenn Ihre Datenbank jedoch das FULLWiederherstellungsmodell verwendet und Sie Ihre Sicherungen aufbewahren möchten, falls Sie die Datenbank wiederherstellen müssen, kürzen oder löschen Sie die Datei nicht Protokolldatei, wie viele dieser Antworten vermuten lassen.

Wenn Sie die Protokolldatei entfernen (durch Abschneiden, Verwerfen, Löschen usw.), wird Ihre Sicherungskette unterbrochen und Sie können zu keinem Zeitpunkt seit Ihrer letzten vollständigen, differenziellen oder Transaktionsprotokollsicherung bis zur nächsten vollständigen Sicherung wiederherstellen oder es wird eine differenzielle Sicherung durchgeführt.

Ab dem Microsoft-Artikel weiterBACKUP

Wir empfehlen, niemals NO_LOG oder TRUNCATE_ONLY zu verwenden, um das Transaktionsprotokoll manuell abzuschneiden, da dies die Protokollkette unterbricht. Bis zur nächsten vollständigen oder differenziellen Datenbanksicherung ist die Datenbank nicht vor Medienfehlern geschützt. Verwenden Sie die manuelle Protokollkürzung nur unter ganz besonderen Umständen und erstellen Sie sofort Sicherungen der Daten.

Um dies zu vermeiden, sichern Sie Ihre Protokolldatei auf der Festplatte, bevor Sie sie verkleinern. Die Syntax würde ungefähr so ​​aussehen:

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)

3
Ich stimme Ihrer Antwort mit Ausnahme des , 1)Teils zu. Das Problem ist, dass, wenn Sie es auf 1 MB verkleinern, die Wachstumsereignisse, die zu einer normalen Protokollgröße führen, ziemlich kostspielig sind und es viele davon gibt, wenn die Wachstumsrate auf dem Standardwert von 10% belassen wird.
Aaron Bertrand

9

Das SQL Server-Transaktionsprotokoll muss ordnungsgemäß verwaltet werden, um unerwünschtes Wachstum zu verhindern. Dies bedeutet, dass Transaktionsprotokollsicherungen häufig genug ausgeführt werden. Wenn Sie dies nicht tun, riskieren Sie, dass das Transaktionsprotokoll voll wird und wächst.

Neben den Antworten auf diese Frage empfehle ich, die gängigen Mythen des Transaktionsprotokolls zu lesen und zu verstehen. Diese Messwerte können dazu beitragen, das Transaktionsprotokoll zu verstehen und zu entscheiden, mit welchen Techniken es "gelöscht" werden soll:

Aus den 10 wichtigsten Mythen des SQL Server-Transaktionsprotokolls :

Mythos: Mein SQL Server ist zu beschäftigt. Ich möchte keine SQL Server-Transaktionsprotokollsicherungen durchführen

Eine der größten leistungsintensiven Vorgänge in SQL Server ist ein automatisch wachsendes Ereignis der Online-Transaktionsprotokolldatei. Wenn Transaktionsprotokollsicherungen nicht oft genug durchgeführt werden, wird das Online-Transaktionsprotokoll voll und muss erweitert werden. Die Standardwachstumsgröße beträgt 10%. Je geschäftiger die Datenbank ist, desto schneller wächst das Online-Transaktionsprotokoll, wenn keine Transaktionsprotokollsicherungen erstellt werden. Durch das Erstellen einer SQL Server-Transaktionsprotokollsicherung wird das Online-Transaktionsprotokoll nicht blockiert, ein Ereignis mit automatischem Wachstum jedoch. Es kann alle Aktivitäten im Online-Transaktionsprotokoll blockieren

Aus Transaktionsprotokoll-Mythen :

Mythos: Regelmäßiges Schrumpfen von Holz ist eine gute Wartungspraxis

FALSCH. Das Holzwachstum ist sehr teuer, da der neue Block auf Null gesetzt werden muss. Alle Schreibaktivitäten in dieser Datenbank werden gestoppt, bis die Nullstellung abgeschlossen ist. Wenn das Schreiben auf der Festplatte langsam ist oder die Größe des automatischen Wachstums groß ist, kann diese Pause sehr groß sein und die Benutzer werden es bemerken. Das ist ein Grund, warum Sie Wachstum vermeiden wollen. Wenn Sie das Protokoll verkleinern, wächst es erneut und Sie verschwenden nur den Festplattenbetrieb für unnötige Spiele zum Verkleinern und erneuten Vergrößern


5

Überprüfen Sie zuerst das Datenbankwiederherstellungsmodell. Standardmäßig erstellt SQL Server Express Edition eine Datenbank für das einfache Wiederherstellungsmodell (wenn ich mich nicht irre).

Sicherungsprotokoll DatabaseName With Truncate_Only:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfile gibt Ihnen den Namen der logischen Protokolldatei.

Beziehen auf:

Wiederherstellung aus einem vollständigen Transaktionsprotokoll in einer SQL Server-Datenbank

Wenn sich Ihre Datenbank im vollständigen Wiederherstellungsmodell befindet und Sie keine TL-Sicherung durchführen, ändern Sie sie in EINFACH.


Auf diese Weise lösche ich Protokolldateien auf meinen Entwicklungsboxen. Prod-Umgebungen mit allen zugehörigen Backup-Strategien usw. überlasse ich den DBAs :-)
Joon

TRUNCATE_ONLYist in aktuellen Versionen von SQL Server keine Option mehr und wird in Versionen, die dies unterstützen, nicht empfohlen (siehe Rachels Antwort ).
Aaron Bertrand

5

Verwenden Sie den DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)Befehl. Wenn dies eine Testdatenbank ist und Sie versuchen, Speicherplatz zu sparen / zurückzugewinnen, hilft dies.

Denken Sie jedoch daran, dass TX-Protokolle eine Art Mindest- / Steady-State-Größe haben, bis zu der sie wachsen werden. Abhängig von Ihrem Wiederherstellungsmodell können Sie das Protokoll möglicherweise nicht verkleinern. Wenn das Protokoll in FULL ist und Sie keine TX-Protokollsicherungen ausgeben, kann es nicht verkleinert werden. Es wächst für immer. Wenn Sie keine TX-Protokollsicherungen benötigen, wechseln Sie Ihr Wiederherstellungsmodell zu Einfach .

Und denken Sie daran, niemals die Protokolldatei (LDF) zu löschen! Sie werden so ziemlich sofort eine Datenbankbeschädigung haben. Gekocht! Erledigt! Verlorene Daten! Wenn die MDF-Hauptdatei nicht repariert wird, kann sie dauerhaft beschädigt werden.

Löschen Sie niemals das Transaktionsprotokoll - Sie verlieren Daten! Ein Teil Ihrer Daten befindet sich im TX-Protokoll (unabhängig vom Wiederherstellungsmodell) ... wenn Sie die TX-Protokolldatei, die effektiv gelöscht wird, trennen und "umbenennen" Teil Ihrer Datenbank .

Für diejenigen, die das TX-Protokoll gelöscht haben, möchten Sie möglicherweise einige checkdb-Befehle ausführen und die Beschädigung beheben, bevor Sie weitere Daten verlieren.

Schauen Sie sich Paul Randals Blog-Beiträge zu diesem Thema an, schlechte Ratschläge .

Verwenden Sie im Allgemeinen auch keine Schrumpfdatei für die MDF-Dateien, da dies Ihre Daten stark fragmentieren kann. Weitere Informationen finden Sie in seinem Abschnitt "Bad Advice" ("Warum Sie Ihre Datendateien nicht verkleinern sollten").

Schauen Sie sich Pauls Website an - er behandelt genau diese Fragen. Letzten Monat ging er in seiner Myth A Day- Reihe viele dieser Themen durch .


+1 Als erste Antwort darauf, dass dies möglicherweise keine gute Idee ist! Das OP spezifiziert eine Testdatenbank, aber es ist ein Punkt, der für den allgemeineren Fall durchaus erwähnenswert ist.
Martin Smith

Ich hätte hinzufügen sollen - Wenn Sie das TX-Protokoll löschen - Update Resume!
Ripvlan

4

So schneiden Sie die Protokolldatei ab:

  • Sichern Sie die Datenbank
  • Trennen Sie die Datenbank entweder mithilfe von Enterprise Manager oder indem Sie Folgendes ausführen: Sp_DetachDB [DBName]
  • Löschen Sie die Transaktionsprotokolldatei. (oder benennen Sie die Datei um, nur für den Fall)
  • Hängen Sie die Datenbank erneut an: Sp_AttachDB [DBName]
  • Wenn die Datenbank angehängt ist, wird eine neue Transaktionsprotokolldatei erstellt.

So verkleinern Sie die Protokolldatei:

  • Sicherungsprotokoll [DBName] mit No_Log
  • Verkleinern Sie die Datenbank um Folgendes:

    Verwenden von Enterprise Manager: - Klicken Sie mit der rechten Maustaste auf die Datenbank, Alle Aufgaben, Datenbank verkleinern, Dateien, Protokolldatei auswählen, OK.

    Verwenden von T-SQL: - Dbcc Shrinkfile ([Log_Logical_Name])

Sie finden den logischen Namen der Protokolldatei, indem Sie sp_helpdb ausführen oder die Eigenschaften der Datenbank in Enterprise Manager überprüfen.


Löschen Sie niemals das Transaktionsprotokoll. Ein Teil Ihrer Daten befindet sich im Protokoll. Löschen Sie es und die Datenbank wird beschädigt. Ich habe keinen Repräsentanten, um abzustimmen.
Ripvlan

4

Nach meiner Erfahrung gibt es auf den meisten SQL Servern keine Sicherung des Transaktionsprotokolls. Vollständige Sicherungen oder differenzielle Sicherungen sind gängige Praxis, aber Transaktionsprotokollsicherungen sind wirklich selten. Die Transaktionsprotokolldatei wächst also für immer (bis die Festplatte voll ist). In diesem Fall sollte das Wiederherstellungsmodell auf " einfach" gesetzt werden " gesetzt werden. Vergessen Sie nicht, auch die Systemdatenbanken "model" und "tempdb" zu ändern.

Eine Sicherung der Datenbank "tempdb" macht keinen Sinn, daher sollte das Wiederherstellungsmodell dieser Datenbank immer "einfach" sein.


Wenn Sie die Datenbank einfach auf "Einfach" setzen, wird die Protokolldatei in dem Status, in dem sie sich gerade befindet, nicht verkleinert. Dies kann möglicherweise dazu beitragen, dass sie nicht weiter wächst (dies könnte jedoch immer noch der Fall sein).
Aaron Bertrand

4
  1. Erstellen Sie eine Sicherungskopie der MDB-Datei.
  2. Beenden Sie SQL-Dienste
  3. Benennen Sie die Protokolldatei um
  4. Starten Sie den Dienst

(Das System erstellt eine neue Protokolldatei.)

Löschen oder verschieben Sie die umbenannte Protokolldatei.


3

Es passierte bei mir, wo die Datenbankprotokolldatei 28 GB groß war.

Was können Sie tun, um dies zu reduzieren? Tatsächlich sind Protokolldateien diejenigen Dateidaten, die der SQL Server behält, wenn eine Transaktion stattgefunden hat. Damit eine Transaktion SQL Server verarbeitet, werden Seiten für dieselbe Transaktion zugewiesen. Nach Abschluss der Transaktion werden diese jedoch nicht plötzlich freigegeben, in der Hoffnung, dass eine Transaktion wie die gleiche zustande kommt. Dies hält den Raum.

Schritt 1: Führen Sie diesen Befehl zuerst im Prüfpunkt für die Datenbankabfrage aus

Schritt 2: Klicken Sie mit der rechten Maustaste auf die Datenbank. Aufgabe> Sichern Wählen Sie den Sicherungstyp als Transaktionsprotokoll aus. Fügen Sie eine Zieladresse und einen Dateinamen hinzu, um die Sicherungsdaten (.bak) beizubehalten.

Wiederholen Sie diesen Schritt erneut und geben Sie zu diesem Zeitpunkt einen anderen Dateinamen an

Geben Sie hier die Bildbeschreibung ein

Schritt 3: Gehen Sie nun zur Datenbank. Klicken Sie mit der rechten Maustaste auf die Datenbank

Aufgaben> Verkleinern> Dateien Wählen Sie Dateityp als Aktion zum Verkleinern von Protokollen, um nicht verwendeten Speicherplatz freizugeben

Geben Sie hier die Bildbeschreibung ein

Schritt 4:

Überprüfen Sie Ihre Protokolldatei normalerweise in SQL 2014 unter

C: \ Programme \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA

In meinem Fall ist es von 28 GB auf 1 MB reduziert


2

Versuche dies:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

TRUNCATE_ONLYist in aktuellen Versionen von SQL Server keine Option mehr und wird in Versionen, die dies unterstützen, nicht empfohlen (siehe Rachels Antwort ).
Aaron Bertrand

Es funktioniert für mich mit MSSQL Server 2005 Standard Edition
bksi

2

Datenbank → Rechtsklick Eigenschaften → Datei → Fügen Sie eine weitere Protokolldatei mit einem anderen Namen hinzu und legen Sie den Pfad wie in der alten Protokolldatei mit einem anderen Dateinamen fest.

Die Datenbank nimmt die neu erstellte Protokolldatei automatisch auf.


1
  1. Sicherungsdatenbank
  2. DB abnehmen
  3. Protokolldatei umbenennen
  4. DB anhängen (beim Anhängen entfernen umbenannte .ldf (Protokolldatei) .Wählen Sie sie aus und entfernen Sie sie, indem Sie auf die Schaltfläche Entfernen klicken.)
  5. Neue Protokolldatei wird neu erstellt
  6. Umbenannte Protokolldatei löschen.

Dies funktioniert, es wird jedoch empfohlen, zuerst eine Sicherungskopie Ihrer Datenbank zu erstellen.


1

Einige der anderen Antworten funktionierten bei mir nicht: Es war nicht möglich, den Prüfpunkt zu erstellen, während die Datenbank online war, da das Transaktionsprotokoll voll war (wie ironisch). Nachdem ich die Datenbank in den Notfallmodus versetzt hatte, konnte ich die Protokolldatei verkleinern:

alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);

0

Beispiel:

DBCC SQLPERF(LOGSPACE)

BACKUP LOG Comapny WITH TRUNCATE_ONLY

DBCC SHRINKFILE (Company_log, 500)

DBCC SQLPERF(LOGSPACE)

TRUNCATE_ONLYist in aktuellen Versionen von SQL Server keine Option mehr und wird in Versionen, die dies unterstützen, nicht empfohlen (siehe Rachels Antwort ).
Aaron Bertrand

Die Frage ist nicht zum Thema für Stapelüberlauf, wie in der Hilfe definiert . Bitte beantworten Sie solche Fragen nicht. Stattdessen sollten Sie sie zur Beachtung markieren, damit sie geschlossen oder entsprechend migriert werden.
Toby Speight

0

Leicht aktualisierte Antwort für MSSQL 2017 und Verwendung des SQL Server Management Studio. Ich ging meistens von diesen Anweisungen aus https://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/

Ich hatte kürzlich eine Datenbank-Sicherung, also habe ich das Transaktionsprotokoll gesichert. Dann habe ich es für ein gutes Maß wieder gesichert. Schließlich habe ich die Protokolldatei verkleinert und bin von 20 GB auf 7 MB gestiegen, viel mehr entsprechend der Größe meiner Daten. Ich glaube nicht, dass die Transaktionsprotokolle jemals gesichert wurden, seit dies vor 2 Jahren installiert wurde. Stellen Sie diese Aufgabe also in den Reinigungskalender.


-1

DB-Transaktionsprotokoll Auf Mindestgröße verkleinern :

  1. Sicherung: Transaktionsprotokoll
  2. Dateien verkleinern: Transaktionsprotokoll
  3. Sicherung: Transaktionsprotokoll
  4. Dateien verkleinern: Transaktionsprotokoll

Ich habe mehrere DBs getestet: Diese Sequenz funktioniert .

Es schrumpft normalerweise auf 2 MB .

ODER durch ein Skript:

DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>';               --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>';         --Input Variable
EXEC 
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO

1
TRUNCATE_ONLYist in aktuellen Versionen von SQL Server keine Option mehr und wird in Versionen, die dies unterstützen, nicht empfohlen (siehe Rachels Antwort ).
Aaron Bertrand
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.