andinistrator1
Goto Top

SQL 2008R2 Transaction Log File verkleinern

Hallo zusammen,
zahlreiche Artikel im Internet gibt es zu dem Thema, jedoch werde ich nicht so richtig fündig.

Problembeschreibung

Beim Recovery dauert die Sicherung sehr lange, da der TLF 15x größer ist wie die eigentliche Datenbank.

Fakten:
Ich habe eine DB-Spiegelung laufen, d.h. das Wiederherstellungsmodell muss auf "Vollständig" stehen.

Ich kann zwar per Rechtsklick auf die DB > Tasks > Verkleinern > Datei > Dateityp = Protokoll

99% des TLF freigeben, jedoch pumpt sich dieses beim nächsten Recovery immer wieder auf.

Wie muss ich es richtig machen? Bisher sind es nur drei Schritte:
1. DB Vollsicherung (automatisch in der Nacht)
2. Kopie ins Testsystem
3. Wiederherstellung

Ich bedanke mich für eure Tipps!

Content-ID: 262026

Url: https://administrator.de/contentid/262026

Ausgedruckt am: 24.11.2024 um 17:11 Uhr

Ravers
Ravers 02.02.2015 um 14:03:34 Uhr
Goto Top
Hi,

du kannst in den Eigenschaften der DB das Handling der Log-File beeinflussen.
Hier steht vermutlich (bei Dateien) etwas aller: um 10% vergrößern - unbegrenzt vergrösserbar.
Dies mal ändern, z.B. max Größe 2GB o.ä.
Oder halt DBCC Shrinkfile nach jeder Wiederherstellung machen. Aber ich vermute mal das du das Transactionlog eher selten nutzt, daher empfehle ich die Größenbeschränkung.

greetz
ravers
Andinistrator1
Andinistrator1 02.02.2015 um 15:30:14 Uhr
Goto Top
Vielen Dank ravers,

unter DB Eigenschaften > Dateien ist schonmal die Anfangsgröße viel zu hoch eingestellt, und "Um 10 Prozent, Vergrößerung auf 2097152 MB beschränkt." Dies scheint wohl ein Default Wert zu sein, hier hatte ich nichts verändert.

DBCC SHRINKFILE hatte ich einmal ausgeführt, jedoch bevorzuge ich die grafische Variante, da diese ein besseres Ergebnis liefert.

Im Prinzip entwickeln wir in einem Testsystem, übernehmen diese ins Produktivsystem und packen diesen Stand zurück ins Testsystem. Jedes mal wächste dabei der TLF (logisch) um 15GB, d.h. um die Größe der DB.

Was ich getestet habe:

1. DB Recovery
2. Wiederherstellungsmodell "Einfach"
3. TLF verkleinert

Von über 200GB TLF bin ich damit auf weniger als 1MB gekommen. Spiele ich aber nun das Produktivsystem ins Testsystem zurück, habe ich wieder 200GB.

Ich muss aber die Wiederherstellungsmodell im Produktivsystem auf Vollständig lassen, weil dies Grundlage für die Spiegelung ist... .

Ich weiß meine DB ist 15GB, wenn ich den TLF auf max. 50 GB setze (ca. 3x Änderungen), wie ist es dann in der Praxis? Kommt dann die Meldung Datenbank voll oder überschreibt es die alten Änderungen?
MadMax
MadMax 02.02.2015 um 19:19:15 Uhr
Goto Top
Hallo Andinistrator1,

dein Problem ist, daß Du nur die Datenbank sicherst, aber nicht das Transaktionsprotokoll. Wenn das nicht gesichert wird, dann läuft das voll, bis die Platte dicht ist (oder wenn Du dem Rat von Ravers gefolgt bist, bis das eingestellte Maximum erreicht ist). Wenn das Protokoll dann voll ist gibt es einen Fehler, Du solltest also die Größe des Protokolls nicht begrenzen oder die Grenze recht großzügig bemessen.

Richte Dir einen Job ein der ähnlich Deiner Vollsicherung ist, aber nur das Transaktionslog sichert. Dann wird der gesicherte Teil freigegeben und landet nicht mehr in seiner vollen Größe in der Vollsicherung. Wenn Du die Protokollsicherung z.B. alle Stunde ausführst, dann wächst Dein Protokoll auch nicht mehr so gigantisch an.

