Mam za dużo dodatkowych plików danych (.ndf) tempdb
. Aby usunąć nadmiar plików, muszę opróżnić plik (zawartość zostanie przeniesiona do innych plików):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
a następnie usuń plik:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
Ale EMPTYFILE
polecenie zwraca błąd:
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.
Nie martw się, muszę tylko zlokalizować obiekt, który używa tej strony, aby coś z tym zrobić:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
Polecenie zwraca wiele informacji, wśród nich identyfikator_obiektu. Ale:
Metadata: ObjectId = 0
Nie mam pojęcia, co z tym zrobić. Który kot powstrzyma tę stronę przed przeniesieniem? Jak zlokalizować ten obiekt, proces, sesję lub cokolwiek to jest? Jakakolwiek pomoc będzie mile widziana, ale należy pamiętać, że pozostawienie wszystkiego bez zmian lub usunięcie innego pliku nie jest prawidłowym rozwiązaniem tego problemu;).
EDYTOWAĆ:
Usuwam pliki, ponieważ postępowaliśmy zgodnie z „najlepszą praktyką” tworzenia jednego pliku na rdzeń procesora (ten sam rozmiar początkowy, to samo tempo wzrostu). Ale o ile wiem, dopóki nie napotkasz problemów rywalizacji, nie ma sensu tworzyć dodatkowych plików tempdb na tym samym urządzeniu. W naszym przypadku ma to sens, ponieważ mamy włączone MPIO , a urządzenie pamięci masowej może obsługiwać 4 ścieżki. Ale był błąd i ostatecznie otrzymaliśmy 5 plików z 6-rdzeniowym procesorem. To więcej niż ścieżki MPIO, mniej niż rdzenie procesora i nie jest to liczba parzysta. Nie może powodować żadnych problemów, ale po prostu wydaje się niewłaściwy :).
W końcu mogłem opróżnić i usunąć plik bez ponownego uruchamiania serwera, ustawiając jedną z baz danych (które podejrzewałem, że spowodowały problem) na tryb pojedynczego użytkownika (natychmiastowe wycofanie). Udało się, ale miałem szczęście. To, czego naprawdę chcę, to zawsze móc śledzić stronę :).
źródło
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
O twoim rozwiązaniu: zadziałałoby, ale naprawdę chciałbym to zrobić bez wyłączania instancji.Odpowiedzi:
Ponowne uruchomienie serwera powinno wystarczyć - te stoły robocze powinny zostać wyczyszczone. Ale prawdopodobnie uruchomiłbym go w trybie pojedynczego użytkownika (-m), aby uniemożliwić innym procesom tworzenie tabel roboczych przed pomyślnym usunięciem tych plików. Następnie ponownie zdefiniuj wymagane pliki
tempdb
; być może usuwając niepotrzebne pliki, zmieniając rozmiary itp. Powinieneś także upewnić się, że masz parzystą liczbę plików, że wszystkie są ustawione na ten sam rozmiar i że wszystkie mają takie same ustawienia automatycznego wzrostu (w MB, a nie%). I może to być dobry moment na rozważenie TF 1117 i TF 1118 ( punkt początkowy ).Byłbym bardzo ostrożny wobec sugestii, aby po prostu usunąć pliki z systemu plików przed ponownym uruchomieniem programu SQL Server - może się w ogóle nie uruchomić.
(Byłbym również ciekawy, na czym polega faktyczny problem. Zbyt duża liczba plików naprawdę cię nie skrzywdzi.)
źródło
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
Jak zaproponował Mike na forum msdn, tabele robocze są najczęściej związane z pamięcią podręczną planu. Wyczyszczenie ich spowoduje również usunięcie stołu roboczego, a następnie możesz zmniejszyć Tempdb. To zadziałało dla mnie. Oszczędza to również ponownego uruchomienia serwera. Będzie trochę narzutu, ponieważ SQL Server będzie musiał ponownie odtworzyć plany wykonania.
źródło