Sekundäre Datendateien entfernen. DBCC SHRINKFILE: Die Seite konnte nicht verschoben werden, da es sich um eine Arbeitstabellenseite handelt

10

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

Adam Luniewski
quelle
Der Befehl DBCC PAGE ist nicht korrekt. Er sollte wie die dbcc-Seite (2.41920,1) sein. 1,2,3 hängt davon ab, was Sie ausgeben möchten.
Shanky
Wenn dies nicht funktioniert, müssen Sie dies möglicherweise in der Hardware tun, indem Sie Dateien entfernen und anschließend den SQL Server neu starten, damit nur Dateien verwendet werden, die nicht gelöscht wurden. Können Sie auf diesen Link verweisen daveturpin.com/2011/07/how-to-drop-a-tempdb-database-file
Shanky
2
@Shanky Der Befehl ist korrekt. 0..3 kann als 4. Parameter übergeben werden: 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.
Adam Luniewski
Ok ... ich habe dir eine einfachere Form der dbcc-Seite erzählt. Bitte beachten Sie, dass der Befehl nicht dokumentiert ist. Hast du Link überprüft i geschrieben
Shanky
1
Ich denke nicht, dass es machbar ist, dieses Problem zu lösen, ohne die Instanz neu zu starten. Offensichtlich haben Sie versucht, herauszufinden, was dieser Arbeitstisch ist (was dazu beitragen würde, festzustellen, wem er gehört), und das ist fehlgeschlagen. Nehmen Sie den Treffer oder leben Sie mit den zusätzlichen Dateien, bis Sie neu starten können.
Aaron Bertrand

Antworten:

5

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

Aaron Bertrand
quelle
@@ Aaron natürlich müssen Sie vorsichtig sein, wenn Sie es entfernen. Es muss leer sein, aber das ist hier dokumentiert . Msdn.microsoft.com/en-gb/library/ms175574.aspx . Habe es versucht und SQl Server tempdb geht online.
Shanky
5
@ Shanky Ich habe einmal versucht, 138 Meilen pro Stunde zu fahren, und ich wurde nicht überfahren. Heißt das, ich sollte es weiter machen und es gibt keine Chance, dass ich morgen überfahren werde? Es ist viel sicherer, zuerst den richtigen Weg zu gehen, bevor Sie einen riskanteren Weg vorschlagen. MEINER BESCHEIDENEN MEINUNG NACH. Zumal er die Datei jetzt nicht leeren kann - halten Sie es für möglich, dass außer dem Arbeitstisch, über den sich die Fehlermeldung beschwert, noch etwas anderes darin enthalten ist? Der Fehler erzeugt keine vollständige Liste aller Objekte, sondern gibt nur das erste Objekt aus.
Aaron Bertrand
Es gibt etwas, das tatsächlich Tempdb verwendet, so dass es nicht erlaubt, Dateien zu leeren, die schwer zu erraten sind. Möge er den Sortieroperator verwenden, ist eine Abfrage, die noch tempdb benötigt. DMV kann das helfen sys.dm_db_task_space_usage sys.dm_db_session_space_usage sys.dm_db_file_space_usage bei der Suche
Shanky
Ein Neustart ist hier möglich, aber selbst wenn er die Datei nicht leert und versucht, die Tempdb-Datei zu löschen, würde dies bedeuten, dass die Tempdb-Datei nicht gelöscht werden kann, aber gleichzeitig der Systemkatalog aktualisiert wird und nach dem Neustart die Datei nicht mehr vorhanden ist. Dies ist vermutlich das Standardverhalten mit Tempdb, daher habe ich vorgeschlagen und denke immer noch, dass das Entfernen von Datendateien auch dann funktionieren würde, wenn sie verwendet werden. Das gleiche gibt es in dem Link, den ich in meinem zweiten Kommentar gepostet habe.
Shanky
1
@Shanky diese DMVs könnten Tausende von Zeilen für alle Arten von Dingen zurückgeben, die nichts mit der fraglichen Datei zu tun haben - wie wollen Sie sie also eingrenzen? Da Sie mit Ihrer Methode auch neu starten müssen, versuchen Sie es doch einfach zuerst. Ich stimme Ihnen einfach nicht zu, dass "der harte Weg" der erste Vorschlag sein sollte, sorry.
Aaron Bertrand
2

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.

sajeesh
quelle