概覽:六大技術定位
| # | 技術 | 核心優勢 | 主要限制 | 建議場景 |
| 1 | DTS 設計師 / 匯入匯出精靈 | 圖形化、多任務、支援異構來源、可存套件排程 | 大量資料效能不如 BCP、套件版本管理弱 | 部分表遷移、異構 ETL、業務邏輯轉換 |
| 2 | BCP (Bulk Copy Program) | 極高速、低資源、命令列自動化、格式檔彈性 | 純文字/原生格式、無轉換邏輯、錯誤處理簡陋 | 初始大量載入、離線備份、跨平台文字交換 |
| 3 | 備份/還原 (BACKUP/RESTORE) | 完整保留結構、索引、權限、統計資料、交易一致性 | 需相同版本/相容等級、無法部分還原、檔案大 | 整庫遷移、災難復原、測試環境快速克隆 |
| 4 | 分離/附加 (sp_detach_db / sp_attach_db) | 檔案層級移動、極快、無資料複製開銷 | 需離線、檔案路徑固定、版本向上相容向下不相容 | 同版本伺服器間移動資料庫、儲存體遷移 |
| 5 | 應用層自訂 (INSERT...SELECT / SELECT...INTO) | 邏輯彈性、可攜帶業務規則、跨伺服器分散式查詢 | 效能受網路/交易記錄影響、需自行處理錯誤/重試 | 增量同步、異構同步、跨雲端/內部部署 |
| 6 | 複寫 | 近即時同步、支援篩選/轉換、雙向/合併拓撲 | 架構複雜、需主鍵、Agent/MSDTC 依賴、疑難排解難 | 異地備援、報表卸載、行動離線同步 |
關鍵操作細節與避坑指南
1. DTS/匯入匯出精靈
- 外鍵順序:先匯入父表再子表,或暫停約束
ALTER TABLE ... NOCHECK CONSTRAINT ALL,匯完再 CHECK CONSTRAINT ALL。
- 另存套件:
*.dts (SQL 2000) / *.dtsx (SSIS) 存入 MSDB 或檔案系統,便於版控與排程。
- 優化:資料流使用
Fast Load、批次大小 10,000~100,000、鎖定 TABLOCK、最小化記錄 (簡單復原模式)。
2. BCP
REM 匯出 (查詢輸出、含表頭需手工加入)
bcp "SELECT * FROM Db.dbo.Table ORDER BY ID" queryout "C:\Exp\data.txt" -c -t, -T -S.
REM 匯入 (需格式檔或目標表結構完全相符)
bcp Db.dbo.Table in "C:\Imp\data.txt" -c -t, -T -S. -h "TABLOCK" -b 50000
- -h "TABLOCK" 大量匯入鎖定表,減少記錄、提升速度。
- -b 批次大小 控制交易範圍,避免記錄暴增。
- 格式檔 (-f) 解決欄位順序/型別不符、跳過欄位。
3. 備份/還原
BACKUP DATABASE Db TO DISK='D:\Backup\Db.bak' WITH INIT, COMPRESSION, STATS=10;
RESTORE DATABASE Db FROM DISK='D:\Backup\Db.bak'
WITH MOVE 'Db_Data' TO 'D:\MSSQL\Data\Db.mdf',
MOVE 'Db_Log' TO 'D:\MSSQL\Log\Db.ldf',
REPLACE, STATS=10;
- REPLACE 覆蓋既有資料庫。
- MOVE 重新定位檔案路徑 (不同磁碟配置時必須)。
- 還原後執行
DBCC UPDATEUSAGE(0) 修正頁面計數。
4. 分離/附加
EXEC sp_detach_db @dbname = 'Db';
-- 複製 .mdf .ldf 至新伺服器
EXEC sp_attach_db @dbname = 'Db',
@filename1 = 'D:\MSSQL\Data\Db.mdf',
@filename2 = 'D:\MSSQL\Log\Db.ldf';
-- 僅附加資料檔 (自動重建記錄檔,舊記錄遺失)
EXEC sp_attach_single_file_db @dbname = 'Db', @physname = 'D:\MSSQL\Data\Db.mdf';
限制:SQL 2000 不支援 sp_attach_single_file_db (SQL 2005+ 才有),且附加後資料庫相容等級維持原版本,可能需 sp_dbcmptlevel 調整。
5. 應用層自訂
-- 跨伺服器分散式查詢 (需連結伺服器)
INSERT INTO LocalDb.dbo.Table (Col1, Col2)
SELECT Col1, Col2 FROM LinkedSrv.RemoteDb.dbo.Table WHERE LoadDate > @LastSync;
-- 或 SELECT INTO 建新表 (結構+資料一次完成)
SELECT * INTO NewTable FROM LinkedSrv.RemoteDb.dbo.SourceTable;
- 大量資料分批次 (如 5 萬列/批)、使用
TABLOCK、簡單復原模式減少記錄。
- 網路頻寬、延遲是主要瓶頸,考慮壓縮、異步佇列 (Service Broker / Azure Queue)。
6. 複寫必要條件清單
- SQL Server Agent 啟動、MSDTC (Distributed Transaction Coordinator) 啟動。
- 所有發行資料表 必須有主鍵。
text/image/ntext 欄位需 WITH LOG (不可 NO_LOG)。
max text repl size 設定足夠大 (預設 65536 Bytes)。
- 發行/訂閱端啟用 隱含共用 (Admin$ / C$ 等)。
- 代理程式帳號 不可為 Local System (需網路存取權)。
- 跨網域需建立 信任關係。
現代化建議 (SQL Server 2016+ / Azure)
- SSIS 取代 DTS:資料流引擎、平行執行、專案部署模型、Azure Feature Pack。
- PolyBase / OPENROWSET (BULK...):直接查詢 Azure Blob/ADLS/Parquet/ORC,免 ETL 落地。
- 資料庫遷移服務 (DMS) / Azure Migrate:線上無停機遷移、Schema/資料驗證。
- Always On 可用性群組 / 交易複寫:高可用與讀寫分離取代傳統複寫。