Как переместить файлы базы данных SQL Server?

103

У меня есть база данных и хочу переместить .mdfи .ldfфайлы в другое место. Но я не хочу останавливать MSSQLSERVERслужбу, и я не хочу экспортировать на другой сервер.

Как я могу это сделать?

Майк Фал
источник

Ответы:

155

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

Процесс их перемещения довольно прост. Отделение / Присоединение уже было описано, но это не так уж сложно.

Измените расположение файлов с помощью ALTER DATABASEкоманды:

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location

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

Установить базу данных в автономном режиме

(Я использую, WITH ROLLBACK IMMEDIATEчтобы выгнать всех и откатить все открытые в настоящее время транзакции)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Переместить / скопировать файлы на новое место

Просто скопируйте файлы, используя ваш любимый метод (Click 'n Drag, XCopy, Copy-Item, Robocopy)

Подключите базу данных онлайн

ALTER DATABASE foo SET ONLINE;

Вы можете увидеть это описано более подробно здесь .

Майк Фал
источник
13
Это сработало для меня. В моем случае мне также пришлось переместить файл LDF с помощью первой команды: например USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location
Dewi Rees
1
Также может использоваться для перемещения файлов полнотекстового индекса, просто обновляя имя файла в соответствии с тем, что вы видите в диалоговом окне файлов.
DShook
24
После перемещения файлов базы данных убедитесь, что у пользователя "NT SERVICE \ MSSQLSERVER" есть разрешения, иначе вы получите ошибки при попытке вернуть базу данных в оперативный режим.
Demonslay335
Каким должно быть «имя»? В документации оно имеет «логическое_имя». Что они имеют в виду?
Джонни
2
@mlhDev На самом деле в моем случае MODIFY FILEпорядок меняется. Если вы сначала запустите MODIFY FILE, он сообщит вам, что команда выполняется успешно, и местоположение будет изменено после автономной онлайн-операции (формулировка другая, но вы понимаете). Порядок Offline-> Move files-> Online имеет значение, хотя и по понятной причине. Также отметьте примечание Demonslay335. Разрешение файла важно.
Лионет Чен
50

Файлы MDF и LDF защищены и не могут быть перемещены, когда база данных находится в сети.

Если вы не против остановить работу базы данных, то можете DETACH, переместите файлы и затем ATTACH.

  • Щелкните правой кнопкой мыши на имени базы данных
  • Выбрать Properties
  • Перейти на Filesвкладку
  • Запишите из Pathи FileNameМДФ и LDF файлов . Этот шаг важен в том случае, если вы не хотите в конечном итоге искать отсутствующие файлы ...
  • Щелкните правой кнопкой мыши на имени базы данных
  • Выбрать Tasks -> Detach
  • Переместите файлы туда, куда вы хотите
  • Щелкните правой кнопкой мыши Databasesузел вашего сервера.
  • Выбрать Attach
  • Нажмите на Addкнопку
  • Укажите новое местоположение
  • Нажмите OK

Вы должны быть в порядке сейчас. Информацию о DETACH- ATTACHпроцессе можно найти здесь .

В ссылке о DETACH- ATTACHесть рекомендация об использовании ALTER DATABASEоператора, если база данных хранится на одном и том же экземпляре SQL Server. Больше ссылок в разделе Перемещение пользовательских баз данных .

Если вы хотите, чтобы он работал во время движения, то выполните BACKUP- RESTORE. В процессе восстановления вы можете определить новое расположение файлов базы данных.

Яннис Параскевопулос
источник
3
Я рекомендую открывать SQL Management Studio от имени администратора, чтобы избежать проблем с доступом к файлам при повторном
подключении
6

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

  1. Войти как пользователь sa в SSMS

  2. Сделайте резервную копию созданной пользователем базы данных для безопасности.

  3. Убить все сеансы, подключенные к Серверу из SSMS.

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

    USE master;
    SELECT * FROM sys.master_files;

Определите путь и запишите текущий путь к файлам.

  1. Используйте TSQL, чтобы изменить путь к файлу для всей базы данных, кроме главной:

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

Например:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");

Теперь местоположение файла было изменено.

Убедитесь, что вы переместили как файлы ldf, так и mdf

  1. В SSMS щелкните правой кнопкой мыши Сервер и выберите свойства. Внутри свойства перейдите в настройки базы данных. Измените расположение базы данных по умолчанию для данных и журнала на путь назначения. Выйдите из системы с сервера.

    Например: изменить C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\наE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Остановите экземпляр SQL Server.

  3. Скопируйте файл или файлы в новое место. Используйте Robocopy для перемещения файлов, чтобы скопировать права доступа в папку назначения. Откройте cmd и запустите от имени администратора и используйте следующую команду:

    robocopy / sec sourceFolder destinationFolder

Лучше перейти в исходное местоположение, чтобы запустить команду. Удалите другие файлы, кроме файлов системной базы данных, которые копируются. Например:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(Здесь мы перемещаем все файлы базы данных системы в новое место.)

  1. В меню «Пуск» выберите «Все программы», «Microsoft SQL Server», «Инструменты настройки», а затем «Диспетчер конфигурации SQL Server».

Выполните следующие шаги в диспетчере конфигурации SQL Server:

В узле Службы SQL Server щелкните правой кнопкой мыши экземпляр SQL Server (например, SQL Server (MSSQLSERVER)) и выберите Свойства. В диалоговом окне Свойства SQL Server (имя_экземпляра) перейдите на вкладку Параметры запуска. В поле «Существующие параметры» выберите параметр –d, чтобы переместить файл основных данных. Нажмите «Обновить», чтобы сохранить изменения. В поле Указать параметр запуска измените параметр на новый путь к базе данных master. В поле «Существующие параметры» выберите параметр –l, чтобы переместить главный файл журнала. Нажмите «Обновить», чтобы сохранить изменения. В поле Указать параметр запуска измените параметр на новый путь к базе данных master.

Значение параметра для файла данных должно соответствовать параметру -d, а значение для файла журнала должно соответствовать параметру -l. В следующем примере показаны значения параметров для расположения по умолчанию файла основных данных.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

Если запланированное перемещение для файла основных данных E: \ SQLData, значения параметров будут изменены следующим образом:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

Остановите экземпляр SQL Server, щелкнув правой кнопкой мыши имя экземпляра и выбрав Стоп. Перезапустите экземпляр SQL Server.

  1. Войдите в систему как saпользователь в SSMS и проверьте расположение файлов базы данных, выполнив следующий запрос:

    USE master;
    SELECT * FROM sys.master_files;

Все сделано.

Абхай Срикумар
источник
Вы можете использовать функцию SQL для автоматизации задач для всех баз данных: stackoverflow.com/a/19505918/439524
amuliar
3

Вы делаете шаг за шагом:

  1. закрыть все соединение
    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

  2. установить базу данных со статусом офлайн
    ALTER DATABASE MyDB SET OFFLINE

  3. По новому пути
    ALTER DATABASE MyDB MODIFY FILE (Имя = MyDB, Имя файла = 'N: \ DATA \ MyDB.MDF')

  4. установить базу данных со статусом онлайн
    ALTER DATABASE MyDB SET ONLINE

  5. установить многопользовательскую
    ALTER DATABASE MyDB SET MULTI_USER

Nguyễn HĐi Đăng
источник
3

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

Деян Накарада-Кордик имеет объяснение + сценарии для этого метода здесь: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

Короткая версия состоит в том, что вы добавляете другой файл базы данных в новом месте, а затем используете DBCC Shrinkfile с опцией EMPTYFILE, чтобы переместить данные из старого файла в новый файл. Когда это будет сделано, вы можете удалить старый файл данных.

Не мое решение, я сам искал это решение и нашел его очень полезным для нашей производственной среды.

Thorfinn

Торфинн Томассен
источник
1

Выполните следующие простые 4 шага:

  1. Откройте SSMS и выберите опцию New Query в верхней части окна. Затем скопируйте и выполните следующий запрос для поиска пути к базе данных, которую мы хотим переместить на новый путь, и отметьте тот путь, который вы указываете в CurrentLocationстолбце.

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

  1. Теперь перейдите по этому пути и запишите имена файлов Database_Name.mdf и Database_Name_log.ldf . Затем выполните следующие два запроса для перемещения базы данных в определенное место.

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');

ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');

  1. Теперь остановите сервер правой кнопкой мыши, Server_Nameкоторый вы видите в обозревателе объектов (левая сторона).

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

  2. Затем переместите оба файла из старого пути в новый путь и снова запустите сервер, щелкнув правой кнопкой мыши имя_сервера. Подтвердите новый путь к базе данных, снова выполнив запрос первого шага.

Каран Райяни
источник
0

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

Сначала сделайте резервную копию базы данных в файл .bak. Затем восстановите базу данных из того же файла .bak, выбрав новые расположения файлов .mdf и .ldf в разделе параметров файла для задачи восстановления.

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

Али
источник
1
Этот сценарий имеет некоторые недостатки. При восстановлении исходная БД должна быть перезаписана или переименована. Для больших баз данных метод вводит серьезные издержки ввода-вывода. Перемещение файлов, как описано в методах detach-attach или alter db, выполняется намного быстрее. Если файлы перемещаются в пределах одного раздела NTFS, это только операция метаданных.
vonPryz
@Ali - Резервное копирование и восстановление. Может занять больше времени, но обычно это более безопасный путь. См. Анализ Аарона Бертранда по адресу: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups. Также: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF,
Для очень больших баз данных этот подход (и подход отсоединения / присоединения) приводит к существенному времени простоя. Чтобы избежать этого, переведите исходную базу данных в режим полного восстановления, затем выполните первоначальное восстановление резервной копии, оставив БД-адресат в нерабочем состоянии. Затем выполните резервное копирование / восстановление одного или нескольких журналов транзакций. База данных должна быть недоступна только во время окончательного резервного копирования / восстановления журнала транзакций, который может содержать произвольно малое время и размер. Очевидно, вам также нужно восстановить другое имя, а затем выполнить замену имени. Этот подход примерно эквивалентен доставке журналов.
Брайан,
0

В дополнение к существующим ответам: Вот скрипт для создания ALTER DATABASE ... MOVE ...операторов для всех баз данных:

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';

Примечание:

  • Замените REPLACE(f.physical_name, 'C:\', 'D:\')любым преобразованием, которое вы хотите внести в пути к файлам.

  • masterосвобождается, поскольку его путь определяется параметрами запуска SQL Server (подробности см., например, в этом ответе ).

Heinzi
источник