Я хочу «переместить» базы данных на другие серверы с минимальным нарушением данных и обслуживания. Эти базы данных различаются по размеру от 5 до 140 ГБ.
Я видел и даже использовал некоторые из различных инструментов передачи данных SQL Server, но я не уверен, что лучше всего использовать (отсоединение / повторное подключение, восстановление из резервной копии, журналы транзакций доставки, зеркало ...).
Я больше всего боюсь, что в этих базах данных есть много хранимых процедур, разрешений пользователей и различных индексов, и я не хочу их потерять и в конечном итоге нарушить работу службы.
Моя последняя безумная идея - поставить зеркало, а затем инициировать переключение вручную. Однако я лучше спрошу, прежде чем приступить к тому, чего я никогда раньше не делал.
TL; DR Каковы некоторые из передовых методов перемещения базы данных SQL Server, которые сводят к минимуму угрозу прерывания обслуживания.
По моему опыту, отсоединение / присоединение - самый быстрый метод. Узким местом, вероятно, будет то, насколько быстро вы сможете скопировать файлы по сети.
Предполагая, что две базы данных имеют идентичные учетные записи 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 ГБ по сети, мне повезло с мастером копирования базы данных. Однако, если возможно, я бы все равно использовал отсоединение / прикрепление.
Удачи!