Ms sql tempdb удалить дополнительные файлы

Обновлено: 06.07.2024

В нашей рабочей БД есть только 1 файл tempdb, и он увеличился до 180 ГБ.

чтобы изменить размер основного файла, а затем запустить дополнительные:

чтобы добавить дополнительные файлы tempdb. Я столкнулся с ошибкой места на диске, так как объем основного диска не уменьшился до 30 ГБ, и операция была остановлена ​​на полпути.

Теперь у меня остался один дополнительный файл tempdb размером 30 ГБ, а основной — 180 ГБ, и я не могу избавиться от него.

Я пытался запустить

но я получаю сообщение об ошибке:

Не удалось найти файл tempdev2 для базы данных tempdb в sys.database_files.
Файл либо не существует, либо был удален.

Я считаю, что эта ошибка связана с тем, что операцию не удалось завершить успешно. (Есть ли у меня коррупция?)

И когда я пытаюсь бежать

Я получаю следующую ошибку:

Файл "M:\SQLData\tempdb2.ndf" был изменен в системном каталоге. Новый путь будет использоваться при следующем запуске базы данных.
Сообщение 5042, уровень 16, состояние 1, строка 35
Невозможно удалить файл tempdev2, так как он не пуст.

введите здесь описание изображения

Файлы sys.database_files выглядят так

введите здесь описание изображения

Результаты из tempdb.sys.all_objects

введите здесь описание изображения

Редактировать: мне удалось устранить повреждение имени файла «файл не найден», которое я получал при попытке запустить EMPTYFILE Shrink. Я использовал идентификатор файла вместо логического имени.

Другой способ, который, как я обнаружил, сработал, — это переименование файла.

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

1 Ответ 1

Итак, ваша текущая ситуация — это полный диск, когда у вас есть две TempDB, размер старой которых вы хотите изменить, а вновь созданная испытывает трудности при удалении?

Существуют ограничения на использование команды DBCC SHRINKDATABASE в базе данных tempdb. Целевой размер файлов данных и журналов не может быть меньше размера, указанного при создании базы данных, или меньше последнего размера, который был явно задан с помощью операции изменения размера файла, такой как ALTER DATABASE, которая использует команду MODIFY FILE. опция или команда. Еще одним ограничением BCC SHRINKDATABASE является вычисление параметра target_percentage и его зависимость от текущего используемого пространства.

Это должно установить для вашего файла ~ 54 ГБ, что должно быть безопасным размером, учитывая, что я предполагаю, что ваш размер или модель были 30 ГБ. Отрегулируйте процент соответствующим образом.

Теперь попробуйте второй файл:

Если проблема не устранена, вам придется перезапустить SQL Server, чтобы удалить файл, так как TempDB используется.

И последнее замечание, вы напечатали это:

ИЗМЕНИТЬ БАЗУ ДАННЫХ tempdb ДОБАВИТЬ ФАЙЛ (NAME='tempdev2', FILENAME='M:\SQLData**tempdb3**.ndf', Size=30GB);

На снимке экрана показана база данных tempdb2. Убедитесь, что все имена указаны правильно, и еще раз проверьте их. На всякий случай, если есть опечатка, которая вызывает у вас головную боль.

В некоторых случаях запуск

может облегчить боль и позволить уменьшить размер файла.

Если у вас по-прежнему возникают проблемы, посмотрите, что не так в вашей базе данных tempdb:

Это позволит вам увидеть размер файлов tempdb.

Из вашего сообщения мы видим, что у вас есть файлы, используемые в TempDB, и есть свободное место. В SQLSunday Даниэля Хатмахера есть хорошая ссылка на сжатие вашей БД с помощью дополнительных методов, похожих на Ozar, я бы порекомендовал попробовать и это с осторожностью.

Есть сообщение Майка Гуда — SQL Central о сжатии вашей базы данных TempDB путем настройки уровня моментального снимка TempDB с периодом отката, чтобы уничтожить любые соединения, которые могли задержаться в вашей базе данных.

Сегодня я допустил ошибку со скриптом. Я создал три новых файла tempdb размером 10 ГБ каждый, которые заполнили жесткий диск.

К счастью, это было на одной из моих собственных тестовых ВМ, так что ничего страшного. Однако исправлять это было забавно.

