方法一:離線附加遷移 (適用同版本、可停機)
- 來源端:停止 SQL Server 服務 → 複製 `.mdf`、`.ldf` 至目標機同路徑或指定路徑。
- 目標端:企業管理員 → 右鍵「資料庫」→「所有工作」→「附加資料庫」→ 選擇 MDF → 修改資料庫名稱 (如 `OldDB_Bak`)。
- 建立同名空資料庫 (使用預設值)。
- 安全性 → 登入 → 新增實際應用登入 → 對應資料庫 → 勾選 `db_owner`。
關鍵: 附加後原登入與使用者 SID 可能不匹配 (孤立使用者),需重建登入並修復映射。
- 資料遷移:企業管理員 → 右鍵來源附加庫 (`OldDB_Bak`) →「所有工作」→「匯出資料」→ 選擇「在 SQL Server 資料庫之間複製物件和資料」→ 目標選新建空庫 → 完成。
方法二:備份還原遷移 (通用、跨版本相容)
- 來源端:企業管理員 → 右鍵資料庫 →「所有工作」→「備份資料庫」
— 備份類型:完整
— 目的地:磁碟 → 新增 `.bak` 檔案路徑
— 選項:覆蓋現有媒體、檢查校驗和、繼續前驗證備份
- 若 `.bak` > 1GB,建議壓縮 (7-Zip) 傳輸。
- 目標端:若無同名庫先建立空庫 → 右鍵 →「所有工作」→「還原資料庫」
— 從裝置 → 選擇 `.bak` → 確定
— 選項:強制還原、保留複寫設定 (視需求)
- 若還原失敗提示「資料庫正在使用」:
企業管理員 → 管理 → 目前活動 → 鎖/物件 → 找到資料庫 SPID → 查詢分析器 `KILL ` → 重試還原。
方法三:資料庫專案部署 (現代化、版本化)
使用 SSDT (SQL Server Data Tools) 建立資料庫專案 (`.sqlproj`),將結構納入 Git 版控,CI/CD 管線執行發布:
# Azure DevOps / GitHub Actions 範例
- task: SqlServerDacpacDeployment@1
inputs:
SqlServer: '$(sqlServer)'
Database: '$(dbName)'
DacpacFile: '$(Build.ArtifactStagingDirectory)/MyDb.dacpac'
PublishProfile: 'MyDb.publish.xml'
AdditionalArguments: '/p:BlockOnPossibleDataLoss=False'
優勢: 版本化、可重複、支援增量更新、自動處理相依順序、可預覽變更腳本。
遷移後驗證清單
| 項目 | 檢查指令 / 動作 |
| 資料庫上線狀態 | `SELECT name, state_desc FROM sys.databases WHERE name = 'MyDB';` |
| 使用者/登入映射 | `EXEC sp_change_users_login 'Report';` → `Auto_Fix` 修復孤立使用者 |
| 統計資料更新 | `EXEC sp_updatestats;` |
| 完整性驗證 | `DBCC CHECKDB('MyDB') WITH NO_INFOMSGS;` |
| 相容性等級 | `ALTER DATABASE MyDB SET COMPATIBILITY_LEVEL = 150;` (SQL 2019) |
| 備份鏈完整性 | 執行完整備份 → 還原驗證 `RESTORE VERIFYONLY` |
常見坑點與對策
- 孤立使用者: 附加/還原後 SID 不匹配 → `sp_change_users_login 'Auto_Fix', 'user', NULL, 'newpwd'` 或含 `SID` 的 `CREATE LOGIN`。
- 檔案路徑不存在: 還原時用 `WITH MOVE` 指定新路徑:
`RESTORE DATABASE MyDB FROM DISK='...' WITH MOVE 'MyDB_Data' TO 'D:\Data\MyDB.mdf', MOVE 'MyDB_Log' TO 'L:\Log\MyDB.ldf', REPLACE;`
- 版本降級不可行: 高版本備份無法在低版本還原;需用腳本/專案重建。
- 大型資料庫還原耗時: 啟用瞬間檔案初始化、使用多條備份條帶 (Stripe)、考慮檔案群組分頁還原。