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_desc
from sys.databases
says 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.