**ПРИМЕЧАНИЕ. Вся работа выполнялась в тестовой среде. Будьте осторожны, если вы запускаете эти команды в рабочей среде, и убедитесь, что вы понимаете последствия.

Чтобы удалить файл из базы данных SQL Server, он должен быть пустым. Для каждого файла, который я хотел удалить, мне нужно было запустить:

Однако каждый раз, когда я пытался запустить эту команду для любого файла, я получал такое сообщение:

DBCC SHRINKFILE: страницу 4:130 нельзя переместить, так как это страница рабочей таблицы.
Сообщение 2555, уровень 16, состояние 1, строка 1
Невозможно переместить все содержимое файла «логическое имя» в другие места для завершения операции с пустым файлом.

Эта ошибка появлялась для каждого файла, даже если я перезапускал экземпляр и ничего не делал, и даже если я перезапускал его в однопользовательском режиме.

Затем я нашел несколько сообщений об очистке кеша процедур и кеша сеансов, поэтому я очистил все… или пойти по-крупному, или вернуться домой, верно? Помните, что я работаю в локальной тестовой среде, так что это не имеет большого значения.

Если после этого я попытался очистить файл, это все равно не удалось.

**Примечание. В разговоре с Джонатаном постфактум он сказал, что видел это раньше, когда каждый файл в базе данных tempdb содержит рабочий файл, который нельзя удалить. Он считает, что такое поведение началось с SQL Server 2012. Я не нашел никакой документации от Microsoft по этому поводу… пока…

Теперь я начал злиться (в первую очередь на себя за эту ошибку). Наконец, я попытался запустить SQL Server с минимальной конфигурацией, используя -f и подключившись с помощью sqlcmd. В документации отмечается, что «tempdb настроен на минимально возможный размер». Так мало, что не все файлы были там! Мне не удалось запустить команду DBCC SHRINKFILE, поскольку дополнительные файлы были недоступны. Отлично, ведь тогда я мог бы просто удалить их:

Я запустил ALTER DATABASE [tempdb] REMOVE FILE для каждого из трех добавленных файлов, закрыл экземпляр, удалил -f и перезапустил. Файлы удалены! Однако они все еще лежали на диске, но, поскольку они больше не использовались, я мог их удалить. Пространство освобождено, пора шоколадку.

Обновление от 21 апреля 2020 г. У Энди Маллона есть умная альтернатива запуску SQL Server с параметром -f. Ознакомьтесь с его сообщением Исправление tempdb: увеличение, сжатие и удаление файлов данных.

Завтра у меня было запланировано изменение для удаления файлов данных Tempdb. Итак, я тестирую то же самое на своем локальном экземпляре.

Я создал 3 файла tempdb ndf вместе с 1 файлом основных данных, размер каждого из которых составляет 1024 МБ. Пожалуйста, найдите скриншот ниже:


Сверху SS мы видим, что все файлы данных имеют 99% свободного места. Поскольку изменение необходимо выполнить в производственной среде, что не будет в том же случае, что и выше, я создаю временную таблицу и вставляю данные в таблицу для заполнения Tempdb. После заполнения Tempdb у нас осталось 0% свободного места. Доступно во всех файлах Tempdb, пожалуйста, найдите SS ниже:


Итак, для удаления файла в базе данных нам нужно сначала ОЧИСТИТЬ файл, а затем инициировать команду для удаления файла.

Чтобы ОЧИСТИТЬ файл, нам нужно использовать команду сжатия DBCC SHRINKFILE (YourLogicalFileName, EMPTYFILE);

Здесь я пытаюсь удалить файл данных Tempdb ‘tempdev3’, я выполнил следующую команду в TEMPDB:

После выполнения приведенной выше команды потребовалось некоторое время, и она вернулась с ошибкой, как показано ниже: SS:


Я попытался перезапустить экземпляр и выполнить команду, указанную выше, но безуспешно, получил ту же ошибку. Я также попытался подключиться в однопользовательском режиме, чтобы выполнить команду, указанную выше, но все равно не повезло с той же ошибкой.

Итак, я решил выполнить некоторые команды DBCC и запустить команду Удалить файл, объединив все это в окне того же запроса. Пожалуйста, найдите ниже SS:


