LDF Truncate in einer AON-Umgebung (SQL Server Availability Groups)

Von Lukas Hillesheim, 8. August 2023
Blog Article & Copyright by Lukas Hillesheim
Das Verkleinern des Logfiles ist ein gelegentlich auftretender administrativer Task bei der Verwaltung von SQL Server. Dass sich das Logfile in manchen Fällen nur noch unter Zuhilfenahme des SIMPLE Recovery Modes verkleinern läßt und dabei ein Problem für die Backup Chain auftritt, kann als Bug oder als lästige Verhaltensweise angesehen werden. Die zusätzliche Hürde beim Einsatz in einer Cluster Umgebung mit AlwaysOn Availability Group besteht darin, dass der Recovery Mode hier nicht auf SIMPLE gesetzt werden kann, ohne die Konfiguration des AON-Clusters zu resetten. Der nachfolgende Artikel zeigt eine Lösung für das Problem.

1. Test-Umgebung

Die AON-Test-Umgebung besteht aus einem Domain Controller und zwei Nodes, die Teil einer Availability Group namens "CLUS01" sind:
Figure 1: Cluster with two Nodes
Figure 1: Cluster with two Nodes
Die Datenbank [CLUS01] ist Teil von AON:
Figure 2: Database [ClusDB01] as part of AON
Figure 2: Database [ClusDB01] as part of AON
Die Tabelle [order] ist noch leer:
Figure 3: Table [order] is still empty
Figure 3: Table [order] is still empty
Das LDF File ist noch leer und hat seine initiale Ausgangs-Größe:
Figure 4: The LDF is still empty
Figure 4: The LDF is still empty

2. Vergrößerung des Logfiles

Sowohl auf NODE01, als auch auf NODE02 ist nach dem dem Einfügen von 500.000 Zeilen das LDF File auf der Festplatte gewachsen und sein Füllungsgrad beträgt nahezu 100%:
Figure 5: Enlarged LDF
Figure 5: Enlarged LDF
Figure 6: LDF (nearly) 100% filled
Figure 6: LDF (nearly) 100% filled

3. Die reguläre Logfile-Verkleinerung funktioniert nicht

Um das Logfile zu verkleinern, müssen normalerweise die Schritte aus A. und B. unternommen werden
A. Reguläre Schritte zur Verkleinerung des LDF - anwendbar in einer AON- und einer Nicht-AON-Umgebung:
  • - 1. Sicherung des Logfiles
  • - 2. Ausführen des Checkpoint-Prozesses mit dem Befehl CHECKPOINT
  • - 3. Physische Verkleinerung des Logfiles mit DBCC SHRINKFILE(...)
B. Workaround - falls DBCC SHRINKFILE nicht den gewünschten Erfolg zeigt. Die Schritte sind nur anwendbar in einer Nicht-AON-Umgebung:
  • - 1. Temporäres Wechseln in den Recovery Mode SIMPLE und zurück
  • - 2. Vollständige Sicherung der Datenbank
  • - 3. Optional: Sicherung des Logfiles
  • - 4. Erneutes Ausführen von DBCC SHRINKFILE
In der Test-Umgebung werden die Schritte aus A. ausgeführt. Der letzte Befehl endet mit einem Warn-Hinweis. Dies kann sowohl in einer AON- und Nicht-AON-Umgebung gelegentlich passieren und macht die Schritte aus B. notwendig. Auf der Festplatte hat sich keine Änderung ergeben:
Figure 7: LDF cannot be shrinked
Figure 7: LDF cannot be shrinked
Ein Versuch, die Schritte aus B. zu unternehmen, endet wie erwartet mit einer Fehlermeldung. Die Datenbank [ClusDB01] kann nicht in den SIMPLE Recovery Mode geschaltet werden, weil sie Teil einer AON-Gruppe ist:
Figure 8: AON requires FULL Recovery Mode
Figure 8: AON requires FULL Recovery Mode

4. Sicherung auf ein NUL-Device

Statt temporär in den SIMPLE Mode zu switchen, um indirekt das Truncate einzuleiten, kann auch auf ein NUL-Device gesichert werden. Danach funktioniert der Shrink-Befehl. Auf beiden Knoten wird dadurch das LDF physisch verkleinert:
Figure 9: Backup to NUL Device
Figure 9: Backup to NUL Device
Bitte beachten Sie auch Folgendes:
  • - Das Logfile ist - je nach Betrachtungsweise - sowohl durch den Recovery Mode Switch, als auch durch das Nul-Device-Backup beschädigt. Dadurch ist die Backup Chain unterbrochen. Vollständige Sicherungen, die vor der NUL-Device-Sicherung durchgeführt wurden, können nicht mehr für ein Point-In-Time Recovery verwendet werden. Dies gilt für den Fall, dass der Point-In-Time nach dem Recovery Mode Switch liegt
  • - Um weitere Datenverluste zu vermeiden, muss unbedingt eine vollständige Sicherung durchgeführt werden
Die Vorgehensweise dieses Artikels ist weder von MS dokumentiert, noch in den Internet Communities. Sie wurde in meiner Test-Umgebung validiert. Bitte führen Sie eigene Tests in Ihrer Prod-Umgebung durch.