none
Перемещение tempdb если разделен на несколько файлов RRS feed

  • Вопрос

  • Доброго времени суток!

    Собственно сам вопрос - как правильно переместить tempdb на другой диск, если tempdb разбит на несколько файлов?

    8 февраля 2019 г. 14:56

Ответы

  • Роман, данная операция выполняется в несколько этапов.

    Настоятельно рекомендую не размещать файлы в корне диска даже если он создан только под хранение баз(ы). Создайте отдельную директорию, к примеру, так её и назовите: TEMPDB 

    Убедитесь, что у учётной записи, из-под которой запущена служба SQL Server Database Engine, есть права на чтение и модификацию этой директории. Лучше даже выдать полные права на NT SERVICE\MSSQLSERVER, либо NT SERVICE\MSSQL$ имя_экземпляра если инстанс именованный.

    Далее открываем SQL Server Management Studio и выполняем следующую команду:

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'tempdb');

    Результатом будет что-то такое:

    Нам нужно содержение колонки name, это логические имена файлов на которые разбита база.

    Для каждого файла нужно выполнить следующий код:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' )

    Где

    database_name - имя базы, в нашем случае – tempdb

    logical_name - логическое имя файла базы, в случае моего примера это tempdev, templog, temp2, temp3 и т.д.

    new_path\os_file_name - полный путь и физическое название файла, к примеру: T:\TEMPDB\tempdb.mdf
    Вышеупомянутый запрос, который вернул логические имена файлов, также возвращает колонку CurrentLocation По сути, Вам просто нужно скопировать её содержимое и поменять первую часть строки с текущим размещением файла на новое.

    Для моего примера код для перемещения файлов будет следующий:

    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = tempdev, FILENAME = T:\TEMPDB\tempdb.mdf )
    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = templog, FILENAME = T:\TEMPDB\templog.ldf )
    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = temp2, FILENAME = T:\TEMPDB\tempdb_mssql_2.ndf )
    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = temp3, FILENAME = T:\TEMPDB\tempdb_mssql_3.ndf )
    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = temp4, FILENAME = T:\TEMPDB\tempdb_mssql_4.ndf )
    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = temp5, FILENAME = T:\TEMPDB\tempdb_mssql_5.ndf )
    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = temp6, FILENAME = T:\TEMPDB\tempdb_mssql_6.ndf )
    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = temp7, FILENAME = T:\TEMPDB\tempdb_mssql_7.ndf )
    ALTER DATABASE 'tempdb' MODIFY FILE ( NAME = temp8, FILENAME = T:\TEMPDB\tempdb_mssql_8.ndf )

    Сгененрировал я его седующим путём (перед выполнением нажмите CTRL + T для возврата результата в виде текста):

    SELECT 'ALTER DATABASE ''tempdb'' MODIFY FILE ( NAME = '+[name]+', FILENAME = '+[physical_name]+' )'
    FROM sys.master_files
    WHERE database_id = DB_ID(N'tempdb');

    Осталось только перезапустить службу SQL Server Database Engine. Сделать это можно в любое удобное Вам время. Новые файлы начнут использоваться только после перезапуска службы. 

    Правильность настроек можно определить с помощью того же запроса выше:

    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'tempdb');

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

    Важные моменты: 

    1. Файлы не обязательно переносить с места на место, система сама создаст их во время старта службы.
    2. Если файлы большие – желательно дать системной учётной записи право на Perform Volume Maintenance Tasks
    3. Пока не будет создан основной файл и файл лога - служба полностью не стартует, СУБД будет не доступна.
    4. Рекомендую для проверки не перезапускать службу, а остановить. Далее переименовать старую директорию где была tempdb, и только потом запускать службу. Так Вы точно поймёте, что всё работает верно и всегда сможете откатиться обратно.

    Частые ошибки, которые с которыми ко мне обращаются за помощью:

    1. Забыли выдать доступ на новую директорию
    2. Нашли скрипт в интернете на перенос только основного файла данных и журнала транзакций, бездумно запустили
    3. Поменяли настройки, но не перезапустили службу по ряду причин. Другой администратор увидел пустую папку и удалил её. Когда службу перезапустили, она не стартовала, так как не было где разместить tempdb

    В любом случае, если что-то не так – посмотрите лог ошибок. Ну и пишите. Уверен, что всё пройдёт удачно, операция не сложная.


    8 февраля 2019 г. 17:00