Gibt es eine Möglichkeit, die Größe von tempdb.mdf zu verringern / zu verkleinern, ohne SQL Server neu zu starten?

15

Ist es notwendig , SQL Server nach dem Neustart DBCC SHRINKFILEauf tempdb.mdfoder gibt es eine andere Methode , um die Größe zu reduzieren , tempdb.mdfohne dass ein Neustart von SQL Server?

Bitte helfen Sie mir, da ich dies für einen Produktionsserver benötige und ich hoffe, das Verkleinern ohne Ausfallzeit durchführen zu können.

Manii
quelle
2
DBCC SHRINKFILE erfordert keinen Neustart des Dienstes.
Greg
Sie können das Tempdb nicht verkleinern, wie es verwandt wird. Und ja, es gibt eine Lösung dafür, aber sie ist nicht sehr sauber und hat einige Nebenwirkungen.
Ionische

Antworten:

15

Das können Sie so machen:

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

Der letzte Schritt ist der schwierigste. Während des Verkleinerungsprozesses sollte keine andere Aktion das Tempdb verwenden, da dies einen Abbruch Ihres SHRINKFILEVorgangs verursachen könnte. Aufgrund der Tatsache, dass das Tempdb ziemlich einfach zu verkleinern ist, sollte es nicht zu lange dauern, es zu verkleinern.

Beachten Sie, dass dies so etwas wie ein "weicher Neustart" ist. Alles wird aus den Puffern entfernt und auf die Disc geschrieben. Dies hat Auswirkungen auf Ihr E / A-Subsystem (Schreiben), da es alle Schreibvorgänge ausführen muss. Danach können Sie die Datei verkleinern (was sich auf die Lese- und Schreibleistung auswirkt), und am Ende müssen alle Prozesse, die eine Tabelle abfragen, die Daten vom E / A-Subsystem in die Puffer zurückholen. Dies kann mehr als einen Neustart schaden.

Wenn Sie ein Entwicklungssystem ausführen, sollten Sie den Computer nur auf diese Weise neu starten. Auf einigen Produktionssystemen ohne Failover-Partner kann dies jedoch hilfreich sein.

Ionic
quelle
danke Ionic für die nette Erklärung. tempdb.mdf hat in meinem Fall 46 GB. Wenn keine Transaktionen stattfinden, kann ich sie auf 100% verkleinern. Bitte vorschlagen.
Manii
Ja, der 40960MB ist nur ein Beispiel. Auf meinem System läuft die Tempdb normalerweise mit ~ 50GB und wächst in seltenen Fällen auf 200GB. :-)
Ionic
<pre> Ich führe die Abfrage als DBCC SHRINKFILE (tempdev, 1024) aus. </ b> </ b> Und es hat den Speicherplatz erfolgreich freigegeben, aber ich führe sie erneut wie </ b> aus. </ b> Ich führe die Abfrage als aus DBCC SHRINKFILE (tempdev, 30000); </ b> </ b> Und es gab mir folgendes Ergebnis: </ b> </ b> DbId-Feld Aktuelle Größe Mindestgröße Verwendete Seiten Geschätzte Seiten </ b> 2 1 5699352 1024 696 696 </ b> </ b> Die aktivierte Tempdb-Größe wurde jedoch nicht reduziert. </ Pre>
Manii
Diese Meldung kann auftreten, wenn eine Transaktion beim Verkleinern das Tempdb verwendet. Es kann auch sein, dass Ihre definierte Verkleinerungsgröße (~ 30 GB) über der freien Grenze Ihrer Tempdb liegt.
Ionische
1

Sie können nur mit dem unteren Schritt gehen

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;
JERRY
quelle
Wie unterscheidet sich Ihre Antwort von der obigen?
Kin Shah
1
Hallo Kin, Tempdb Dateigröße wird mit DBCC FREEPROCCACHE reduziert; und verkleinern Sie dann die Tempdb-Datei. Die folgende Anweisung ist für "shrink tempdb" nicht erforderlich. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ('ALL'); DBCC FREESESSIONCACHE;
JERRY
1
Dies ist die einfachere Antwort. In den meisten Fällen wird nur DBCC FREEPROCCACHE benötigt, damit Sie die temporäre Datenbank verkleinern können. Siehe verwandte Frage
James Jenkins