Копировать базы данных SQL Server
Я ищу "переместить" базы данных на разные серверы с минимальным нарушением данных и обслуживания. Размер этих баз данных варьируется от 5 до 140 ГБ.
Я видел и даже использовал некоторые из различных инструментов передачи данных SQL Server, но я не уверен в том, из чего получаются лучшие практики (отсоединение / повторное подключение, восстановление из резервной копии, журналы транзакций, зеркалирование...).
Больше всего я боюсь, что в этих базах данных хранится много проков, разрешений пользователей и различных индексов, и я не хочу их терять и в конечном итоге нарушать работу сервиса.
Моя последняя заяц-идея заключалась в том, чтобы настроить зеркало, а затем инициировать аварийное переключение вручную. Тем не менее, я бы предпочел спросить, прежде чем продолжить с тем, что я никогда не делал раньше.
TL; DR Каковы некоторые из передовых методов перемещения базы данных SQL Server, которые сводят к минимуму угрозу прерывания работы службы.
1 ответ
По моему опыту, detach/attach - самый быстрый метод. Возможно, узким местом будет то, как быстро вы сможете скопировать файлы по сети.
Предполагая, что две базы данных имеют идентичные учетные записи Windows (если вы используете учетные записи SQL, вам, возможно, придется обновлять SID), вы, вероятно, могли бы использовать что-то вроде этого сценария, который я описал до того, как начал переписывать все в PowerShell.:) Он предназначен для запуска на исходном сервере и использует файл со списком баз данных для перемещения.
@ECHO ON
set newipmdf=\\newserver\g$
set newipldf=\\newserver\e$
set controlfile=control.txt
set oldserver=oldserver\instance
set oldmdfpath=d:\instance
set newmdfpath=g:\instance
set copymdfpath="m:\instance"
set newserver=newserver\instance
set oldlogpath=e:\instance
set newlogpath=e:\instance
set copylogpath="l:\instance"
set movedmdfpath=%oldmdfpath%\moved
set movedldfpath=%oldlogpath%\moved
mkdir %movedmdfpath%
mkdir %movedldfpath%
net use m: %newipmdf%
net use l: %newipldf%
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (%controlfile%%) DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !line!
sqlcmd -E -S!oldserver! -Q"EXEC master.dbo.sp_detach_db @dbname = N'!line!'"
copy "!oldmdfpath!\!line!.mdf" !copymdfpath!
copy "!oldlogpath!\!line!_log.ldf" !copylogpath!
sqlcmd -E -S!newserver! -Q"CREATE DATABASE [!line!] ON ( FILENAME = '!newmdfpath!\!line!.mdf' ),( FILENAME = N'!newlogpath!\!line!_log.ldf' ) FOR ATTACH"
move "!oldmdfpath!\!line!.mdf" !movedmdfpath!
move "!oldlogpath!\!line!_log.ldf" !movedldfpath!
ENDLOCAL
)
ENDLOCAL
net use m: /z
net use l: /z
Если вам не хватает времени, чтобы скопировать файл размером 140 ГБ по сети, мне повезло с мастером копирования базы данных. Я все еще использовал бы detach / attach, если это возможно, хотя.
Удачи!