TempDB wird nicht schrumpfen. Keine offenen Transaktionen

9

Ich habe eine TempDB unter SQL 2008, die sehr groß geworden ist (> 40 GB), und ich möchte sie verkleinern. Ich habe die Datenbank dbcc shrinkdatabase, dbcc shrinkfile und den Befehl shrink über Management Studio verwendet.

Ich erhalte folgenden Fehler:

Seite 1: 4573184 konnte nicht verschoben werden, da es sich um eine Arbeitstabellenseite handelt.

Ich konnte durch Ausführen von DBCC FREEPROCCACHE und erneutes Ausführen einer der Schrumpfroutinen etwas Platz zurückgewinnen, um mich aus der Gefahrenzone zu bringen, aber dies ist offensichtlich nicht ideal und wird mir wahrscheinlich nur ein bisschen Zeit verschaffen.

Ich habe DBCC OpenTran ausgeführt und da hängt nichts rum.

Überall, wo ich im Internet gelesen habe, kommt es darauf an, SQL Server zu recyceln ... sicherlich muss es einen besseren Weg geben ... irgendjemand?

Vielen Dank,

Tom

user45117
quelle

Antworten:

7

Hinweis: Dieser Beitrag kann auch nützlich sein:

Probleme mit der TempDB-MDF-Datei nehmen ständig zu

Wenn Sie nicht herausfinden können, welcher Prozess diese Arbeitstabelle verwendet (und sie sicher beenden kann), muss ich dem zustimmen, was Ihre Suchanfragen bereits ergeben haben: Schalten Sie den Server aus und Sie sollten in der Lage sein, Tempdb zu verkleinern.

Eine andere Frage hat sich damit befasst, dies für # temp-Tabellen herauszufinden. Ich weiß nicht, ob es für Arbeitstische angepasst werden kann:

Finden Sie heraus, welche Sitzung welche temporäre Tabelle enthält

Ich habe auch darüber gebloggt (wieder für # temp-Tabellen):

http://sqlperformance.com/2014/05/t-sql-queries/dude-who-owns-that-temp-table

Ich bezweifle, dass die Arbeitstabelle mit der Snapshot-Isolation / dem Versionsspeicher zusammenhängt, aber nur für den Fall:

Suchen Sie nach Transaktionen, die den Versionsspeicher füllen

Verlassen Sie sich auch nicht darauf DBCC OPENTRAN;- ich habe viele Szenarien beobachtet, in denen ich weiß, dass ich eine aktive Transaktion habe, diese aber dort nicht angezeigt wird. Beachten Sie auch, dass der Datenbankkontext wichtig ist. Die Datenbank, in der die Transaktion aktiv ist, ist nicht unbedingt tempdb. Was siehst du hier? Etwas?

SELECT * FROM sys.dm_tran_active_transactions
  WHERE name = N'worktable';

Sobald Sie Tempdb geschrumpft haben

Dies ist natürlich keine dauerhafte Lösung. Du wirst Tempdb verkleinern und dann wird es wieder wachsen. Es kann sehr langweilig und langweilig werden, dieses Spiel jedes Mal zu spielen, wenn es passiert. Und wenn es wieder wachsen wird, was machen Sie in der Zwischenzeit mit diesem freien Speicherplatz? Vermieten Sie es und vertreiben Sie dann Leute, wenn tempdb es wieder braucht? Sie müssen entweder:

  1. Beheben Sie den Prozess, bei dem Tempdb an erster Stelle ungewöhnlich groß wird.
  2. Weisen Sie genügend Speicherplatz für Tempdb zu, damit es nicht wachsen muss, und hören Sie auf, es zu verkleinern (insbesondere, wenn auch nur vorübergehend; dies ist nur verschwendete Arbeit!).

Ein paar andere Vorschläge:

  • Verwenden Sie nicht SHRINKDATABASE(was als Auto-Fragment bezeichnet werden sollte) oder die Benutzeroberfläche. Schreiben Sie spezifische, zielgerichtete SHRINKFILEBefehle, um einzelne Dateien zu beeinflussen.
  • Erwägen Sie die Verwendung mehrerer Dateien für Tempdb (die Sie nach Möglichkeit auf einen anderen Speicher verteilen können) und die Ablaufverfolgungsflags 1117 (sofern dieses Verhalten auch Ihre Benutzerdatenbanken nicht beeinträchtigt) und 1118.
  • Einige Tipps zur Minimierung der Tempdb-Auslastung hier:
Aaron Bertrand
quelle
1
SELECT * FROM sys.dm_tran_active_transactions WHERE name = N'worktable '; Gibt 6 Zeilen vom selben Datum (10.07.14) zurück. Stellt die Transaktions-ID die SPID dar?
user45117
Nein, transaction_id ist keine SPID. Wenn die Transaktionen wirklich aktiv sind (und keine Systemtransaktionen sind), sollten Sie in der Lage sein, mit einer Sitzungs-ID in sys.dm_tran_session_transactions übereinzustimmen. Sind Sie auf jeden Fall sicher, dass dies die Nachricht ist, die Sie von DBCC SHRINKFILE erhalten? Was ist mit ALTER DATABASE ... MODIFY FILE? Ich bin mir auch nicht sicher, ob ich verstehe, warum Sie durch das Löschen des Prozedur-Cache keine Probleme mehr haben. Prozedur-Cache ist im Speicher, nicht in Tempdb ...
Aaron Bertrand
Die Nachricht kam von DBCC SHRINKDATABASE. Ich habe die ALTER DATABASE nicht ausprobiert ... MODIFY FILE ... das wird als nächstes kommen. Durch das Löschen des Prozedurcaches konnte die Tempdb um ca. 10% verkleinert werden, und ich erhielt 4 GB Festplattenspeicher zurück. Ich konnte diese Transaktions-ID von sys.dm_tran_active_transactions nicht mit irgendetwas in sys.dm_tran_session_transactions verknüpfen
user45117
1
Ich denke, das Löschen des Prozedur-Cache hatte weniger damit zu tun, dass Tempdb verkleinert werden kann, als Sie denken. Zufälle passieren die ganze Zeit.
Aaron Bertrand
0

Überall, wo ich im Internet gelesen habe, kommt es darauf an, SQL Server zu recyceln ... sicherlich muss es einen besseren Weg geben ... irgendjemand?

Nein, dies ist eine vorübergehende Lösung. Ich denke, Sie haben dieselbe Frage bereits gestellt. Können Sie bitte angeben, wie groß die Datenbank in Ihrer SQL Server-Instanz insgesamt ist? Die Größe der Tempdb hängt davon ab, wie oft Ihre Abfragen sie verwenden. Es kann nicht von alleine wachsen, wenn Sie es nicht verwenden. Von Aron freigegebene Links würden helfen, aber Sie müssen Abfragen optimieren, wenn sie stark temdbb verwenden oder möglicherweise die Standardanforderung Ihrer Umgebung sind. Ich habe nur wenige env gesehen. Dabei waren 200 G Tempdb akzeptabel, da für Abfragen so viel Tempdb-Speicherplatz erforderlich war.

Shanky
quelle