複寫核心概念
| 角色 | 說明 |
| 發行者 | 資料來源,發布資料變更 |
| 散發者 | 暫存變更命令,含散發資料庫 |
| 訂閱者 | 接收變更的目標伺服器 |
| 發行集 | 一組文章的邏輯容器 |
| 文章 | 具體同步單位:資料表/檢視表/預存程序執行結果 |
三種複寫類型選型指南
| 類型 | 延遲 | 一致性 | 頻寬 | 適用場景 |
| 快照式 | 高 (排程間隔) | 最終一致 | 大 (全量) | 資料量小、變更頻率低、報表/唯讀訂閱 |
| 交易式 | 低 (秒級) | 交易一致 | 中 (增量命令) | OLTP 高可用、即時同步、異構訂閱 |
| 合併式 | 可配置 | 最終一致 (衝突解析) | 中 | 離線/行動用戶端、雙向寫入 |
快照式複寫手把手建立 (EM 圖形化)
步驟 1:設定發行者/散發者
- 工具 → 複寫 → **設定發行者、訂閱者和散發者**
- 嚮導完成後,伺服器樹出現「複寫監視器」,自動建立
distribution 資料庫
步驟 2:建立發行集
- 工具 → 複寫 → **建立和管理發行集**
- 選資料庫 → **建立發行集** → 類型選 **快照式發行集**
- 訂閱者類型選 **SQL Server 2000**
- 選文章 (資料表) → 完成嚮導
步驟 3:建立訂閱 (Pull 訂閱)
- 在**訂閱者**伺服器:工具 → 複寫 → **要求訂閱**
- 選發行者/發行集 → 確認 Agent 服務已啟動 → 完成
驗證同步成功
- 複寫監視器 → 發行集 → 右鍵 **啟動代理程式** → 檢視狀態「成功」
- 排程設為 **每分鐘執行** (0:00-23:59)
- 檢查
C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\... 產生時間命名資料夾
- 訂閱者資料庫確認文章資料表已出現
手工同步替代方案:Linked Server + 排程作業
適合**不想用複寫基礎設施**、需自訂邏輯 (過濾、轉換、錯誤重試) 的場景。
核心邏輯:變更追蹤 + MERGE/UPSERT
-- 來源端:建立變更表 (觸發器填充)
CREATE TABLE dbo.ChangeLog (
TableName SYSNAME,
PKValue VARCHAR(100),
OpType CHAR(1), -- I/U/D
ChangeTime DATETIME DEFAULT GETDATE()
);
-- 目的端:排程作業讀取 ChangeLog 執行同步
-- 使用 MERGE (2008+) 或 LEFT JOIN + INSERT/UPDATE/DELETE
優缺點對比
| 維度 | 複寫 | 手工同步 |
| 部署複雜度 | 高 (需散發者、Agent、權限) | 低 (Linked Server + Job) |
| 延遲 | 交易式可達秒級 | 取決於 Job 排程 (通常分鐘級) |
| Schema 變更傳播 | 自動 (DDL 複寫) | 需手工同步 DDL |
| 衝突處理 | 合併式內建解析器 | 需自行實作 |
| 監控/重試 | 複寫監視器、代理程式警示 | 需自建監控 |
常見問題排查
- Agent 服務未啟動:SQL Server Agent 必須運行,代理程式才能執行。
- 權限不足:散發者/訂閱者需具備
db_owner 或特定複寫角色權限。
- 快照代理程式失敗:檢查磁碟空間、快照資料夾權限、大物件 (text/image) 處理。
- 交易式複寫延遲暴增:
sp_replmonitorsubscriptionpendingcmds 檢查積壓命令數;優化訂閱端索引、批次大小、平行處理。
結語
SQL Server 複寫提供企業級同步框架:**快照式適合唯讀報表、交易式適合高可用/即時同步、合併式適合離線雙向**。若基礎設施受限或需高度自訂邏輯,Linked Server + 變更追蹤 + 排程作業是輕量替代方案。選型核心:**業務容忍延遲、雙向寫入需求、Schema 變更頻率、運維能力**。