Sql-Server-2008

複製 SQL Server 數據庫

  • June 17, 2014

我希望將數據庫“移動”到不同的伺服器,同時盡量減少對數據和服務的干擾。這些數據庫的大小從 5GB 到 140GB 不等。

我已經看到甚至使用過 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

如果您無法在網路上複製您的 140GB 文件,那麼我已經使用複制數據庫嚮導獲得了好運。不過,如果可能的話,我仍然會使用分離/附加。

祝你好運!

引用自:https://serverfault.com/questions/605501