前言
SQL Server 複寫 是跨伺服器同步資料的成熟技術,支援快照、交易、合併三種模式。本文詳細說明複寫拓撲角色、前置條件、精靈式部署步驟 (發佈者/散發者/訂閱者)、推式/提取式訂閱選擇、常見問題排解,適用於 SQL Server 2000/2005/2008/2012/2014/2016/2017/2019/2022。
一、複寫拓撲三大角色
| 角色 | 比喻 | 職責 |
| 發佈者 | 出版社 | 定義發行什麼資料 (文章)、來源資料庫。 |
| 散發者 | 郵差 | 儲存交易/快照、傳遞給訂閱者。可與發佈者同機或獨立。 |
| 訂閱者 | 讀者 | 接收並套用資料變更。 |
二、前置條件 (必須逐項確認)
- 復原模式 = 完整 (FULL):資料庫屬性 → 選項 → 復原模式 → 完整。
- 所有發行資料表必須有主鍵:交易式複寫強制要求;無主鍵請加
ID INT IDENTITY(1,1) PRIMARY KEY。
- 伺服器註冊使用電腦名稱:SSMS 註冊時勿用 IP、localhost、(local)、. 等別名;跨網段需在
C:\Windows\System32\drivers\etc\hosts 設定 IP 對應。
- SQL Server Agent 服務啟動且使用本機系統管理員帳號:服務 → SQLSERVERAGENT → 登入身分 → 本機帳號 (Administrator 群組)。
- 建立同名 Windows 帳號、同密碼:用於快照資料夾存取、Agent 服務登入、散發者/訂閱者連線驗證。
- 建立共用快照資料夾:如
\\Publisher\ReplSnapshot,授予上述 Windows 帳號完整控制權限。
- 驗證模式 = SQL Server 和 Windows 混合模式:執行個體屬性 → 安全性。
三、複寫類型選擇指南
| 類型 | 適用場景 | 關鍵特性 |
| 快照式 | 資料量小、變動極低、允許延遲、定時全量重整 | 簡單、不需主鍵、每次全量覆寫、Identity 屬性不傳遞 |
| 交易式 | 高頻異動、需低延遲同步、伺服器對伺服器、需存取中間狀態 | 增量傳遞、保證交易一致性、需主鍵、Identity 可選傳遞 |
| 合併式 | 行動/離線用戶、多點雙向寫入、需衝突偵測解決 | 離線操作、後續同步、衝突解決器、資料分區、最終一致性 |
四、部署步驟:發佈者 + 散發者 (同機)
- SSMS → 複寫 → 右鍵「設定散發」→ 精靈。
- 散發者:選「本身做散發者」。
- 快照資料夾:輸入 UNC 路徑
\\Publisher\ReplSnapshot (非本機路徑)。
- 散發資料庫:接受預設
distribution 或自訂名稱/路徑。
- 啟用發佈者:勾選目前伺服器。
- 完成精靈,複寫監視器會出現在 SSMS 物件總管。
五、建立發行集
- 複寫 → 右鍵「新增發行集」→ 選擇來源資料庫。
- 選擇複寫類型 (快照/交易/合併)。
- 訂閱者類型:通常選「SQL Server 2005 或更新版本」。
- 選擇文章:勾選資料表、檢視、預存程序、函數;可設定篩選 (垂直/水平)。
- 快照代理程式排程:立即產生 + 定期重整 (如每日凌晨)。
- 安全性:快照代理、記錄讀取代理、散發代理分別設定執行帳號 (使用前置建立的 Windows 帳號)。
- 完成,發行集建立成功,來源資料庫圖示變為「手托資料庫」。
六、建立訂閱
推式訂閱 (由發佈者/散發者主動推送)
- 適用:訂閱者無公網 IP、或希望散發者掌控同步時機。
- 操作:發佈者 SSMS → 發行集右鍵「新增訂閱」→ 選訂閱者 → 訂閱資料庫 (新建或既有) → 散發代理排程 (連續/定期) → 初始化 (立即/排程) → 完成。
提取式訂閱 (由訂閱者主動提取)
- 適用:減輕散發者負載、訂閱者有公網 IP、跨網域/防火牆較易控制出站連線。
- 操作:在訂閱者 SSMS → 複寫 → 本機訂閱右鍵「新增訂閱」→ 指定發佈者/發行集 → 後續步驟同推式。
七、常見問題排解
| 現象 | 可能原因 | 對策 |
| 快照代理失敗「存取被拒」 | 快照資料夾權限不足 | 檢查 UNC 路徑、Windows 帳號權限、防火牆 445 埠 |
| 記錄讀取代理「找不到資料庫」 | 資料庫非完整復原模式、或已卸離 | 確認復原模式、重新建立發行集 |
| 散發代理「無法連線訂閱者」 | 訂閱者 IP/埠/防火牆、SQL Browser 服務未啟動 | 測試 SSMS 連線、開啟 1433/動態埠、啟動 SQL Browser |
| 交易式複寫「主鍵違規」 | 訂閱者已有相同 PK 資料、或雙向寫入衝突 | 重新初始化訂閱、檢查身分插入設定、改用合併式 |
| Identity 欄位不同步 | 快照式不傳遞 Identity 屬性 | 改用交易式並勾選「傳遞 Identity 欄位」 |
八、監控與維護
- 複寫監視器:即時查看各代理狀態、延遲、錯誤、歷程記錄。
- 代理程式警示:設定 SQL Server Agent 警示 (如代理停止、延遲超過閾值) 發送郵件通知。
- 定期驗證:
sp_publication_validation、sp_article_validation、資料列計數比對。
- 清理歷史記錄:散發資料庫
distribution 設定保留期限 (預設 48 小時/72 小時),避免無限增長。
九、替代方案簡評
- AlwaysOn 可用性群組:高可用 + 讀取延伸,非異構同步首選。
- 異地複寫 / Azure SQL Data Sync:跨雲/混合雲場景。
- CDC + Kafka / Debezium:即時資料串流、微服務架構。
- SSIS / Azure Data Factory:批次 ETL、異構資料整合。
結語
SQL Server 複寫功能強大但設定繁瑣。嚴格落實前置條件、選對複寫類型、善用精靈與監視器、建立告警與驗證機制,即能建立穩定可靠的跨伺服器資料同步管道。隨著雲原生架構演進,評估現代替代方案 (CDC、可用性群組、資料串流) 亦為長遠規劃關鍵。