Warum wächst das Transaktionsprotokoll im einfachen Wiederherstellungsmodus mit nächtlichen Sicherungen weiter?


24

Bevor ich sofort als Duplikat markiere , habe ich Mike Walshs Warum wächst das Transaktionsprotokoll weiter oder es steht nicht mehr genügend Speicherplatz zur Verfügung? , aber ich glaube nicht, dass es eine Antwort auf meine Situation gab. Ich habe ein Dutzend ähnlicher Fragen durchgesehen, aber die relevanten Fragen haben meistens nur "Duplikat" gesagt und auf Mikes Frage hingewiesen.

Details: Ich habe eine Menge von ~ 500 MB Datenbanken auf SQL Server 2008 R2, alle im einfachen Wiederherstellungsmodus (nicht meine Wahl), nächtliche vollständige Sicherungen, mit ~ 200 MB Datendateien und ~ 300 MB Protokolldateien. Das Protokoll wächst nicht sofort auf 300 MB, sondern langsam im Laufe von ein paar Monaten. Es gibt keine offenen Transaktionen für eine von ihnen, zumindest gemäß sp_who2 und dem Aktivitätsmonitor. Wenn ich mit der rechten Maustaste auf die Datenbank klicke und Eigenschaften auswähle, wird mir mitgeteilt, dass ~ 50 MB frei sind. Sollte nicht gerade nach einer Sicherung das gesamte Protokoll frei sein? Sollte das Protokoll im SIMPLE-Modus nicht frei sein, solange keine Transaktion offen ist?

log_reuse_wait_descfrom sys.databasessays sagt "NOTHING", was auf der Basis der oben genannten Frage und Antwort besagt, dass es auf nichts warten sollte, um den Platz wiederzuverwenden.

Wenn ich 'DBCC SHRINKFILE' verwende, wird die Protokolldatei auf 1 MB verkleinert, sodass sie bereit ist, den Speicherplatz zurückzugewinnen. Ich kann etwas einrichten, das die Protokolle wöchentlich verkleinert und verhindert, dass Dinge außer Kontrolle geraten, aber ich bin verwirrt, warum SQL Server mich dazu zwingt, das zu tun.

Ich kann verstehen, ob es eine verrückte Transaktion gab, für deren Protokollierung 300 MB erforderlich waren, aber wir tun nichts Extremes, nur einfaches OLTP. Aus Mikes Frage / Antwort:

Einfaches Wiederherstellungsmodell - Mit der obigen Einführung ist es am einfachsten, zuerst über das einfache Wiederherstellungsmodell 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.) Benötigen Sie es länger für diesen Absturz- / Neustart-Wiederherstellungszweck, fahren Sie fort und verwenden Sie die Protokolldatei erneut.

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.

Es wird immer wieder gesagt, dass der Protokollspeicherplatz wiederverwendet werden sollte, aber angesichts dieses langsamen Wachstums im Laufe der Monate scheint es nicht so zu sein.

Was vermisse ich? Hält etwas SQL Server davon ab, die Daten als "gehärtet" zu erkennen und das Protokoll freizugeben?

(edit) Der After Action Report - AKA ein wenig Wissen ist gefährlich

Nachdem ich herausgefunden hatte, dass dies eine "populäre Frage" ist, hatte ich das Gefühl, eine Erklärung dafür zu haben, was vor sieben Monaten passiert ist und was ich gelernt habe, um einigen anderen Menschen hoffentlich Trauer zu ersparen.

Zunächst ist der in SSMS verfügbare Speicherplatz, wenn Sie die Eigenschaften einer Datenbank anzeigen, der in der Datendatei verfügbare Speicherplatz. Sie können dies anzeigen, indem Sie Folgendes in einer Datenbank ausführen. Der von SSMS gemeldete verfügbare Speicherplatz ist der Unterschied zwischen FileSizeMB und UsedSpaceMB:

SELECT
    DB.name,
    MF.physical_name,
    MF.type_desc AS FileType,
    MF.size * 8 / 1024 AS FileSizeMB,
    fileproperty(MF.name, 'SpaceUsed') * 8/ 1024 AS UsedSpaceMB,
    mf.name LogicalName
FROM
    sys.master_files MF
    JOIN sys.databases DB ON DB.database_id = MF.database_id
WHERE   DB.name = 'yourdatabasename'

Dies hat bestätigt, dass wir unter normalen Umständen sehr wenig Protokollspeicher (20 MB oder weniger) verwendet haben, aber dies führt zum zweiten Element ...

