首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 複寫技術完整實作指南

     編輯:關於SqlServer

SQL Server 2000 複寫架構核心概念

複寫是將資料從一個來源複製分發到多個目的地的技術,確保分散式環境下資料的一致性與可用性。SQL Server 2000 採用「發行/訂閱」模型,包含五大核心元件:

  • 發行者:資料來源伺服器,定義發行集合
  • 散發者:管理複寫流程、儲存交易記錄的中介伺服器
  • 訂閱者:接收資料的目標伺服器
  • 發行集:邏輯上相關的發行項集合
  • 發行項:具體的資料庫物件(資料表、檢視、預存程序等)

三大複寫類型深度比較

類型適用場景同步機制延遲網路頻寬衝突處理
快照式複寫資料量小、變動少、定期重整定時完整複製高 (依排程)爆發式無 (以發行者為準)
交易式複寫高一致性需求、OLTP 系統、即時報表交易記錄讀取與重播低 (秒級)持續平穩發行者勝出
合併式複寫離線用戶、多點更新、行動應用觸發器追蹤變更、合併代理程式協調可配置間歇性優先權/自訂解析器

複寫拓撲設計決策樹

  1. 資料流向單向 + 低延遲需求 → 交易式複寫
  2. 訂閱端需離線編輯 + 定期同步 → 合併式複寫
  3. 唯讀報表伺服器 + 定期重整可接受 → 快照式複寫
  4. 多地區雙向寫入 + 衝突可接受 → 雙向交易式複寫 (2000 SP1+)

推式 vs 拉式訂閱效能抉擇

維度推式訂閱 (Push)拉式訂閱 (Pull)
代理程式執行位置散發者端訂閱者端
散發者負載較高較低
訂閱者自主性低高 (可控制同步時間)
防火牆穿透需散發者存取訂閱者需訂閱者存取散發者
適用場景訂閱者少、集中管理訂閱者多、異地/行動裝置

建議:先實作推式訂閱建立基線,再測試拉式訂閱比較效能差異。

逐步實作:交易式複寫部署

階段 1:散發者設定

-- 在散發者伺服器執行
EXEC sp_adddistributor @distributor = 'DIST_SVR', @password = 'StrongPwd123';
EXEC sp_adddistributiondb @database = 'distribution', 
    @data_folder = 'D:\MSSQL\Data', @log_folder = 'D:\MSSQL\Log';
EXEC sp_adddistpublisher @publisher = 'PUB_SVR', 
    @distribution_db = 'distribution', @working_directory = '\\DIST_SVR\ReplShare';

階段 2:發行集建立 (發行者端)

-- 建立交易式發行集
EXEC sp_addpublication @publication = 'Sales_Tran_Pub',
    @status = 'active', @repl_freq = 'continuous',
    @sync_method = 'native', @allow_push = 'true', @allow_pull = 'true';

-- 加入發行項 (篩選特定欄位/列)
EXEC sp_addarticle @publication = 'Sales_Tran_Pub',
    @article = 'Orders', @source_object = 'Orders',
    @type = 'logbased', @vertical_partition = 'true';

-- 只發行必要欄位
EXEC sp_articlecolumn @publication = 'Sales_Tran_Pub',
    @article = 'Orders', @column = 'OrderID', @operation = 'add';
EXEC sp_articlecolumn @publication = 'Sales_Tran_Pub',
    @article = 'Orders', @column = 'CustomerID', @operation = 'add';
-- ... 其他必要欄位

階段 3:建立推式訂閱

-- 散發者端建立訂閱
EXEC sp_addsubscription @publication = 'Sales_Tran_Pub',
    @subscriber = 'SUB_SVR', @destination_db = 'Sales_Report',
    @sync_type = 'automatic', @update_mode = 'read only',
    @subscriber_type = 0;  -- 0=推式

-- 設定散發代理程式排程 (每分鐘同步)
EXEC sp_addpushsubscription_agent @publication = 'Sales_Tran_Pub',
    @subscriber = 'SUB_SVR', @subscriber_db = 'Sales_Report',
    @frequency_type = 4, @frequency_interval = 1,
    @frequency_subday = 4, @frequency_subday_interval = 1;  -- 每 1 分鐘

監控與驗證關鍵指標

  • 未散發命令數:sp_replmonitorsubscriptionpendingcmds 應接近 0
  • 延遲時間:交易式複寫目標 < 30 秒,合併式依業務定義
  • 代理程式狀態:所有代理程式 (Log Reader、Distribution、Merge) 持續執行中
  • 衝突記錄:合併式複寫需定期檢視 MSmerge_conflict_* 資料表

常見問題排查速查表

症狀可能原因解決方向
Log Reader Agent 失敗交易記錄截斷、資料庫鎖定檢查復原模式、增加記錄檔大小
訂閱者資料不一致快照過期、Schema 變更未傳播重新初始化訂閱、使用 sp_repladdcolumn
合併衝突頻發優先權設定不當、無自訂解析器調整發行項衝突解析器、業務邏輯介入
散發資料庫暴增訂閱者離線過久、清理作業失效檢查散發保留期限、手動執行 sp_MSdistribution_cleanup

高可用性架構整合建議

複寫不適合作為主要高可用性方案 (建議改用資料庫鏡像/AlwaysOn),但可輔助報表卸載、異地備份。若用於災難復原,需嚴格測試 RTO/RPO 並建立自動容錯移轉腳本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved