Есть ли способ уменьшить / уменьшить размер tempdb.mdf без перезапуска SQL Server

15

Нужно ли перезапускать SQL Server после DBCC SHRINKFILEвключения tempdb.mdfили есть какой-либо другой способ уменьшить размер tempdb.mdfбез перезапуска SQL Server?

Пожалуйста, помогите, так как мне это нужно для производственного сервера, и я надеюсь сделать сжатие без каких-либо простоев.

Manii
источник
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 ГБ. :-)
Ionic
<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>
Manii
Это сообщение может появиться, если транзакция использует базу данных tempdb при сжатии. Также может быть, что определенный вами размер сжатия (~ 30 ГБ) превышает свободный предел вашей базы данных tempdb.
Ионический
1

Вы можете просто перейти с шага ниже только

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;
ДЖЕРРИ
источник
Чем ваш ответ отличается от приведенного выше?
Кин Шах
1
Hello Kin, Tempdb Размер файла будет уменьшен с DBCC FREEPROCCACHE; а затем уменьшить файл tempdb. Нам не нужно ниже заявление для сокращения tempdb. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE («ВСЕ»); DBCC FREESESSIONCACHE;
Джерри
1
Это более простой ответ, в большинстве случаев требуется только DBCC FREEPROCCACHE, чтобы позволить вам уменьшить базу данных tempdb. Смотрите связанный вопрос
Джеймс Дженкинс