Zweitens war meine Wahrnehmung der wachsenden Protokolle die eines langsamen Verlaufs der Zeit. In Wirklichkeit wuchsen die Protokolle jedoch in den Nächten, in denen der für das Anwenden von Patches für diese Drittanbieteranwendung Verantwortliche Patches anwendete, rapide. Der Patch wurde als einzelne Transaktion ausgeführt. Je nach Patch benötigten die 200-MB-Daten 300 MB Protokoll. Der Schlüssel, um dies festzustellen, war die Anfrage von Aaron Bertrand unter https://sqlblog.org/2007/01/11/reviewing-autogrow-events-from-the-default-trace

DECLARE @path NVARCHAR(260);

SELECT 
    @path = REVERSE(SUBSTRING(REVERSE([path]), 
    CHARINDEX('\', REVERSE([path])), 260)) + N'log.trc'
FROM    sys.traces
WHERE   is_default = 1;

SELECT 
   DatabaseName,
   [FileName],
    SPID,
    Duration,
    StartTime,
    EndTime,
    FileType = CASE EventClass 
       WHEN 92 THEN 'Data'
       WHEN 93 THEN 'Log'
    END
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE
    EventClass IN (92,93)
ORDER BY
    StartTime DESC;

Dies zeigte, dass das Protokoll an bestimmten Abenden wuchs, wenn der Kunde die Datenbank nicht benutzte. Das führte zu einem Gespräch mit dem Typen, der die Patches anbrachte und die Antwort auf das Rätsel gab.

Nochmals vielen Dank für Leute, die mir geholfen haben, die Antwort zu finden.


Tatsächlich habe ich selbst ein ähnliches Phänomen bei einer der Standortdatenbanken meiner Kunden mit dem SIMPLE-Wiederherstellungsmodell beobachtet. Die Protokolle wachsen nicht (jedenfalls noch), aber der verwendete Speicherplatz in den Log - Dateien nicht durch ein klein wenig jede Nacht wachsen. Und das passiert, wenn die Datenbanksicherung ausgeführt wird. Ich habe noch nicht herausgefunden, was es verursacht oder ob es ein Problem ist oder nicht.
RBarryYoung

Antworten:


20

Es ist für uns unmöglich zu erraten, was es verursacht, aber SQL Server vergrößert nicht nur eine Protokolldatei auf 300 MB, sondern auch auf 300 MB, da dies irgendwann seit Ihrem letzten Verkleinerungsvorgang erforderlich war viel Speicherplatz (egal ob aufgrund einer großen Einzeltransaktion oder vieler kleinerer gleichzeitiger Transaktionen). Sie müssen das Wachstum von Protokolldateien nachverfolgen (ich habe hier und hier darüber gesprochen ), um einzugrenzen, wann oder warum dies geschieht (auch wenn die Einstellung für das Wachstum von Protokolldateien 300 MB oder etwas beträgt, wird sie um 300 MB zunehmen sobald es mehr als 1 MB Speicherplatz für aktive Transaktionen benötigt).

Warum sollten Sie die Protokolldatei nach Erreichen von 300 MB verkleinern? Haben Sie tatsächlich alle Antworten auf Mikes Frage gründlich gelesen ? Die Protokolldatei wird NICHT von selbst verkleinert, da das Verkleinern der Protokolldatei auf 1 MB - nur damit sie bei Ihren größten Transaktionen wieder wachsen kann - eine reine Zeitverschwendung ist. Was machen Sie in der Zwischenzeit mit all dem freien Speicherplatz?


Ich glaube nicht, dass wir etwas tun, das 300 MB Protokoll erfordert, aber selbst wenn wir es getan hätten, würde es dann nicht als freier Speicherplatz in der Datenbank angezeigt werden? Wenn Sie sich die Eigenschaften der Datenbank in SQL Server Management Studio ansehen, ist die Größe die Größe der Daten und des Protokolls, und ich würde erwarten, dass der freie Speicherplatz der freie Speicherplatz für die Daten und das Protokoll ist. Wird der freie Speicherplatz im Protokoll nicht angezeigt? Dass es nicht als kostenlos angezeigt wurde, schien noch in Gebrauch zu sein, aber es gab keine Aktivitäten in der Datenbank.
DerekCate

1
Nein, sobald es fertig ist, wird es nicht automatisch zu freiem Speicherplatz. Die festgeschriebenen Transaktionen werden nicht auf Null gesetzt, ihr Speicherplatz wird lediglich als zur Wiederverwendung verfügbar markiert.
Aaron Bertrand

1
@DerekCate "Ich glaube nicht, dass wir etwas tun, das 300 MB Protokoll erfordert" ... Sie wären überrascht, dass die Wiederverwendung des Transaktionsprotokolls nicht viel kostet. Denken Sie nicht an die Arbeitsbelastung, da dies nicht immer der Grund ist.
Thomas Stringer

Okay, nur um zu bestätigen, dass ich das richtig verstehe, wird das 300-MB-Protokoll, auch wenn es derzeit nicht benötigt wird, nicht als freier Speicherplatz angezeigt, sondern wiederverwendet. Irgendwann waren 300 MB für die Abwicklung einiger Transaktionen erforderlich. Ok, neue Dinge zu untersuchen. Vielen Dank!
DerekCate

1
Eine weitere Überlegung: Ein automatischer Prüfpunkt für eine einfache Wiederherstellungsdatenbank wird erst in die Warteschlange gestellt, wenn das Protokoll bereits zu 70% voll ist. Abhängig vom Timing benötigen Sie möglicherweise nicht allzu viel Protokollaktivität, um zu Wachstum zu führen.
Paul White sagt GoFundMonica

6

Alle aktuellen Tests ( DBCC SHRINKFILE, log_reuse_wait_desc) erweisen sich einfach , dass gerade jetzt wiederverwenden Sie die geeignete virtuelle Protokolldateien des Transaktionsprotokolls. Wenn Ihre automatischen Wachstumsereignisse jedoch in Ihrer Transaktionsprotokolldatei auftreten, ist dies eine Reaktion darauf, dass das Protokoll nicht wiederverwendet werden kann.

Oft ist dies kein andauernder Zustand (genau so, wie es Ihnen gerade vorkommt, wenn Sie gerade keine Symptome bemerken). Es gibt eine Handvoll Dinge, die dieses Verhalten verursachen können, selbst im einfachen Wiederherstellungsmodell.

Am besten richten Sie einen Datenerfassungsjob ein, um routinemäßig die Daten log_reuse_wait_descfür Ihre Datenbank abzurufen und diese routinemäßig irgendwo zu protokollieren. Dann sollten Sie in der Lage sein, die Ursache für die fehlende Wiederverwendung von Protokollen zurückzuentwickeln.

Es wird immer wieder gesagt, dass der Protokollspeicherplatz wiederverwendet werden sollte, aber angesichts dieses langsamen Wachstums im Laufe der Monate scheint es nicht so zu sein.

Wie ich oben erwähnte, ist es nicht in der Regel eine laufende Bedingung , dass das Fehlen von Transaktionsprotokoll Wiederverwendung verursacht (save ein paar Sonderfälle, wie schlecht konstruiert Transaktionen), so würde man die Zeiten genau feststellen müssen, wenn dies ist passiert. Die leichte Diagnosedatensammlung sollte ein guter Anfang sein.


Wenn er sieht, dass 50 MB frei sind und ein 300-MB-Protokoll fn_DBLOG () ihm einen Einblick in die zunehmende Größe seines Protokolls geben würde?
Kenneth Fisher

0

Haben Sie die automatische Verkleinerung für die DBs aktiviert? Und / oder haben Sie geplante Wartungspläne für die Indexwiederherstellung?

Eine automatische Verkleinerung, gefolgt von einer Indexpflege, erzeugt ein signifikantes Protokollvolumen.

Die Indexwartung allein führt auch zu einem signifikanten Protokollvolumen, wenn DB-Entwurfsprobleme wie Clustered-Indizes für GUIDs auftreten.


Die automatische Verkleinerung ist in den DBs nicht aktiviert. Wir versuchen , eine Indexfragmentierung zu vermeiden. Brentozar.com/archive/2009/08/… . Wir haben wöchentliche Integritätsprüfungen, aber ich glaube nicht, dass ein Index als Teil davon neu erstellt wird. Ich muss das untersuchen. Abgesehen davon, keine GUIDs, hat jede Tabelle eine Identitätsspalte, die der Primärschlüssel ist.
DerekCate

-3
 create table #dblog (Databasename varchar(100),
                     logsize float,
                     logspace%] float,
                     [Status] int)

 insert into #dblog
 EXEC ('DBCC sqlperf(logspace)') 

 select * from #dblog

 alter table #dblog 
 add [lgspace used GB] float;

 update #dblog 
 set [lgspace used GB ] = (logsize*[logspace%]/1024)

 update #dblog 
 set [logsize] =([logsize]/1024)

 alter table #dblog 
 drop column [Status];

 select * from #dblog

 drop table #dblog
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.