Теперь ошибка говорит, что файл не ПУСТОЙ. Итак, я попытался очистить файл, но после этого также не удалось.

Я гуглил о том, как удалить файлы tempdb в производственной среде, видел так много сайтов, и большинство из них сказали, что нужно взять экземпляр в режиме минимальной конфигурации, т. е. запустить экземпляр с параметром /f, подключиться с помощью SQLCMD, а затем попробуйте удалить файл.

Итак, я попробовал метод остановки служб SQL на моем локальном компьютере с помощью командной строки, ниже приведена команда, которую я использовал:

ЧИСТАЯ ОСТАНОВКА MSSQLSERVER


После остановки служб SQL я запустил свой экземпляр по умолчанию, используя параметр /f:


Как сказано выше, после подключения экземпляра в режиме минимальной конфигурации, теперь я подключаюсь с помощью SQLCMD к своему локальному экземпляру, как показано ниже, но он возвращает ошибку при подключении из-за того, что именованные каналы находятся в состоянии DISABLED:



Я ВКЛЮЧИЛ именованные каналы и перезапустил экземпляр, чтобы они вступили в силу, но по-прежнему не удается получить сообщение об ошибке "Сервер находится в однопользовательском режиме".


Я снова попытался остановить экземпляр и начать с параметра /f, а затем попытался подключиться в режиме SQLCMD.


Если вы видите вышеприведенный SS, он был связан с режимом SQLCMD после нескольких попыток. Итак, я непосредственно выполнил оператор

ИЗМЕНИТЬ БАЗУ ДАННЫХ [tempdb] УДАЛИТЬ ФАЙЛ [tempdev3]
ПЕРЕХОД

И это не вернуло никакой ошибки Итак, я надеюсь, что файл был успешно удален. Также здесь я не запускал команду DBCC SHRINKFILE (tempdev3, EMPTYFILE), я запускал базу данных Alter напрямую, чтобы удалить файл и взять экземпляр автономный, запущенный экземпляр без параметра /f. После запуска экземпляра, подключения к моему экземпляру по умолчанию и проверки файлов tempdb, он (tempdev3) был удален


Но файл tempdev3 все еще существует в физическом расположении, как показано ниже:


Я пытаюсь УДАЛИТЬ файл в физическом месте, и он был удален без каких-либо проблем. После удаления пространства также восстанавливается на диск

Удалить или удалить файл данных Tempdb без перезапуска SQL Server

автор Dev 11 сентября 2017 г.

Возможно, вы захотите удалить этот дополнительный файл данных Tempdb, который кто-то создал по ошибке или для выполнения запроса. Какой бы ни была причина, сегодня я покажу вам, как это сделать и с какими проблемами вы можете столкнуться.

Вы можете запустить следующий запрос, чтобы удалить файл данных:

Или вы можете использовать графический интерфейс:



SQL Server выдает следующую ошибку:


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

Если вы просто добавляете файл, и в нем нет текущей активности, это позволит удалить файл таким образом.

Для каждого файла, который вы хотите удалить, вам нужно выполнить следующую команду, чтобы очистить файл, а затем выполнить приведенный выше запрос, чтобы удалить файл:
USE [tempdb];
GO
DBCC SHRINKFILE (LogicalName, EMPTYFILE);
ПЕРЕХОД

Но что, если он выдает следующую ошибку:


Сообщение об ошибке касается страницы рабочей таблицы, которую нельзя удалить. Рабочая таблица связана с кешированной информацией, что указывает на необходимость очистки кеша.

Выполните приведенные ниже запросы один за другим и после очистки каждого из них попробуйте снова очистить файл:


Успешный запуск показан ниже:

Имейте в виду, что всякий раз, когда вы очищаете кеш, это может привести к проблемам с производительностью. Я оставляю на ваше усмотрение принятие решения об устранении фактора риска в зависимости от среды.

Если ваша среда позволяет вам перезапустить службу SQL, вы можете просто перезапустить, что очистит файлы tempdb, и вы можете запустить команду удаления:

Надеюсь, вы уже развенчали миф о тайм-ауте удаленного запроса.

Вы можете посмотреть это видео:

Читайте также: