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_transactionszeigt vernünftige 18 Transaktionen mit verständlichen Zwecken. sp_whozeigt 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.