Verkleinern eines SQL Server-Transaktionsprotokolls

8

Ich muss mich derzeit mit einem SQL Server-Transaktionsprotokoll befassen, das außer Kontrolle geraten ist. Haftungsausschluss: Ich bin kein dba und dies ist nicht mein Fachgebiet. Bitte nehmen Sie Kontakt mit mir auf.

Derzeit habe ich eine 115-GB- Transaktionsprotokolldatei für eine 500-MB-Datenbank, die (offensichtlich) seit einiger Zeit schlecht verwaltet wurde, um in diesen Zustand zu gelangen.

Die oberste Priorität ist es, den von dieser Datei belegten Speicherplatz auf der Festplatte zurückzugewinnen, bevor wir leer sind! Mir wurde gesagt, dass eine Vergrößerung des Laufwerks auch vorübergehend keine Option ist. Aufgrund des Wachstums in der Vergangenheit müssen wir ziemlich bald handeln.

Soweit ich weiß, besteht der beste Ansatz darin, die Datenbank im vollständigen Wiederherstellungsmodus zu belassen, aber regelmäßige Sicherungen der Protokolldatei durchzuführen, diese über einen bestimmten Zeitraum zu überwachen und die anfängliche Größe und das Inkrement entsprechend anzupassen. Alles okay.

Da wir um Mitternacht regelmäßig vollständige DB-Sicherungen durchführen, ist es für mich sicher, die Datenbank vorübergehend in den einfachen Wiederherstellungsmodus zu versetzen (nachdem eine dieser Sicherungen ausgeführt wurde), die Protokolldatei zu verkleinern, um (praktisch den gesamten) Speicherplatz und den Speicherplatz zurückzugewinnen Setzen Sie es dann mit der oben genannten Sicherungsstrategie wieder in die vollständige Wiederherstellung ein.

Ich denke, wenn etwas um diese Zeit passiert ist, können wir einfach die vollständige Sicherung wiederherstellen, ohne die Protokolle zu verwenden.

AKTUALISIEREN

Einige zusätzliche Details als Antwort auf einige der Antworten und Kommentare:

  • Wir möchten die Möglichkeit behalten, eine Wiederherstellung zu einem bestimmten Zeitpunkt durchzuführen, damit die Datenbank im vollständigen Wiederherstellungsmodus bleibt.

  • Der Grund dafür, dass die T-Log-Datei so groß geworden ist, ist, dass sie nie gesichert wurde . Verifiziert als log_reuse_wait_desc gibt 'LOG_BACKUP' zurück.

Kraig Walker
quelle
Haben Sie nach offenen Transaktionen oder Ad-hoc- oder geplanten Aufgaben gesucht, die dazu geführt hätten, dass das Transaktionsprotokoll so groß geworden wäre? Das Erkennen des Grundes kann Ihnen helfen, das Wachstum entsprechend zu planen.
KASQLDBA
Sobald Sie in den einfachen Modus wechseln, können Sie die Wiederherstellung des Transaktionsprotokolls nach diesem Zeitpunkt bis zu Ihrer nächsten vollständigen Sicherung nicht mehr durchführen. Selbst wenn Sie es wieder in den vollständigen Wiederherstellungsmodus schalten, funktioniert die Transaktionsprotokollsicherung / Wiederherstellungswiederherstellung erst wieder, wenn Sie eine weitere vollständige Sicherung durchführen. Stellen Sie daher sicher, dass Sie sofort eine vollständige Sicherung erstellen, nachdem Sie sie wieder auf vollständige Wiederherstellung umgestellt haben.
RBarryYoung
Der übliche Grund für außer Kontrolle geratene Protokolldateien wie diese ist 1) das Fehlen regelmäßiger vollständiger Sicherungen, 2) das Versagen regelmäßiger Transaktionsprotokollsicherungen oder 3) einige Einstellungen in Ihren vollständigen oder Protokollsicherungen (z. B. nur Kopieren) ), wodurch verhindert wird, dass die normalen Sicherungsmarken gesetzt werden.
RBarryYoung
@RBarryYoung Wir haben überprüft, dass keine T-Log-Sicherungen durchgeführt wurden. Empfehlen Sie, das zu tun, was ich ursprünglich vorgeschlagen hatte, aber direkt nach der vollständigen Wiederherstellung der Datenbank eine vollständige Sicherung manuell durchzuführen, um die von Ihnen genannten Probleme zu vermeiden? Es ist unbedingt erforderlich, dass ein Teil des Speicherplatzes so schnell wie möglich zurückgewonnen wird.
Kraig Walker
AFAIK, es hat keinen Sinn, sich im vollständigen Wiederherstellungsmodus zu befinden, wenn Sie keine Protokollsicherungen durchführen. Wenn Sie keine Protokollsicherungen planen, lassen Sie es einfach im einfachen Modus. Ihre vollständigen Sicherungen können in beiden Fällen weiterhin wiederhergestellt werden. Sie können gerade keine Wiederherstellung / Vorwärtsbewegung durchführen, aber ohne Protokollsicherungen können Sie dies trotzdem nicht tun.
RBarryYoung

Antworten:

4

Das Transaktionsprotokoll für diese Datenbank enthält alle Transaktionen seit der letzten Transaktionsprotokollsicherung oder dem letzten Wechsel aus dem einfachen Wiederherstellungsmodus. Führen Sie die folgenden Schritte aus, um die endgültige Antwort zu erhalten, warum SQL Server das Protokoll nicht abschneiden kann und warum das Protokoll anschließend wächst.

SELECT  d.Name
        ,d.log_reuse_wait_desc
FROM    sys.databases d
ORDER BY
        d.name

