Чи є спосіб зменшити / зменшити розмір tempdb.mdf без перезавантаження SQL Server


15

Чи потрібно перезапустити SQL Server після DBCC SHRINKFILEввімкнення tempdb.mdfчи існує інший метод зменшення розміру tempdb.mdfбез перезавантаження SQL Server?

Будь ласка, допоможіть, як мені це потрібно для виробничого сервера, і я сподіваюся зробити скорочення без будь-якого простою.


2
DBCC SHRINKFILE не вимагає перезавантаження служби.
Грег

Ви не можете зменшити tempdb, як це використовується. І так, для цього є рішення, але воно не дуже чисте і має деякі побічні ефекти.
Іонічний

Відповіді:


15

Це можна зробити так:

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

Останній крок - найвибагливіший. Під час процесу скорочення жодних інших дій не слід використовувати tempdb, оскільки це може спричинити переривання вашої SHRINKFILEроботи. У зв'язку з тим, що tempdb стискається досить просто, не потрібно довго його скорочувати.

Будьте уважні, що це щось на зразок "м'якого перезавантаження". Все буде вилучено з буферів і записано на диск. Це означає вплив на вашу підсистему вводу / виводу (запис), оскільки вона повинна обробляти всі операції запису. Після цього ви можете зменшити файл (що впливає на продуктивність читання і запису), і в кінці всіх процесів, які запитують будь-яку таблицю, потрібно буде повернути дані назад з підсистеми вводу / виводу в буфери. Це може зашкодити більше, ніж перезапуск.

Якщо ви використовуєте систему розробки, вам слід просто перезапустити машину замість цього способу. Але для деяких виробничих систем без відмовного партнера це може бути корисним.


дякую Іоніку за гарне пояснення. tempdb.mdf становить 46 Гб у моєму випадку. Якщо жодних транзакцій не відбувається, то чи можу я зменшити його до 100%. Прошу запропонувати.
Манія

Так, 40960MB - лише приклад. У моїй системі tempdb працює нормально при ~ 50 ГБ, а в рідкісних випадках зростає до 200 ГБ. :-)
Іонік

<pre> Я запускаю запит як DBCC SHRINKFILE (tempdev, 1024); </b> </b> І він успішно звільнив простір, але знову запускаю його як </b> </b> я запускаю запит як DBCC SHRINKFILE (tempdev, 30000); </b> </b> І це дало мені результат, як показано нижче: </b> </b> Поле DbId Поточний розмір Мінімальний розмір Використаних сторінок Орієнтовні сторінки </b> 2 1 5699352 1024 696 696 </b> </b> Але, як перевірений розмір tempdb, зменшено не було. </pre>
Манія

Це повідомлення може виникнути, якщо транзакція використовує tempdb під час скорочення. Можливо також, що ваш визначений розмір скорочення (~ 30 Гб) перевищує вільну межу вашого tempdb.
Іонічний

1

Ви можете просто перейти лише до кроку нижче

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;

Чим ваша відповідь відрізняється від наведеної?
Кін Шах

1
Привіт Кін, розмір файлу Tempdb зменшиться за допомогою DBCC FREEPROCCACHE; а потім зменшіть файл tempdb. Нижче нам не потрібна операція для скорочення tempdb. ДБКК ДРОПКЛЕАНБУФЕРИ; DBCC FREESYSTEMCACHE ("ВСІ"); DBCC FREESESSIONCACHE;
JERRY

1
Це найпростіша відповідь, у більшості випадків потрібен лише DBCC FREEPROCCACHE, щоб дозволити зменшити tempdb. Дивіться пов’язане запитання
Джеймс Дженкінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.