Deine erste Protokollsicherung dürfte dann erstmal recht groß ausfallen, weil das Protokoll die ganze Zeit nicht gesichert wurde, die weiteren werden aber dann recht schmal werden.

Gruß, Mad Max
Andinistrator1
Andinistrator1 03.02.2015 aktualisiert um 10:52:36 Uhr
Goto Top
Hallo Mad Max,

vielen Dank, dass erscheint mir mehr als einleuchtend. Nur um zu wissen ob ich es richtig verstanden habe:

Auf einer anderen DB habe ich den sog. "Transaktionsprotokollversand" eingerichtet, um einen Datenstand -15 Minuten im Notfall herstellen zu können (*.TRN Dateien) .

Würde eine Aktivierung dessen auf meiner hier problematischen Datenbank zum gleichen Ergebnis führen...
73b4558842890c90109e1b392e371e39

...oder müsste ich hier einen Job manuell einrichten? Mein Script einer Vollsicherung ist momentan einfach, aber übersichtlich:

"Sichere meine Datenbank in einen Ordner uns lösche alle *.bak Dateien welche älter 3 Tage sind."

---
DECLARE @backuppath varchar(100);
DECLARE @backupquery varchar(500);
DECLARE @deletedate DATETIME = DATEADD(day,-3,GETDATE());

-- set variable
set @backuppath = 'D:\MSSQL\Backup\'
set @dbname = 'DATENBANKNAME'

-- Backup SQL statement
set @backupquery = 'backup database ' + @dbname + ' to disk = ''' + @backuppath + @dbname + '_[' + REPLACE( convert(varchar, getdate(), 126), ':', '-') + '].bak'' WITH FORMAT, INIT, NAME = ''DB_Backup'', SKIP, REWIND, NOUNLOAD, COMPRESSION, STATS = 10 '

-- Execute backup script
EXEC (@backupQuery)

