Das Transaktionsprotokoll
Zurück
Anzeigen der virtuellen Blöcke
Verkürzen des Transaktionsprotokolls
Theoretisches
Falls die Transaktionseinträge nie aus dem Transaktionsprotokoll gelöscht werden, wird das Protokoll so lange größer, bis es den gesamten verfügbaren Speicherplatz einnimmt, der auf dem Datenträger vorhanden ist, auf dem sich das Protokoll befindet. Von Zeit zu Zeit müssen alte Protokolleinträge, die für die Wiederherstellung einer Datenbank nicht mehr benötigt werden, gelöscht werden, um Speicherplatz für neue Protokolleinträge freizugeben. Der Vorgang, durch den diese Protokolleinträge gelöscht werden, wird als Abschneiden des Protokolls oder Protokollkürzung bezeichnet.
Wenn Microsoft SQL Server die Sicherung des Transaktionsprotokolls beendet, wird der inaktive Abschnitt des Transaktionsprotokolls abgeschnitten. SQL Server verwendet dann diesen abgeschnittenen, unbenutzten Bereich des Transaktionsprotokolls erneut; somit wird das Protokoll nicht weiter vergrößert und belegt keinen zusätzlichen Speicherplatz. Der inaktive Abschnitt des Transaktionsprotokolls ist der Teil des Transaktionsprotokolls, der beim Wiederherstellungsvorgang für die Datenbank beim Starten von SQL Server nicht mehr benötigt wird, da alle in diesem Teil des Protokolls enthaltenen Transaktionen vollständig sind. Im Gegensatz dazu sind im aktiven Abschnitt des Transaktionsprotokolls Transaktionen enthalten, die noch immer ausgeführt werden und noch nicht abgeschlossen sind.
Der Endpunkt des inaktiven Abschnitts des Transaktionsprotokolls (und somit der Punkt, an dem das Protokoll abgeschnitten wird) wird von dem Ereignis bestimmt, das von den folgenden am ehesten eintritt:
- Der letzte Prüfpunkt.
Dies entspricht dem frühesten Punkt, an dem SQL Server einen Rollforward der Transaktionen während einer Wiederherstellungsoperation ausführen müsste.
- Der Anfang der ältesten aktiven Transaktion; eine Transaktion, für die noch kein Commit oder Rollback ausgeführt wurde.
Dies entspricht dem frühesten Punkt, zu dem SQL Server einen Rollback der Transaktionen während eines Wiederherstellungvorgangs ausführen müsste.
- Der Anfang der ältesten Transaktion, die für die Replikation veröffentlichte Objekte beinhaltet und deren Änderungen bisher noch nicht repliziert wurden.
Dies entspricht dem frühesten Punkt, den SQL Server noch replizieren muss.
- Der Anfang der ältesten CREATE INDEX-Operation, für die der Protokolleintrag für die Beendigung noch nicht gesichert wurde.
Der aktive Teil des Transaktionsprotokolls kann nie abgeschnitten werden. Der aktive Teil des Protokolls ist der Teil des Protokolls, der erforderlich ist, um eine Datenbank jederzeit wiederherstellen zu können. Er muss für den Fall, dass der Server ausfällt, immer in der Datenbank vorhanden sein, da er erforderlich ist, um die Datenbank beim Neustart des Servers wiederherzustellen. Der Eintrag am Anfang des aktiven Teils des Protokolls wird durch die Mindestwiederherstellungs-Protokollsequenznummer (MinLSN) identifiziert.
Transaktionsprotokolle werden intern in Abschnitte aufgeteilt, die als virtuelle Protokolldateien bezeichnet werden. Virtuelle Protokolldateien stellen die Einheiten dar, die abgeschnitten werden können. Wenn ein Transaktionsprotokoll abgeschnitten wird, werden alle Protokolleinträge vor dem Anfang der virtuellen Protokolldatei gelöscht, in der sich die MinLSN befindet. Weitere Informationen zu virtuellen Protokolldateien finden Sie unter Physische Architektur des Transaktionsprotokolls.
Die folgende Abbildung zeigt ein Transaktionsprotokoll mit vier virtuellen Protokollen. Das Protokoll wurde nach der Datenbankerstellung noch nicht abgeschnitten. Das logische Protokoll beginnt am Anfang des ersten virtuellen Protokolls, und der Teil des vierten virtuellen Protokolls, der jenseits des Endes der logischen Datei liegt, wurde noch nicht verwendet.
<--
Beginn des logischen ProtokollsMinLSN
Vorletzter Prüfpunkt
-->Letzter Prüfpunkt
Ende des logischen Protokoll -->Nicht verwendet
Diese Abbildung zeigt das Protokoll, nachdem es abgeschnitten wurde. Die Zeilen vor dem Anfang des virtuellen Protokolls, das den MinLSN-Eintrag enthält, wurden abgeschnitten.
Abgeschnitten Abgeschnitten <--
Beginn des logischen Protokolls
---MinLSN---
Vorletzter Prüfpunkt
-->Letzter Prüfpunkt
Ende des logischen Protokoll -->Nicht verwendet
Kürzungen reduzieren die Größe einer Protokolldatei nicht physisch; sie kennzeichnen lediglich virtuelle Protokolldateien als inaktiv. Das echte Löschen von Teilen der Protokolldatei wird mithilfe der Anweisungen DBCC SHRINKDATABASE und DBCC SHRINKFILE gesteuert. Durch diese DBCC-Anweisungen wird festgelegt, dass die Größe einer Protokolldatei reduziert werden soll, sobald freier Speicherplatz in der Datei verfügbar wird. Eine virtuelle Protokolldatei ist die Einheit, die für Löschoperationen verwendet wird. Virtuelle Protokolle im aktiven Teil des Protokolls können nicht gelöscht werden. Wenn sich alle virtuellen Protokolle einer Protokolldatei im aktiven Teil des Protokolls befinden, wird die Datei nicht verkleinert. Eine Verkleinerung erfolgt erst dann, wenn ein oder mehrere virtuelle Protokolle durch eine Kürzung als inaktiv gekennzeichnet werden.
Anzeigen der virtuellen Blöcke
Mit dem Kommando DBCC LOGINFO(<dbname>) werden die einzelnen Blöcke angezeigt. Wo der aktive Teil sich befindet wird mit STATUS=2 gekennzeichnet. Steht der aktive Teil am Ende, kann das Transaktionsprotokoll physisch nicht gekürzt werden.
Verkürzen des Transaktionsprotokolls
Vorleistungen
Die folgende Vorgehensweise entspricht der Microsoft SQL-Server Grundlage.
Mit Hilfe des SQL-Server Tools �Query Analyzer� und als Systemadministrator kann die Verkürzung vorgenommen werden.
� Bevor eine Manipulation eines Transaktionsprotokolls durchgeführt wird ist die System- und Anwenderdatenbank zu sichern
� Während der Verkürzung sollten keine Nutzer die Anwenderdatenbank bearbeiten.
Für die verschiedenen Anwenderdatenbanken sind die Namen der Datenbank und des Transaktionsprotokolles zu ändern.
Verkürzen
Die Verkürzung erfolgt in zwei Schritten (z.B.DB-IFAS):
Schritt 1: Setzen von Prüfpunkten
use IFAS
dbcc loginfo(IFAS)
dbcc shrinkfile (IFAS_protokoll,TRUNCATEONLY)
backup log IFAS with TRUNCATE_ONLY
Schritt 2: Erstellen von �Dummy Transaktionen'
In dem nachfolgenden SQL-Skript sind die Angaben in Zeile 3 und 4 für die verschiedenen Anwenderdatenbanken anzupassen:
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,@MaxMinutes INT, @NewSize INT
USE ifas
SELECT @LogicalFileName = 'ifas_protokoll',
������� @MaxMinutes = 10, @NewSize = 10
DECLARE @OriginalSize int
SELECT @OriginalSize = size
������� FROM sysfiles WHERE name = @LogicalFileName
SELECT 'Aktuelle Größe von ' + db_name() + ' LOG-File ist ' +
������� CONVERT(VARCHAR(30),@OriginalSize) + ' Seiten (8K/Seite), oder ' +
������� CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
������� FROM sysfiles WHERE name = @LogicalFileName
CREATE TABLE DummyTrans (DummyColumn char (8000) not null)
DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
������� @TruncLog = 'BACKUP LOG ['+ db_name() + '] WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog) WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE())
������� AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN
������� SELECT @Counter = 0 WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
������� ������� BEGIN
������� ������� ������� INSERT DummyTrans VALUES ('Fill Log')
������� ������� ������� DELETE DummyTrans
������� ������� ������� SELECT @Counter = @Counter + 1
������� ������� END
������� EXEC (@TruncLog)
END
SELECT 'Neue Größe von ' + db_name() + ' LOG-File ist ' +
������� ������� CONVERT(VARCHAR(30),size) + ' Seiten (8K/Seite) oder ' +
������� ������� CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
������� ������� WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
Sollte keine Verkürzung eintreten, ist die Schrittfolge zu wiederholen.
Alternative Vorgehensweise
Sollte die Standard-Methode nicht zum Erfolg führen, gibt es einen letzen Ausweg.
Diese Methode funktioniert, ist aber von Microsoft nicht offiziell freigegeben, daher kann auch keine Garantie dafür übernommen werden:� SQL-Server herunterfahren (beenden)
o Mit dem Explorer: Löschen der LOG-Datei der entsprechenden Anwenderdatenbank.
� SQL-Server starten
o Nach dem Neustart des SQL-Servers wird automatisch eine neue 2 MB große LOG-Datei angelegt.
Quelle:
Freundlicherweise zur Verfügung gestelltes und leicht modifiziertes Dokument von:
Herr Bernd Pilz,
Landesinstitut für Arbeitsschutz und Arbeitsmedizin, Potsdam
Zurück