SQL-Sessions trennen vor DBCC SHRINKFILE
Hallo,
ich habe ein kleines Problem mit meinem neu aufgesetzten SQL-Server 2005. Ich möchte die physische Dateigröße des Transaktionsprotokolls einer Datenbank verringern (mittlerweile ca. 65 GB!).
Hierzu lasse ich folgendes Script laufen:
Auf dem alten Server (auch 2005) lief das per Task nachts problemlos. War ja auch keiner weiter eingeloggt.
Bei dem neuen klappt es aber nicht. Es kommt dann nur die folgende Meldung:
"Cannot shrink log file 2 (MeineDB_Log) because all logical log files are in use."
Wenn ich die Zugriffe auf die Datenbank per Script abrufe sehe ich auch mehrere Einträge, obwohl diese User definitiv keine Verbindung zur Datenbank zu diesem Zeitpunkt haben.
Irgendwie scheinen sie nicht sauber getrennt zu werden.
Selbst wenn ich die Datenbank als "SINGLE_USER" setze sehe ich sie noch und kann bekomme dann die gleiche Meldung.
Warum werden diese User nicht sauber getrennt? Gibt es da eine generelle Einstellung? oder wie kann ich sie ganz hart rauswerfen?
Torsten
ich habe ein kleines Problem mit meinem neu aufgesetzten SQL-Server 2005. Ich möchte die physische Dateigröße des Transaktionsprotokolls einer Datenbank verringern (mittlerweile ca. 65 GB!).
Hierzu lasse ich folgendes Script laufen:
USE MeineDB
CHECKPOINT
BACKUP LOG MeineDB WITH NO_LOG
DBCC SHRINKFILE(MeineDB_Log,NOTRUNCATE)
DBCC SHRINKFILE(MeineDB_Log,TRUNCATEONLY)
Auf dem alten Server (auch 2005) lief das per Task nachts problemlos. War ja auch keiner weiter eingeloggt.
Bei dem neuen klappt es aber nicht. Es kommt dann nur die folgende Meldung:
"Cannot shrink log file 2 (MeineDB_Log) because all logical log files are in use."
Wenn ich die Zugriffe auf die Datenbank per Script abrufe sehe ich auch mehrere Einträge, obwohl diese User definitiv keine Verbindung zur Datenbank zu diesem Zeitpunkt haben.
Irgendwie scheinen sie nicht sauber getrennt zu werden.
Selbst wenn ich die Datenbank als "SINGLE_USER" setze sehe ich sie noch und kann bekomme dann die gleiche Meldung.
Warum werden diese User nicht sauber getrennt? Gibt es da eine generelle Einstellung? oder wie kann ich sie ganz hart rauswerfen?
Torsten
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 136023
Url: https://administrator.de/forum/sql-sessions-trennen-vor-dbcc-shrinkfile-136023.html
Ausgedruckt am: 09.04.2025 um 01:04 Uhr
4 Kommentare
Neuester Kommentar
Hallo,
eventuell funktioniert es so.
Der erste Befehl bewirkt, dass die Datenbank in den Single-User-Mode gesetzt wird und fährt dabei gleichzeitig alle offenen Transaktionen zurück
Beim zweiten wird die Datenbank wieder in den Normal-Mode zurückgesetzt.
Allerdings würde ich zuerst abklären wieso Connections offen bleiben. Eventuell arbeitet die Client-Software nicht sauber.
eventuell funktioniert es so.
ALTER DATABASE [TestDb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 2
ALTER DATABASE [TestDB] SET MULTI_USER
Beim zweiten wird die Datenbank wieder in den Normal-Mode zurückgesetzt.
Allerdings würde ich zuerst abklären wieso Connections offen bleiben. Eventuell arbeitet die Client-Software nicht sauber.
Moin TorstenB,
Schau mal bitte im Enterprise Manager bei alter (falls noch vorhanden) und neuer Datenbank unter (neudeutsch: ) "Properties", "Options", "Recovery Mode (FULL oder SIMPLE) und vermutlich auf deutsch "Eigenschaften", "Optionen", "Wiederherstellungmodus?".
SIMPLE Recovery ist zwar nichts, was einer Prod-DB angetan werden sollte, aber wenn ihr eh Transactions-Logs jede Nacht verkürzt... *lach*
Wie kommt ihr denn auf den Bolzen, dass das halb-manuell per Skript gemacht werden muss? Jede Nacht, wenn normale DBs schlafen?
Das Transaction-Log sollte eigentlich immer eine konstante (physische/von außen erkennbare) Größe behalten und NUR verkleinert werden, wenn abzusehen ist, dass es auch nie nie wieder auf die einmal erreichte Größe anwachsen wird (z.B. weil der Server nicht mehr 5000 Tabellen und 10 Appz & DBs beherbergt, sondern nur noch 200 Tabellen und 1 Appz).
Wenn ihr meint, der Server braucht mehr freien Plattenplatz--> auf nach eBucht/DasIsMeinLaden und größere Platte kaufen.
Grüße
Biber
Zitat von @goodbytes:
Hallo Tommy70,
leider funktioniert es so auch nicht. Es ist mir ein echtes Rätsel. Wenn die Datenbank in Beim alten Server hat es mit den
gleichen Clients perfekt funktioniert. Die Clientversionen haben sich auch nicht geändert. Halt nur ein neuer Server.
Torsten
Dann kann es nach menschlichem bzw biberschen Ermessen nur so sein, dass die vorherige vermeintlich baugleiche Serverinstanz im SIMPLE Recoverymodus lief, die neue/jetzige dagegen im FULL Recovery Mode.Hallo Tommy70,
leider funktioniert es so auch nicht. Es ist mir ein echtes Rätsel. Wenn die Datenbank in Beim alten Server hat es mit den
gleichen Clients perfekt funktioniert. Die Clientversionen haben sich auch nicht geändert. Halt nur ein neuer Server.
Torsten
Schau mal bitte im Enterprise Manager bei alter (falls noch vorhanden) und neuer Datenbank unter (neudeutsch: ) "Properties", "Options", "Recovery Mode (FULL oder SIMPLE) und vermutlich auf deutsch "Eigenschaften", "Optionen", "Wiederherstellungmodus?".
SIMPLE Recovery ist zwar nichts, was einer Prod-DB angetan werden sollte, aber wenn ihr eh Transactions-Logs jede Nacht verkürzt... *lach*
Wie kommt ihr denn auf den Bolzen, dass das halb-manuell per Skript gemacht werden muss? Jede Nacht, wenn normale DBs schlafen?
Das Transaction-Log sollte eigentlich immer eine konstante (physische/von außen erkennbare) Größe behalten und NUR verkleinert werden, wenn abzusehen ist, dass es auch nie nie wieder auf die einmal erreichte Größe anwachsen wird (z.B. weil der Server nicht mehr 5000 Tabellen und 10 Appz & DBs beherbergt, sondern nur noch 200 Tabellen und 1 Appz).
Wenn ihr meint, der Server braucht mehr freien Plattenplatz--> auf nach eBucht/DasIsMeinLaden und größere Platte kaufen.
Grüße
Biber