--Cleanup (remove any files older than @deletedate
EXEC master.sys.xp_delete_file 0,@backupPath,'bak',@DeleteDate,0;

GO
---

Den Job lasse ich 1x/Nacht laufen. Ich wüsste spontan nicht, wie ich sonst gezielt die *.LDF (TLF) Datei/Datenbank sichern könnte.
MadMax
MadMax 03.02.2015 um 12:39:43 Uhr
Goto Top
Hallo Andinistrator1,

Protokollversand ist keine Protokollsicherung, dadurch wird Dein Protokoll also nicht freigegeben (soweit ich weiß, bis jetzt hatte ich noch nichts mit Protokollversand zu tun).

Die Sicherung des Transaktionsprotokolls ist nicht so viel anders als die Sicherung der Datenbank. Statt "backup database ..." heißt der Befehl dann "backup log ...". Läßt sich auch sehr schön in der Hilfe vom SQL Server nachlesen.

Gruß, Mad Max
Andinistrator1
Andinistrator1 04.02.2015 aktualisiert um 07:44:01 Uhr
Goto Top
Vielen Dank Mad Max,

es ist Fakt, der Transaktionsprotokollversand hat damit nichts zu tun, ebenso eine tägliche Vollsicherung. Der TLF wird dadruch nicht verkleinert.

Einen Artikel habe ich gefunden, welcher hilfreich war (http://blogs.technet.com/b/austria/archive/2011/03/08/sql-server-the-tr ..), hier wird mit SHRINK gearbeitet.

In meiner Kombination muss ich weiter suchen, da ich eine Datenbankspiegelung (= Wiederherstellungsmodell Vollständig) laufen habe. Hier ist bei Google viel geboten, jedoch auch viele Mutmaßungen. In einer Testumgebung macht es nichts, aber im Produktivsystem bin ich mir noch nicht sicher, ob ich hier einfach mal einen SHRINK Befehl ausführen kann. Funktionieren würde es so:

Wie ist der Name der *.LOG Datei:

SELECT name FROM sys.database_files
WHERE type_desc = 'LOG'

Verkleinern per SHRINKFILE:

DBCC SHRINKFILE ('DATENBANKNAME_log', 1000)

Ich werde deinem Vorschlag nach der Vollsicherung speziell vom TLF nachgehen, vielleicht kannst du mir ja mal ein Script für die TLF Sicherung vorschlagen. Den Zyklus regel ich über die Auftragsplanung.
MadMax
MadMax 04.02.2015, aktualisiert am 06.02.2015 um 08:16:36 Uhr
Goto Top
Hallo Andinistrator1,

grundsätzlich tut dbcc shrinkfile nicht weh, garantieren, daß das bei Euch auch fehlerfrei funktioniert, wird Dir das natürlich keiner.

Und was willst Du für einen Vorschlag für ein Skript? Tausch bei Deinem Backup-Skript für die Vollsicherung das "database" gegen ein "log" aus, dann noch irgendein Kennzeichen beim Dateinamen oder der Erweiterung, daß es sich um die Protokollsicherung handelt, dann hast Du Dein Skript. Oder Du nimmst das aus dem Artikel, den Du gefunden hast. Dadurch, daß Du für jede Sicherung einen eigenen Dateinamen hast und auch nicht auf ein Band sicherst, sind die meisten Schalter sowieso überflüssig.

Mach Deine Protokolldatei nicht zu klein, sonst muß sie nur wieder erweitert werden, was sich dann wieder ungünstig auswirkt (s.a. in dem gefundenen Artikel bei "Shrink File").

Gruß, Mad Max
Ravers
Ravers 04.02.2015, aktualisiert am 06.02.2015 um 08:16:23 Uhr
Goto Top
Hi,
führe folgende Befehle jeweils als eigene Abfrage aus:

DBCC SHRINKFILE (DATENBANKNAME_log,10)

BACKUP LOG DATENBANKNAME WITH TRUNCATE_ONLY

DBCC SHRINKFILE (DATENBANKNAME_log,10)

So wird`s wohl gehen! face-wink

greetz
ravers
Andinistrator1
Andinistrator1 05.02.2015 aktualisiert um 17:07:53 Uhr
Goto Top
Vielen Dank ravers,
ein SHRINKFILE Befehl möchte ich nicht im Produktivsystem ausführen (Bauchgefühl nach einigen Berichten). Ich habe es nun doch geschafft den TLF mit Boerdmitteln zu verkleinern, was mich eigentlich verwundert. Nachdem was ich bisher gelesen hatte, hätte es nicht klappen dürfen.

- Datenbankspiegelung an (unverändert)
=> Wiederherstellungsmodell auf Vollständig (unverändert)
- Vollsicherung 1x/Nacht (siehe Script oben) (unverändert)

NEU
Gestern Transaktionsprotokollversand eingerichtet, seither ist in der Nacht eine Vollsicherung gelaufen.

Ich konnte jedoch heute den TLF genau wie im Testsystem verkleinern, ohne das Wiederherstellungsmodell auf einfach zu setzen. Ich weiß aber nicht warum das nun plötzlich funktioniert hat... :

1df9416ace59ff5b73fb1172e6ac2cc6

VORHER
f7aaaddffd1ebc84ab6badd8f983f2b0

NACHHER
78374767bb30f86abc52062a2646f46b

Mir stellt sich jetzt die Frage ob die Freigabe vom Speicher inkl. Verkleinerung des TLF nicht doch mit dem Transaktionsprotokollversand zusammenhängt?!
Andinistrator1
Andinistrator1 06.02.2015 aktualisiert um 08:17:31 Uhr
Goto Top
Guten Morgen zusammen,

nachdem ich heute morgen nochmal einen Restore gefahren habe kann ich bestätigen, dass der TFL von über 200GB sich im Rahmen (unter 100MB) hält.

Entgegen aller MS zertifizierten Ratgeber gab es bei mir folgenden Lösungsweg:

Datenbankspiegelung (= Wiederherstellungsmodell bleibt Vollständig!)
Vollsicherung 1x/Nacht
Transaktionsprotokollversand eingerichtet alle 15 Minuten

Per Rechtsklick auf den DB ließ sich die DB wie oben beschrieben verkleinern, ich habe die nächtliche Vollsicherung abgewartet.