Eine kürzere Antwort:
Sie haben wahrscheinlich entweder eine lange laufende Transaktion (Indexpflege? Löschen oder Aktualisieren von großen Stapeln?) Oder Sie befinden sich im Wiederherstellungsmodus "Standard" (siehe unten, was standardmäßig gemeint ist) Full
und haben keine Protokollsicherung durchgeführt (oder) nehmen sie nicht häufig genug).
Wenn es sich um ein Problem mit dem Wiederherstellungsmodell handelt, lautet die einfache Antwort möglicherweise "In den Simple
Wiederherstellungsmodus wechseln", wenn Sie keine Wiederherstellung zu einem bestimmten Zeitpunkt und keine regelmäßigen Protokollsicherungen benötigen. Viele Menschen machen dies jedoch zu ihrer Antwort, ohne die Wiederherstellungsmodelle zu verstehen. Lesen Sie weiter, um zu verstehen, warum es wichtig ist, und entscheiden Sie dann, was Sie tun. Sie können auch einfach Protokollsicherungen erstellen und die Full
Wiederherstellung fortsetzen.
Es könnte andere Gründe geben, aber diese sind die häufigsten. Diese Antwort geht auf die beiden häufigsten Gründe ein und gibt Ihnen einige Hintergrundinformationen zum Warum und Wie der Gründe sowie einige andere Gründe.
Eine längere Antwort:
Welche Szenarien können dazu führen, dass das Protokoll weiter wächst? Es gibt viele Gründe, aber in der Regel gibt es zwei Gründe: Es gibt ein Missverständnis bezüglich der Wiederherstellungsmodelle oder es gibt lange laufende Transaktionen. Lesen Sie weiter für Details.
Hauptgrund 1/2: Wiederherstellungsmodelle nicht verstehen
( Befinden Sie sich im vollständigen Wiederherstellungsmodus und führen Sie keine Protokollsicherungen durch. Dies ist der häufigste Grund. Die überwiegende Mehrheit der Betroffenen ist von diesem Problem betroffen . )
Während diese Antwort in SQL Server-Wiederherstellungsmodellen keine große Rolle spielt, ist das Thema Wiederherstellungsmodelle für dieses Problem von entscheidender Bedeutung.
In SQL Server gibt es drei Wiederherstellungsmodelle :
Full
,
Bulk-Logged
und
Simple
.
Wir werden es vorerst ignorieren und Bulk-Logged
sagen, dass es sich um ein Hybridmodell handelt und die meisten Leute in diesem Modell sind aus einem bestimmten Grund da und verstehen Wiederherstellungsmodelle.
Die beiden, die uns wichtig sind, und ihre Verwirrung sind die Ursache für die Mehrzahl der Fälle, in denen Menschen mit diesem Problem zu tun haben, Simple
und Full
.
Pause: Erholung im Allgemeinen
Bevor wir über Wiederherstellungsmodelle sprechen: Lassen Sie uns über die Wiederherstellung im Allgemeinen sprechen. Wenn Sie dieses Thema noch vertiefen möchten, lesen Sie einfach den Blog von Paul Randal und so viele Beiträge, wie Sie möchten. Für diese Frage jedoch:
Wiederherstellung nach Absturz / Neustart
Ein Zweck der Transaktionsprotokolldatei ist die Wiederherstellung nach Absturz / Neustart . Für das Vorwärts- und Zurückrollen von Arbeit, die vor einem Absturz oder Neustart ausgeführt wurde (Vorwärtsrollen / Wiederherstellen), und für die Arbeit, die nach einem Absturz oder Neustart gestartet, aber nicht beendet wurde (Zurückrollen / Rückgängigmachen). Es ist die Aufgabe des Transaktionsprotokolls, zu überprüfen, ob eine Transaktion gestartet, aber nie beendet wurde (ein Rollback oder ein Absturz / Neustart erfolgte, bevor die Transaktion festgeschrieben wurde). In dieser Situation ist es die Aufgabe des Protokolls, während der Wiederherstellung "Hey ... das ist nie wirklich beendet, lasst es uns zurücksetzen" zu sagen . Es ist auch die Aufgabe des Protokolls, zu überprüfen, ob Sie etwas fertiggestellt haben und ob Ihrer Client-Anwendung mitgeteilt wurde, dass es fertiggestellt wurde (auch wenn es noch nicht in Ihrer Datendatei verankert war) und zu sagen"Hey ... das ist wirklich passiert, lass es uns nach vorne rollen, lass es uns so machen, wie es die Anwendungen denken" nach einem Neustart. Jetzt gibt es mehr, aber das ist der Hauptzweck.
Zeitpunkt der Wiederherstellung
Der andere Zweck einer Transaktionsprotokolldatei besteht darin, uns die Möglichkeit zu geben, aufgrund eines "Hoppla" in einer Datenbank einen bestimmten Zeitpunkt wiederherzustellen oder bei einem Hardwarefehler einen Wiederherstellungspunkt zu gewährleisten Einbeziehen der Daten und / oder Protokolldateien einer Datenbank. Wenn dieses Transaktionsprotokoll die Aufzeichnungen von Transaktionen enthält, die für die Wiederherstellung gestartet und beendet wurden, kann und verwendet SQL Server diese Informationen, um eine Datenbank an den Ort zu bringen, an dem sie vor dem Auftreten eines Problems war. Aber das ist für uns nicht immer eine Option. Damit dies funktioniert, müssen wir unsere Datenbank im richtigen Wiederherstellungsmodell haben und Protokollsicherungen durchführen .
Wiederherstellungsmodelle
Auf den Wiederherstellungsmodellen:
Einfaches Wiederherstellungsmodell
Mit der obigen Einführung ist es am einfachsten, zuerst über das Simple Recovery
Modell zu sprechen . In diesem Modell sagen Sie SQL Server: "Es ist in Ordnung, wenn Sie Ihre Transaktionsprotokolldatei zum Absturz bringen und die Wiederherstellung neu starten ..." (Sie haben dort wirklich keine Wahl. Suchen Sie nach den ACID-Eigenschaften, und das sollte schnell Sinn machen.) "... aber sobald Sie es nicht mehr für diesen Absturz- / Neustart-Wiederherstellungszweck benötigen, können Sie die Protokolldatei wiederverwenden."
SQL Server überwacht diese Anforderung in Simple Recovery und speichert nur die Informationen, die für die Wiederherstellung nach einem Absturz / Neustart erforderlich sind. Sobald SQL Server sicher ist, dass es wiederhergestellt werden kann, da die Daten in der Datendatei (mehr oder weniger) gesichert sind, sind die gesicherten Daten im Protokoll nicht mehr erforderlich und werden zum Abschneiden markiert. Dies bedeutet, dass sie wiederverwendet werden.
Vollständiges Wiederherstellungsmodell
Mit Full Recovery
teilen Sie SQL Server mit, dass die Wiederherstellung zu einem bestimmten Zeitpunkt möglich sein soll, sofern Ihre Protokolldatei verfügbar ist, oder zu einem bestimmten Zeitpunkt, der von einer Protokollsicherung abgedeckt wird. Wenn SQL Server in diesem Fall den Punkt erreicht, an dem das Abschneiden der Protokolldatei in Simple Recovery Model sicher ist, wird dies nicht ausgeführt. Stattdessen lässt es die Protokolldatei weiter wachsen und lässt sie weiter wachsen, bis Sie unter normalen Umständen eine Protokollsicherung durchführen (oder nicht mehr genügend Speicherplatz auf Ihrem Protokolldateilaufwerk haben).
Das Umschalten von Einfach auf Voll hat ein Gotcha.
Hier gibt es Regeln und Ausnahmen. Wir werden im Folgenden ausführlich über langfristige Transaktionen sprechen.
Aber eine Einschränkung für Full Recovery Mode im Auge zu behalten , ist dies: Wenn Sie nur in Schalter - Full Recovery
Modus, aber nie eine anfängliche vollständige Sicherung nehmen, wird SQL Server nicht Ihre Anfrage ehren Full Recovery
Modell. Ihr Transaktionsprotokoll bleibt so lange in Betrieb, Simple
bis Sie zum vollständigen Wiederherstellungsmodell wechseln UND Ihr erstes erstellen Full Backup
.
Das vollständige Wiederherstellungsmodell ohne Protokollsicherungen ist fehlerhaft.
Das ist also der häufigste Grund für unkontrolliertes Holzwachstum? Antwort: Sie befinden sich im vollständigen Wiederherstellungsmodus, ohne Protokollsicherungen durchzuführen.
Dies passiert den Menschen die ganze Zeit.
Warum ist das so ein häufiger Fehler?
Warum passiert es die ganze Zeit? Weil jede neue Datenbank ihre ursprüngliche Einstellung für das Wiederherstellungsmodell erhält, indem sie sich die Modelldatenbank ansieht.
Die anfängliche Einstellung für das Wiederherstellungsmodell des Modells ist immer Full Recovery Model
- bis jemand dies ändert. Man könnte also sagen, das "Standard-Wiederherstellungsmodell" ist Full
. Vielen Menschen ist dies nicht bewusst, und ihre Datenbanken werden Full Recovery Model
ohne Protokollsicherungen ausgeführt. Daher ist eine Transaktionsprotokolldatei viel größer als erforderlich. Aus diesem Grund ist es wichtig, die Standardeinstellungen zu ändern, wenn sie für Ihr Unternehmen und dessen Anforderungen nicht funktionieren.
Das vollständige Wiederherstellungsmodell mit zu wenigen Protokollsicherungen ist fehlerhaft.
Sie können sich hier auch in Schwierigkeiten bringen, indem Sie nicht häufig genug Protokollsicherungen durchführen.
Wenn Sie ein Protokoll-Backup pro Tag erstellen, kann dies in Ordnung sein, da für eine Wiederherstellung weniger Wiederherstellungsbefehle erforderlich sind. Beachten Sie jedoch, dass die Protokolldatei so lange wächst, bis Sie Protokoll-Backups erstellen.
Wie finde ich heraus, welche Häufigkeit der Protokollsicherung ich benötige?
Sie müssen die Häufigkeit Ihrer Protokollsicherungen unter zwei Gesichtspunkten berücksichtigen:
- Wiederherstellungsbedarf - Dies sollte hoffentlich der erste sein. Wie viele Daten können verloren gehen, wenn das Laufwerk, auf dem sich Ihr Transaktionsprotokoll befindet, fehlerhaft ist oder Sie eine schwerwiegende Beschädigung feststellen, die sich auf Ihre Protokollsicherung auswirkt? Wenn diese Anzahl nicht mehr als 10-15 Minuten beträgt, müssen Sie alle 10-15 Minuten eine Protokollsicherung durchführen, Ende der Diskussion.
- Protokollwachstum - Wenn Ihr Unternehmen mehr Daten verlieren kann, weil es an diesem Tag problemlos wiederhergestellt werden kann, ist es möglicherweise in Ordnung, eine Protokollsicherung viel seltener als 15 Minuten durchzuführen. Vielleicht ist Ihre Organisation alle 4 Stunden in Ordnung. Sie müssen sich jedoch ansehen, wie viele Transaktionen Sie in 4 Stunden generieren. Wird eine Protokolldatei zu groß, wenn das Protokoll in diesen vier Stunden weiter wächst? Dauern Ihre Protokollsicherungen dann zu lange?
Hauptgrund 2/2: Langfristige Transaktionen
( "Mein Wiederherstellungsmodell ist in Ordnung! Das Protokoll wächst noch! )
Dies kann auch eine Ursache für ein unkontrolliertes und ungebremstes Holzwachstum sein. Unabhängig vom Wiederherstellungsmodell wird häufig die Meldung "Aber ich bin im einfachen Wiederherstellungsmodell - warum wächst mein Protokoll noch ?!"
Der Grund hierfür ist einfach: Wenn SQL dieses Transaktionsprotokoll wie oben beschrieben für Wiederherstellungszwecke verwendet, muss es zum Beginn einer Transaktion zurückkehren.
Wenn Sie über eine Transaktion verfügen, die viel Zeit in Anspruch nimmt oder viele Änderungen vornimmt, kann das Protokoll am Prüfpunkt nicht für Änderungen abgeschnitten werden, die sich noch in offenen Transaktionen befinden oder die seit dem Start dieser Transaktion gestartet wurden.
Dies bedeutet, dass ein großer Löschvorgang, bei dem Millionen von Zeilen in einer Löschanweisung gelöscht werden, eine Transaktion ist und das Protokoll erst dann abgeschnitten werden kann, wenn der gesamte Löschvorgang abgeschlossen ist. In Full Recovery Model
wird dieser Löschvorgang protokolliert und das können viele Protokolldatensätze sein. Dasselbe gilt für die Indexoptimierung während Wartungsfenstern. Dies bedeutet auch, dass eine schlechte Transaktionsverwaltung und das Nichtbeachten und Schließen offener Transaktionen Sie und Ihre Protokolldatei wirklich verletzen können.
Was kann ich gegen diese langfristigen Transaktionen tun?
Sie können sich hier sparen, indem Sie:
- Ordnungsgemäße Dimensionierung Ihrer Protokolldatei, um das Worst-Case-Szenario zu berücksichtigen - z. B. Ihre Wartung oder bekannte große Vorgänge. Und wenn Sie Ihre Protokolldatei erweitern, sollten Sie sich diese Anleitung (und die beiden Links, an die sie Sie sendet) von Kimberly Tripp ansehen . Die richtige Dimensionierung ist hier sehr wichtig.
- Beobachten Sie Ihre Verwendung von Transaktionen. Starten Sie keine Transaktion auf Ihrem Anwendungsserver und führen Sie keine langen Unterhaltungen mit SQL Server. Andernfalls besteht die Gefahr, dass eine zu lange offen bleibt.
- Beobachten Sie die implizierten Transaktionen in Ihren DML-Anweisungen. Zum Beispiel:
UPDATE TableName Set Col1 = 'New Value'
ist eine Transaktion. Ich habe dort keine eingegeben BEGIN TRAN
und muss es auch nicht. Es handelt sich immer noch um eine Transaktion, die automatisch festgeschrieben wird, wenn sie abgeschlossen ist. Wenn Sie also Vorgänge mit einer großen Anzahl von Zeilen ausführen, sollten Sie erwägen, diese Vorgänge in übersichtlichere Abschnitte zu unterteilen und dem Protokoll Zeit für die Wiederherstellung zu geben. Oder überlegen Sie sich die richtige Größe, um damit umzugehen. Oder untersuchen Sie das Ändern von Wiederherstellungsmodellen während eines Bulk Load-Fensters.
Treffen diese beiden Gründe auch auf den Holzversand zu?
Kurze Antwort: ja. Längere Antwort unten.
Frage: "Ich verwende den Protokollversand, damit meine Protokollsicherungen automatisiert werden. Warum sehe ich immer noch eine Zunahme des Transaktionsprotokolls?"
Antwort: lesen Sie weiter.
Was ist Holzversand?
Protokollversand ist genau das, wonach es sich anhört - Sie versenden Ihre Transaktionsprotokollsicherungen zu DR-Zwecken an einen anderen Server. Es gibt einige Initialisierungen, aber danach ist der Vorgang ziemlich einfach:
- Ein Job zum Sichern des Protokolls auf einem Server,
- einen Auftrag zum Kopieren dieser Protokollsicherung und
- einen Job zum Wiederherstellen ohne Wiederherstellung (entweder
NORECOVERY
oder STANDBY
) auf dem Zielserver.
Es gibt auch einige Jobs, die überwacht und alarmiert werden müssen, wenn die Dinge nicht so laufen, wie Sie es geplant haben.
In einigen Fällen möchten Sie die Wiederherstellung des Protokollversands möglicherweise nur einmal am Tag, alle drei Tage oder jede Woche durchführen. Das ist gut. Wenn Sie diese Änderung jedoch für alle Jobs (einschließlich der Protokollsicherungs- und Kopierjobs) vornehmen, bedeutet dies, dass Sie die ganze Zeit auf eine Protokollsicherung warten. Das bedeutet, dass Sie eine Menge Protokollwachstum haben werden - da Sie sich im vollständigen Wiederherstellungsmodus ohne Protokollsicherungen befinden - und wahrscheinlich auch, dass Sie eine große Protokolldatei kopieren müssen. Sie sollten nur den Zeitplan des Wiederherstellungsjobs ändern und die Protokollsicherungen und -kopien häufiger ausführen lassen, da sonst das erste in dieser Antwort beschriebene Problem auftritt.
Allgemeine Fehlersuche über Statuscodes
Es gibt andere Gründe als diese beiden, aber diese sind die häufigsten. Unabhängig von der Ursache: Es gibt eine Möglichkeit, den Grund für dieses ungeklärte Protokollwachstum bzw. das Fehlen von Kürzungen zu analysieren und die Ursache zu ermitteln.
Wenn Sie die sys.databases
Katalogansicht abfragen, werden Informationen angezeigt, die beschreiben, warum Ihre Protokolldatei möglicherweise auf das Abschneiden / Wiederverwenden wartet.
Es gibt eine Spalte log_reuse_wait
mit einer Nachschlage-ID des Ursachencodes und eine log_reuse_wait_desc
Spalte mit einer Beschreibung der Warteursache. In den Online-Artikeln zu den Büchern, auf die verwiesen wird, sind die meisten Gründe (die Sie wahrscheinlich sehen und die, für die wir Gründe erklären können. Die fehlenden sind entweder nicht in Gebrauch oder für den internen Gebrauch) mit ein paar Anmerkungen zum Warten in kursiv :
0 = Nichts
Wie es sich anhört. Sollte nicht warten
1 = Checkpoint
Warten auf einen Checkpoint. Dies sollte passieren und Sie sollten in Ordnung sein - aber es gibt einige Fälle, nach denen Sie hier nach späteren Antworten oder Änderungen suchen müssen.
2 = Protokollsicherung
Sie warten auf eine Protokollsicherung. Entweder haben Sie sie geplant und es wird bald passieren, oder Sie haben das erste hier beschriebene Problem und wissen jetzt, wie Sie es beheben können
3 = Aktive Sicherung oder Wiederherstellung
Auf der Datenbank wird eine Sicherung oder Wiederherstellung ausgeführt
4 = Aktive Transaktion
Es gibt eine aktive Transaktion, die abgeschlossen werden muss (entweder ROLLBACK
oder COMMIT
), bevor das Protokoll gesichert werden kann. Dies ist der zweite Grund, der in dieser Antwort beschrieben wird.
5 = Datenbankspiegelung
Entweder kommt ein Spiegel in einer Hochleistungsspiegelungssituation in Verzug oder es tritt eine gewisse Latenz auf, oder die Spiegelung wird aus irgendeinem Grund angehalten
6 = Replikation
Es kann Probleme mit der Replikation geben, die dies verursachen könnten - beispielsweise, dass ein Protokolllese-Agent nicht ausgeführt wird, eine Datenbank denkt, dass sie für eine Replikation markiert ist, die nicht mehr ausgeführt wird, und verschiedene andere Gründe. Sie können diesen Grund auch sehen und es ist völlig normal, weil Sie genau zum richtigen Zeitpunkt schauen, so wie Transaktionen vom Protokollleser verarbeitet werden
7 =
Erstellung eines Datenbank-Snapshots Sie erstellen einen Datenbank-Snapshot. Dies wird angezeigt, wenn Sie genau den richtigen Zeitpunkt für die Erstellung eines Snapshots auswählen
8 = Log Scan
Ich habe noch kein Problem damit, dass ich für immer mitläuft. Wenn Sie lange genug und häufig genug nachsehen, können Sie dies beobachten, aber es sollte keine Ursache für übermäßiges Wachstum des Transaktionsprotokolls sein, wie ich gesehen habe.
9 = Ein sekundäres Replikat von AlwaysOn Availability Groups wendet Transaktionsprotokollsätze dieser Datenbank auf eine entsprechende sekundäre Datenbank an.
Über die klarste Beschreibung noch ..