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 :).
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.