Copie os bancos de dados do SQL Server

6

Eu estou olhando para "mover" bancos de dados para servidores diferentes com o mínimo de interrupção de dados e serviços. Esses bancos de dados variam em tamanho, de 5 GB a 140 GB.

Eu vi e até mesmo usei algumas das várias ferramentas de transferência de dados do SQL Server, mas não tenho certeza de qual é a melhor prática (Detach / Reattach, Restaurar do backup, Enviar logs de transações, Espelhar ... ).

Meu maior medo é que esses bancos de dados tenham muitos procs armazenados, permissões de usuário e vários índices, e não quero perdê-los e acabar interrompendo o serviço.

A minha ideia mais recente é configurar um espelho e, em seguida, iniciar um failover manual . No entanto, prefiro perguntar antes de prosseguir com algo que nunca fiz antes.

TL; DR Quais são algumas das melhores práticas para mover um banco de dados do SQL Server que minimiza a ameaça de interrupção do serviço.

    
por Black Dynamite 16.06.2014 / 17:23

1 resposta

3

Na minha experiência, desanexar / anexar é o método mais rápido. O gargalo provavelmente seria a rapidez com que você poderia copiar os arquivos pela rede.

Supondo que os dois bancos de dados possuam contas idênticas do Windows (se você estiver usando contas SQL, talvez seja necessário atualizar SIDs), provavelmente poderia usar algo como esse script de antes de começar a reescrever tudo no PowerShell. :) Pretende ser executado no servidor de origem e usa um arquivo com uma lista de bancos de dados para mover.

@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

Se você não puder ficar longe o suficiente para copiar o arquivo de 140 GB pela rede, tive boa sorte com o assistente de banco de dados de cópia. Eu ainda usaria desanexar / anexar se possível, embora.

Boa sorte!

    
por 18.06.2014 / 00:12