Ich habe eine Datenbank, auf die ungefähr 50 Clients über TDS über TCP zugreifen, die anscheinend keinen Protokollspeicherplatz freigibt. Die Anzahl der Prozesse bleibt bei den erwarteten 50, und einige von ihnen sind ziemlich langlebig (> 120 Tage).
Die Datenbank verfügt jetzt über 40 GB Protokollspeicher (nur 14 GB Daten), 39 GB frei. Aus Platzgründen auf dem Laufwerk möchte ich auf etwas Vernünftigeres (10 GB) schrumpfen. Wenn ich ausführe DBCC SHRINKFILE('db_log', 10000)
, wird ein Fehler zurückgegeben, dass das Ende des Protokolls verwendet wird.
Um den freien Zugriff auf das Ende des Protokolls zu ermöglichen, habe ich versucht, die Datenbank wie folgt in den Einzelbenutzermodus zu versetzen:
ALTER DATABASE db SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE db SET MULTI_USER
GO
Das Skript gibt jedoch die folgende Nachricht zurück, die hunderte Male wiederholt wurde:
Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.
Was mich glauben lässt, dass ich irgendwo einige Transaktionen nicht festschreibe. Mir ist kein Prozess bekannt, der absichtlich so viele Transaktionen gleichzeitig eröffnen würde. Ich denke, sie müssen sich im Laufe der Zeit ansammeln und werden niemals abgeschlossen.
Frage: Wie finde ich den fehlerhaften Prozess oder das fehlerhafte Skript oder warum wird das Protokoll nicht freigegeben?
sys.dm_tran_active_transactions
zeigt vernünftige 18 Transaktionen mit verständlichen Zwecken. sp_who
zeigt nur die Prozesse, die mir bekannt sind.
SQL Server-Version:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
Serverversion:
Windows Server 2008 R2 x64 - Datacenter 4 vCPUs, 16 GB Speicher, Durchlaufdatenträger für Daten und Protokoll, Betriebssystemdatenträger ist VHD
unter Hyper-V (Windows Server 2008 R2 SP1 x64-Datencenter) Dual Intel X5650 (6 Kerne, 12 Threads bei 2,67 GHz) 72 GB Speicher
Hypervisor verfügt nur über drei VMs und weist keinen hohen Ressourcenverbrauch auf. SQL Server VM zeigt ~ 40% CPU unter Last und 99% Cache-Treffer.
quelle
Antworten:
Es gibt einen SQL-Befehl, der OPEN-Transaktionen anzeigt. (DBCC OPENTRAN)
http://msdn.microsoft.com/en-us/library/ms182792.aspx
Zeigt Informationen zur ältesten aktiven Transaktion und zu den ältesten verteilten und nicht verteilten replizierten Transaktionen in der angegebenen Datenbank an. Ergebnisse werden nur angezeigt, wenn eine Transaktion aktiv ist oder wenn die Datenbank Replikationsinformationen enthält
quelle
Aus irgendeinem Grund schien nichts die Protokolldatei offen zu halten. Durch Ausführen mehrerer Protokollsicherungen (> 10) wurde das Ende des Protokolls freigegeben und das Verkleinern kann auftreten. Ich weiß nicht warum ... aber es hat funktioniert.
quelle
Wenn ich Ihre Frage richtig verstehe, haben Sie ein 40-GB-Transaktionsprotokoll mit 39 GB kostenlos? Das Protokoll ist eine kreisförmige Struktur, die aus kleineren virtuellen Protokolldateien besteht. Jedes Mal, wenn eine VLF voll ist, verwendet SQL die nächste VLF. (Nicht unbedingt in derselben Reihenfolge wie die VLFs in der Datei). Wenn Sie die Protokolldatei verkleinern, wird freier Speicherplatz vom ENDE des Protokolls freigegeben. Wenn sich der aktive Teil des Protokolls am Ende befindet, kann kein Speicherplatz freigegeben werden. Wenn er sich irgendwo in der Mitte befindet, können Sie nur einen Teil des Speicherplatzes zurückfordern. DBCC LOGINFO zeigt Ihnen alle VLFs im Protokoll und einen Status an, der anzeigt, dass VLF derzeit ein aktives Protokoll enthält. Ich glaube, dass Status 2 aktiv und 0 inaktiv ist. Ich bin sicher, Google kann bei Bedarf weitere Informationen bereitstellen.
Wenn Ihr Problem nur darin besteht, dass der aktive Teil gerade am Ende ist, warten Sie am besten, bis er wieder zum Start rollt, und verkleinern Sie dann das Protokoll. Dies kann überraschend lange dauern, seien Sie geduldig. Es wird dort ankommen.
Denken Sie auch daran, dass, wenn JEDER Teil einer VLF derzeit aktiv ist, die gesamte VLF aktiv bleibt.
Sie sollten jedoch die Größe der Protokolldatei überwachen. Wenn sie unerwartet wieder wächst, müssen Sie die Ursache untersuchen. Sie sollten ein unnötiges Verkleinern der Protokolldatei vermeiden. Wenn sie erneut wächst, kann dies die Leistung beeinträchtigen.
Weitere Informationen zu VLFs finden Sie in Kimberly Tripps Blogpost hier .
quelle
DBCC LOGINFO
Befehl, ich wusste nichts davon. Davon abgesehen bin ich mir der Struktur des Protokolls bewusst und denke nicht daran, die Datei unnötig zu verkleinern. Wie bereits erwähnt, verwenden wir in unserer aktuellen Sicherungsstruktur nur regelmäßig etwa 1 GB Protokoll, und ich möchte einen Teil des freien Speicherplatzes zurückfordern. Das Problem ist, dass der Protokollspeicherplatz am Ende des Protokolls auch nach mehreren Wochen Wartezeit nicht freigegeben wird. Während dieser Zeit hatte die Datenbank viele vollständige und Protokoll-Backups, was mich glauben lässt, dass etwas das natürliche Kreisen verhindert.