Czy istnieje sposób na zmniejszenie / zmniejszenie rozmiaru tempdb.mdf bez ponownego uruchamiania programu SQL Server

15

Czy konieczne jest ponowne uruchomienie programu SQL Server po DBCC SHRINKFILEdniu tempdb.mdfczy jest jakiś inny sposób, aby zmniejszyć rozmiar tempdb.mdfbez ponownego uruchamiania SQL Server?

Prosimy o pomoc, ponieważ potrzebuję tego do serwera produkcyjnego i mam nadzieję, że zmniejszy się bez żadnego przestoju.

Manii
źródło
2
DBCC SHRINKFILE nie wymaga ponownego uruchomienia usługi.
Greg
Nie można zmniejszyć tempdb, ponieważ jest w użyciu. I tak, jest na to jakieś rozwiązanie, ale nie jest bardzo czyste i ma pewne skutki uboczne.
Ionic

Odpowiedzi:

15

Możesz to zrobić w ten sposób:

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

Ostatni krok jest najtrudniejszy. Podczas procesu zmniejszania żadna inna akcja nie powinna używać tempdb, ponieważ może to spowodować przerwanie SHRINKFILEoperacji. Z uwagi na fakt, że tempdb jest dość łatwy do skurczenia, jego zmniejszenie nie powinno zająć dużo czasu.

Uważaj, że jest to coś w rodzaju „miękkiego restartu”. Wszystko zostanie usunięte z buforów i zapisane na płycie. Oznacza to wpływ na podsystem we / wy (zapis), ponieważ musi on obsługiwać wszystkie operacje zapisu. Następnie można zmniejszyć plik (co ma wpływ na wydajność odczytu i zapisu), a na koniec wszystkie procesy, które wyszukują zapytania w dowolnej tabeli, będą musiały odzyskać dane z podsystemu I / O do buforów. Może to boleć bardziej niż ponowne uruchomienie.

Jeśli korzystasz z systemu programistycznego, powinieneś po prostu zrestartować komputer zamiast w ten sposób. Ale w niektórych systemach produkcyjnych bez partnera awaryjnego może to być przydatne.

joński
źródło
dzięki Ionic za miłe wyjaśnienie. tempdb.mdf ma w moim przypadku 46 GB. Jeśli nie są przeprowadzane żadne transakcje, mogę to zmniejszyć do 100%. Uprzejmie sugeruję.
Manii,
Tak, 40960 MB to tylko przykład. W moim systemie tempdb działa normalnie na ~ 50 GB, aw rzadkich przypadkach rośnie do 200 GB. :-)
Ionic
<pre> Uruchamiam zapytanie jako DBCC SHRINKFILE (tempdev, 1024); </b> </b> I udało mi się zwolnić miejsce, ale ponownie uruchamiam je jak </b> </b> uruchamiam zapytanie jako DBCC SHRINKFILE (tempdev, 30000); </b> </b> I dało mi to wynik jak poniżej: </b> </b> Pole DbId Aktualny rozmiar Minimalny rozmiar Użyte strony Szacowane strony </b> 2 1 5699352 1024 696 696 </b> </b> Ale jak zaznaczono, tempdb nie został zmniejszony. </pre>
Manii
Ten komunikat może wystąpić, jeśli transakcja korzysta z tempdb podczas zmniejszania. Może się również zdarzyć, że zdefiniowany rozmiar skurczu (~ 30 GB) jest powyżej bezpłatnego limitu twojego tempdb.
Ionic
1

Możesz przejść tylko z poniższym krokiem

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;
NOCNIK
źródło
Czym różni się twoja odpowiedź od powyższej?
Kin Shah,
1
Witaj Kin, Tempdb Rozmiar pliku zostanie zmniejszony dzięki DBCC FREEPROCCACHE; a następnie zmniejsz plik tempdb. Nie potrzebujemy poniższej instrukcji do zmniejszenia tempdb. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE („WSZYSTKO”); DBCC FREESESSIONCACHE;
JERRY
1
Jest to prostsza odpowiedź, w większości przypadków potrzebna jest tylko DBCC FREEPROCCACHE, aby umożliwić zmniejszenie tempdb. Zobacz powiązane pytanie
James Jenkins,