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

Oracle 高級復制實戰:異構環境下多站點數據同步架構指南

     編輯:Oracle 資料庫基礎

項目背景與業務痛點

某企業總部設於北京,下轄上海、杭州、武漢三大營業部。各分部業務系統獨立運行,數據庫結構完全一致。業務需求:每日將三地分部的全量業務數據異步彙總至總部數據庫,滿足備份容災與全域統計分析雙重目標。這正是 Oracle 高級復制 實體化視圖 異步刷新模式的典型應用場景。

核心概念解析

術語定義本案例映射
主站點提供數據源的站點上海、杭州、武漢數據庫
實體化視圖站點接收數據的目標站點北京總部數據庫
實體化視圖目標端對應源表的實體表,僅通過復制機制維護北京庫中 SHORACL、HZORACL、WHORACL 模式下的表
快速刷新僅同步增量變更,需靠 MLOG 支持本案例採用每日一次完全刷新策略
主體組 / 視圖組源端/目標端復制對象的邏輯集合sh_rep 等

環境準備清單

  1. 網絡互通:配置 TNSNAMES,確保四節點雙向連通(別名:SH, HZ, WH, BJ)。
  2. 版本兼容:目標庫版本 ≥ 源庫版本(均為 9i)。
  3. 字符集一致:建議統一字符集避免轉換亂碼。
  4. 表空間規劃:目標端為每個源站點創建獨立表空間,預留增長空間。
  5. 模式映射:源端均為同一模式名,目標端創建三個差異化模式(SHORACL, HZORACL, WHORACL)隔離數據。

上海站點主庫配置實戰

1. 創建復制管理員並授權

CONNECT system/passwd@SH
CREATE USER repadmin IDENTIFIED BY repadmin;

BEGIN
  DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA(username => 'repadmin');
END;
/

GRANT COMMENT ANY TABLE TO repadmin;
GRANT LOCK ANY TABLE TO repadmin;
-- 若需使用視圖管理器
GRANT SELECT ANY DICTIONARY TO repadmin;

2. 註冊傳播器

BEGIN
  DBMS_DEFER_SYS.REGISTER_PROPAGATOR(username => 'repadmin');
END;
/
-- 注意:原文拼寫 register_purpagator 應為 REGISTER_PROPAGATOR

3. 調度清除作業

CONNECT repadmin/repadmin@SH
BEGIN
  DBMS_DEFER_SYS.SCHEDULE_PURGE(
    next_date => SYSDATE,
    interval  => 'SYSDATE + 1',  -- 每日執行
    delay_seconds => 0
  );
END;
/

4. 創建目標端代理用戶

CONNECT system/passwd@SH
CREATE USER proxy_bjoracle IDENTIFIED BY proxy_bjoracle;

BEGIN
  DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP(
    username => 'proxy_bjoracle',
    privilege_type => 'PROXY_SNAPADMIN',
    list_of_gnames => NULL
  );
END;
/
GRANT SELECT_CATALOG_ROLE TO proxy_bjoracle;

5. 構建主體組與註冊復制對象

CONNECT repadmin/repadmin@SH

-- 創建主體組
BEGIN
  DBMS_REPCAT.CREATE_MASTER_REPGROUP(gname => 'sh_rep');
END;
/

-- 添加表(核心業務對象)
BEGIN
  DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
    gname => 'sh_rep',
    type => 'TABLE',
    oname => 'CREDIT_CARD',
    sname => 'SHORACL',
    use_existing_object => TRUE,
    copy_rows => TRUE
  );
END;
/

-- 添加索引(輔助結構)
BEGIN
  DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
    gname => 'sh_rep',
    type => 'INDEX',
    oname => 'INDEX_CREDIT_CARD',
    sname => 'SHORACL',
    use_existing_object => TRUE,
    copy_rows => FALSE
  );
END;
/

關鍵避坑指南

  • 主鍵前提:參與快速刷新的表必須有主鍵,否則只能完全刷新。
  • MLOG 維護:若啟用快速刷新,源表需創建實體化視圖日誌,並定期清理防止膨脹。
  • 衝突解決:雖本案例為單向彙總,但若未來擴展為雙向,需預置衝突解決機制。
  • 監控告警:監控 DBA_REPCATLOG、DEFSCHEDULE 視圖,及時發現推送失敗。

擴展:杭州、武漢站點配置

重複上述流程,僅修改連接別名、主體組名、模式名。目標端北京庫需為每個源站點分別創建對應的視圖組,並配置刷新作業:

-- 北京端創建視圖組並添加實體化視圖
BEGIN
  DBMS_REPCAT.CREATE_MVIEW_REPGROUP(
    gname => 'sh_rep',
    master => 'SH',
    propagation_mode => 'ASYNCHRONOUS'
  );
END;
/

-- 設置每日完全刷新作業
BEGIN
  DBMS_REFRESH.MAKE(
    name => 'SH_DAILY_REFRESH',
    list => 'SHORACL.CREDIT_CARD',
    next_date => SYSDATE,
    interval => 'SYSDATE + 1',
    implicit_destroy => FALSE,
    rollback_seg => '',
    push_deferred_rpc => TRUE,
    refresh_after_errors => FALSE
  );
END;
/

總結: Oracle 高級復制雖配置繁瑣,但通過標準化流程可構建穩健的異步數據分發體系。本案例展示了從環境準備、核心對象創建到調度部署的完整鏈路,為異構多站點數據同步提供了可落地的參考架構。

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