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!