SQL Server 資料庫遷移是 DBA 核心技能。本文詳細說明三大主流遷移方法:**備份還原 (最通用)**、**分離附加 (最快、需停機)**、**導入導出 (跨版本、可選擇性遷移)**,並涵蓋登入遷移、孤立用戶修復、作業/警示/SSIS 遷移等完整清單。
| 選項 | 用途 |
| WITH MOVE | 目標路徑與來源不同 (如無 D 槽、盤符不同) |
| WITH REPLACE | 覆蓋目標同名資料庫 |
| WITH CHECKSUM | 備份/還原過程驗證頁面檢查碼,防靜默損壞 |
| COMPRESSION | 壓縮備份集,減少傳輸時間與儲存空間 |
方法二:分離附加 — 極速、需離線、同版本/相容版本
限制
- 來源資料庫**必須離線** (分離期間不可存取)
- 目標版本**相同或更高** (不支援降級)
- 排序規則必須相容 (SQL 2000 間需相同;2005+ 保留來源排序規則)
流程
- 分離 (來源):
EXEC sp_detach_db @dbname = 'MyDB', @skipchecks = 'true'; -- skipchecks 加速
- 複製
.mdf、.ndf、.ldf 至目標伺服器對應路徑
- 附加 (目標):
EXEC sp_attach_db @dbname = 'MyDB',
@filename1 = 'D:\Data\MyDB.mdf',
@filename2 = 'L:\Log\MyDB_Log.ldf';
或單檔附加 (無記錄檔,自動重建):
EXEC sp_attach_single_file_db @dbname = 'MyDB',
@physname = 'D:\Data\MyDB.mdf';
方法三:導入導出精靈 / SSIS / bcp — 可選擇性遷移、跨版本最穩
優勢
- 可僅遷移特定表/檢視/預存程序
- 來源/目標版本、排序規則**完全無關**
- 目標資料庫體積較小 (不含未使用空間、碎片)
工具選擇
- SSMS 導入導出精靈:圖形化、適合一次性小量
- SSIS (Integration Services):企業級 ETL、可排程、錯誤處理、資料轉換
- bcp (Bulk Copy Program):命令列、最高效能大量匯出入、適合自動化腳本
bcp 範例
-- 匯出
bcp MyDB.dbo.BigTable out BigTable.dat -S SourceServer -U user -P pass -c -t, -r\n
-- 匯入 (目標表需存在)
bcp MyDB.dbo.BigTable in BigTable.dat -S TargetServer -U user -P pass -c -t, -r\n -b 10000 -h "TABLOCK"
遷移後必做:登入與權限同步
1. 腳本化登入 (含 SID、密碼雜湊)
-- 來源執行 (sp_help_revlogin 微軟官方腳本)
EXEC sp_help_revlogin;
-- 複製輸出至目標執行,建立相同 SID 的登入
2. 修復孤立用戶
-- 目標資料庫執行
EXEC sp_change_users_login 'Report'; -- 列出孤立用戶
-- 修復標準登入
EXEC sp_change_users_login 'Auto_Fix', 'app_user', NULL, 'NewPass!';
-- 修復 dbo 擁有者
EXEC sp_changedbowner 'sa';
3. 同步預設資料庫
ALTER LOGIN app_user WITH DEFAULT_DATABASE = MyDB;
遷移輔助組件清單
| 組件 | 遷移方式 |
| SQL Agent 作業 | SSMS 右鍵作業 → 指令碼產生 → 目標執行 |
| 警示/操作員 | 同作業,或 msdb 表腳本化 |
| SSIS 套件 | SSISDB 部署精靈 / dtutil / 檔案系統複製 |
| 連結伺服器 | 腳本化 sp_addlinkedserver |
| 資料庫郵件設定 | msdb.dbo.sysmail_* 表腳本化 |
| 備份/還原歷史 | 若需保留,遷移 msdb (含風險,建議重建) |
排序規則 (Collation) 遷移陷阱
- SQL 2000 → 2000:來源/目標 Collation 必須完全相同
- SQL 2000 → 2005+ / 2005+ 之間:資料庫保留來源 Collation,但
tempdb 為目標實例 Collation → 臨時表聯接可能衝突
- 解決:目標實例安裝時指定相同 Collation,或資料庫層級
ALTER DATABASE COLLATE (需離線、重建所有索引/統計)
遷移核對清單 (上線前必驗)
- 資料列數核對:
SELECT COUNT(*) FROM src.tbl EXCEPT SELECT COUNT(*) FROM dst.tbl
- 核心業務查詢效能基線對比
DBCC CHECKDB 無錯誤
- 登入/用戶/權限完整對應
- Agent 作業啟用、排程正確
- 連結伺服器連通性
- 備份作業排程已建立
- 監控告警已配置
總結建議
| 場景 | 推薦方法 | 備註 |
| 同版本、可停機、大資料庫 (>500GB) | 分離附加 | 最快,避免備份/還原 IO 開銷 |
| 跨版本、需線上、異地 | 備份還原 + 記錄備份 | 最通用、支援 PITR、可壓縮傳輸 |
| 選擇性遷移、Schema 重構、跨平台 | SSIS / 導入導出 / bcp | 彈性最高、可做資料清洗/轉型 |
遷移不只是「搬資料」,更是「驗證、同步、監控」的系統工程。請依清單逐項核對,確保零驚喜上線。
- 上一篇文章: SQL 語句極致優化 34 條鐵律:從 Oracle 到通用關聯式資料庫的效能聖經
- 下一篇文章: SQL Server 用戶自定義資料庫修復完整操作手冊
Copyright ©
程式碼之家 All Rights Reserved