Wenn Sie eine Wiederherstellung zu einem bestimmten Zeitpunkt wünschen, belassen Sie die Datenbank im vollständigen Wiederherstellungsmodell und führen Sie häufige Protokollsicherungen durch. Jede Protokollsicherung enthält alle Transaktionen seit der letzten Protokollsicherung. Der Protokollsicherungsprozess ist auch dafür verantwortlich, das Protokoll zu löschen und den Speicherplatz für die Wiederverwendung zu markieren. Das heißt, die nächste in der Datenbank durchgeführte Transaktion wird zirkulär an den Anfang des abgeschnittenen Protokolls geschrieben. Diese Sicherung und Wiederverwendung des Protokolls verhindert, dass die Protokolldatei wächst.

Wenn Sie nicht an einer Wiederherstellung zu einem bestimmten Zeitpunkt interessiert sind und die Verwaltung der Datenbank vereinfachen möchten. Stellen Sie dann die Datenbank auf das einfache Wiederherstellungsmodell ein und führen Sie keine T-Log-Sicherungen durch. SQL Server schneidet das Transaktionsprotokoll automatisch ab, nachdem jede Transaktion festgeschrieben wurde. Das heißt, sobald die Transaktion in das Protokoll übernommen wurde, wird der Datensatz durch die nächste Transaktion usw. überschrieben.

Sobald Sie eine dieser beiden Entscheidungen getroffen haben, können Sie die Protokolldatei auf eine vernünftigere Größe verkleinern. Beachten Sie, dass Sie es idealerweise groß genug machen möchten, damit es nicht wächst, aber nicht so groß, dass Sie es erneut verkleinern müssen. Beachten Sie auch, dass Sie den aktiven Teil des Protokolls nicht verkleinern können.

Laden Sie die Datenbankverwaltungslösung https://ola.hallengren.com/ herunter und stellen Sie sie bereit, um Backups, Indexfragmentierung, Statistiken und CHECKDB abzudecken.

Sie können den zurückgegebenen Bericht "Festplattennutzung" auch finden, indem Sie mit der rechten Maustaste auf die Datenbank in Objekt-Explorer> Berichte> Standardberichte> "Festplattennutzung" klicken, um den freien Speicherplatz im T-Protokoll zurückzugeben.

Ich empfehle Google auch, warum es aus DR-Sicht so wichtig ist, die Protokollkette intakt zu halten, und wie der Wechsel von voll zu einfach die Kette unterbricht und Sie Datenverlusten aussetzt.

Pixeliert
quelle
3

Da wir um Mitternacht regelmäßig vollständige DB-Sicherungen durchführen, ist es für mich sicher, die Datenbank vorübergehend in den einfachen Wiederherstellungsmodus zu versetzen (nachdem eine dieser Sicherungen ausgeführt wurde), die Protokolldatei zu verkleinern, um (praktisch den gesamten) Speicherplatz und den Speicherplatz zurückzugewinnen Setzen Sie es dann mit der oben genannten Sicherungsstrategie wieder in die vollständige Wiederherstellung ein.

Ja, es ist sicher, vorausgesetzt, Sie stören dabei keine Transaktionen, z. B. eine nächtliche Ladung. Wenn sich eine Datenbank im vollständigen Wiederherstellungsmodus befinden soll, möchten Sie im Allgemeinen regelmäßige T-Log-Sicherungen. Dies reduziert das Problem, mit dem Sie konfrontiert sind. Ich schreibe "allgemein", weil ich in einigen Fällen gesehen habe, wie Leute eine Datenbank auf voll gesetzt haben, ohne zu wissen, warum sie es getan haben. Nehmen wir an, dass dies nicht der Fall ist.

Möglicherweise möchten Sie jedoch überlegen, warum das Protokoll diese Größe im Verhältnis zur Datenbankgröße hat. Eine 500-MB-Datenbank mit einem 116-GB-Protokoll scheint für ein einmaliges Ereignis sehr unverhältnismäßig zu sein. Ich würde vorschlagen, zu überwachen, was in der Datenbank passiert, um zu sehen, wie sie überhaupt zu dieser Größe gelangt ist.

user541852587
quelle
Soweit ich weiß, läuft dies seit sechs Monaten oder länger ohne Wartung, daher die Größe. Ich werde jedoch tun, was Sie vorschlagen, und das Wachstum der Datei im Auge behalten, sobald ich das unmittelbare Problem gelöst habe.
Kraig Walker
Um ehrlich zu sein, möchte ich diese Antwort ablehnen.
Jyao
1
Tatsächlich ist es NICHT sicher, von FULL auf Simple Recovery umzuschalten und dann mit dem Schrumpfen zu beginnen. Aus der Beschreibung von Kraig Walker geht hervor, dass diese Datenbank seit einiger Zeit keine T-Log-Sicherung mehr hat. Das erste, was Sie tun müssen, ist, den Datenbank-Wiederherstellungsmodus und die letzte durchgeführte tlog-Sicherung zu überprüfen (wenn es sich NICHT um einen einfachen Wiederherstellungsmodus handelt). Wenn eine tlog-Sicherung vorhanden ist, überprüfen Sie, warum die tlog-Sicherung das Protokoll nicht löscht, indem Sie in der Ansicht sys.databases [log_reuse_wait_desc] aktivieren. Ich habe die Erfahrung gemacht, dass Sie direkt verkleinern können, wenn der Großteil der Protokolldatei leer ist.
Jyao
@jyao Ihre Vermutung ist richtig, es gibt keine Protokollsicherungen und das ist der Grund, warum die Datei so groß ist.
Kraig Walker