Ответы:
Вам не нужно останавливать службу 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;
Вы можете увидеть это описано более подробно здесь .
MODIFY FILE
порядок меняется. Если вы сначала запустите MODIFY FILE, он сообщит вам, что команда выполняется успешно, и местоположение будет изменено после автономной онлайн-операции (формулировка другая, но вы понимаете). Порядок Offline-> Move files-> Online имеет значение, хотя и по понятной причине. Также отметьте примечание Demonslay335. Разрешение файла важно.
Файлы 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
. В процессе восстановления вы можете определить новое расположение файлов базы данных.
Для перемещения файлов системной базы данных выполните следующие действия:
Войти как пользователь sa в SSMS
Сделайте резервную копию созданной пользователем базы данных для безопасности.
Убить все сеансы, подключенные к Серверу из SSMS.
Выполните следующую команду, чтобы проверить текущее расположение файлов системных баз данных:
USE master;
SELECT * FROM sys.master_files;
Определите путь и запишите текущий путь к файлам.
Используйте 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
В SSMS щелкните правой кнопкой мыши Сервер и выберите свойства. Внутри свойства перейдите в настройки базы данных. Измените расположение базы данных по умолчанию для данных и журнала на путь назначения. Выйдите из системы с сервера.
Например: изменить C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\
наE:\projects\DataBaseFiles\MSSQL\DATA\
Остановите экземпляр SQL Server.
Скопируйте файл или файлы в новое место. Используйте Robocopy для перемещения файлов, чтобы скопировать права доступа в папку назначения. Откройте cmd и запустите от имени администратора и используйте следующую команду:
robocopy / sec sourceFolder destinationFolder
Лучше перейти в исходное местоположение, чтобы запустить команду. Удалите другие файлы, кроме файлов системной базы данных, которые копируются. Например:
robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\
(Здесь мы перемещаем все файлы базы данных системы в новое место.)
Выполните следующие шаги в диспетчере конфигурации 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.
Войдите в систему как sa
пользователь в SSMS и проверьте расположение файлов базы данных, выполнив следующий запрос:
USE master;
SELECT * FROM sys.master_files;
Все сделано.
Вы делаете шаг за шагом:
закрыть все соединение
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
установить базу данных со статусом офлайн
ALTER DATABASE MyDB SET OFFLINE
По новому пути
ALTER DATABASE MyDB MODIFY FILE (Имя = MyDB, Имя файла = 'N: \ DATA \ MyDB.MDF')
установить базу данных со статусом онлайн
ALTER DATABASE MyDB SET ONLINE
установить многопользовательскую
ALTER DATABASE MyDB SET MULTI_USER
Есть способ переместить файлы данных базы данных (пока не уверен, есть ли способ сделать это для файлов журналов), не переводя базу данных в автономный режим.
Деян Накарада-Кордик имеет объяснение + сценарии для этого метода здесь: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline
Короткая версия состоит в том, что вы добавляете другой файл базы данных в новом месте, а затем используете DBCC Shrinkfile с опцией EMPTYFILE, чтобы переместить данные из старого файла в новый файл. Когда это будет сделано, вы можете удалить старый файл данных.
Не мое решение, я сам искал это решение и нашел его очень полезным для нашей производственной среды.
Thorfinn
Выполните следующие простые 4 шага:
CurrentLocation
столбце.
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
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');
Теперь остановите сервер правой кнопкой мыши, Server_Name
который вы видите в обозревателе объектов (левая сторона).
Затем переместите оба файла из старого пути в новый путь и снова запустите сервер, щелкнув правой кнопкой мыши имя_сервера. Подтвердите новый путь к базе данных, снова выполнив запрос первого шага.
Я не уверен, что это лучший способ (я хотел бы получить любые комментарии, чтобы сказать мне, как это не так), но это очень просто (и быстро, если у вас небольшая база данных):
Сначала сделайте резервную копию базы данных в файл .bak. Затем восстановите базу данных из того же файла .bak, выбрав новые расположения файлов .mdf и .ldf в разделе параметров файла для задачи восстановления.
Я бы не стал делать это в производственной среде, кроме окна обслуживания, поскольку вы не можете получить доступ к базе данных во время восстановления. Другие методы, которые я видел выше, имели бы подобные недостатки. После того, как задача восстановления выполнена, вам не нужно удалять старый файл. Это автоматически делается.
В дополнение к существующим ответам: Вот скрипт для создания 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 (подробности см., например, в этом ответе ).
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