Ich habe zu viele sekundäre Datendateien (.ndf) für erstellt tempdb
. Um die überschüssigen Dateien zu entfernen, muss ich die Datei leeren (der Inhalt wird in andere Dateien verschoben):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
und löschen Sie dann die Datei:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
Der EMPTYFILE
Befehl gibt jedoch den Fehler zurück:
DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page.
Msg 2555, Level 16, State 1, Line 2
Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation.
Keine Sorge, ich muss nur das Objekt suchen, das diese Seite verwendet, um etwas dagegen zu tun:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
Der Befehl gibt viele Informationen zurück, darunter object_id. Aber:
Metadata: ObjectId = 0
Ich habe keine Ahnung, was ich dagegen tun soll. Welche Katze verhindert, dass diese Seite verschoben wird? Wie finde ich das Objekt, den Prozess, die Sitzung oder was auch immer? Jede Hilfe wird geschätzt, aber bitte beachten Sie, dass es keine gültige Lösung für dieses Problem ist, alles so zu lassen, wie es ist, oder stattdessen andere Dateien zu entfernen;).
BEARBEITEN:
Ich entferne die Dateien, weil wir früher die "Best Practice" befolgt haben, eine Datei pro Prozessorkern zu erstellen (gleiche Anfangsgröße, gleiche Wachstumsrate). Aber soweit ich weiß, macht es keinen Sinn, zusätzliche Tempdb-Dateien auf demselben Gerät zu erstellen, bis Sie auf Konfliktprobleme stoßen. In unserem Fall ist dies sinnvoll, da MPIO aktiviert ist und das Speichergerät 4 Pfade verarbeiten kann. Aber es gab einen Fehler und wir hatten insgesamt 5 Dateien mit 6-Kern-CPU. Es ist mehr als MPIO-Pfade, weniger als CPU-Kerne, und es ist keine gerade Zahl. Es kann keine Probleme verursachen, scheint aber einfach nicht richtig :).
Endlich konnte ich die Datei leeren und entfernen, ohne den Server neu zu starten, indem ich eine der Datenbanken (von denen ich vermutete, dass sie das Problem verursachen) auf den Einzelbenutzermodus stellte (sofortiger Rollback). Es hat funktioniert, aber ich hatte Glück. Was ich wirklich will, ist, immer in der Lage zu sein, die Seite aufzuspüren :).
quelle
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
Über Ihre Lösung: Es würde funktionieren, aber ich würde dies wirklich gerne tun, ohne die Instanz herunterzufahren.Antworten:
Ein Neustart des Servers sollte ausreichen - diese Arbeitstabellen sollten gelöscht werden. Aber ich würde es wahrscheinlich im Einzelbenutzermodus (-m) starten , um zu verhindern, dass andere Prozesse Arbeitstabellen erstellen, bevor Sie diese Dateien erfolgreich entfernen. Definieren Sie dann die erforderlichen Dateien neu
tempdb
. Möglicherweise löschen Sie unnötige Dateien, ändern die Größe usw. Sie sollten auch sicherstellen, dass Sie eine gerade Anzahl von Dateien haben, dass alle auf die gleiche Größe eingestellt sind und dass alle die gleichen Einstellungen für das automatische Wachstum haben (in MB, nicht%). Und es könnte ein guter Zeitpunkt sein, auch TF 1117 und TF 1118 in Betracht zu ziehen ( Ausgangspunkt ).Ich wäre sehr vorsichtig mit dem Vorschlag, die Dateien einfach aus dem Dateisystem zu löschen, bevor Sie SQL Server erneut starten - es wird möglicherweise überhaupt nicht gestartet.
(Ich wäre aber auch neugierig, was das eigentliche Problem ist. Zu viele Dateien zu haben, tut dir nicht wirklich weh.)
quelle
https://social.msdn.microsoft.com/Forums/en-US/2a00c314-f35e-4900-babb-f42dcde1944b/dbcc-shrinkfile-page-411283400-could-not-be-moved-because-it-is- a-work-table-page? forum = sqldatabaseengine
Wie von Mike im msdn-Forum vorgeschlagen, werden Arbeitstabellen hauptsächlich mit dem Plan-Cache verknüpft. Wenn Sie sie löschen, wird auch die Arbeitstabelle entfernt, und dann können Sie Tempdb verkleinern. Das hat bei mir funktioniert. Dies erspart Ihnen auch einen Neustart des Servers. Es wird einen gewissen Overhead geben, da SQL Server die Ausführungspläne erneut erstellen muss.
quelle