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

Oracle 高級複寫 (Advanced Replication) 完整部署指南:多站點彙總至總部

     編輯:Oracle 資料庫基礎

前言

分散式應用需求推動資料複寫技術演進。Oracle 高級複寫透過在不同物理站點複製資料物件,建立分散式資料環境。與分散式資料庫不同,複寫讓所有站點擁有相同資料物件的可用副本。典型場景:分支機構資料每日彙總至總部,兼具備份與統計分析功能。本文以 A 公司總部 (北京) 與三分支 (上海、杭州、武漢) 為例,詳細說明單向唯讀物化視圖複寫的建立流程。

準備工作:環境資訊蒐集

  1. 需複寫的資料庫站點數量。
  2. 各站點 Oracle 版本號 (建議一致,本例均為 9i)。
  3. 各資料庫大小,規劃表空間容量。
  4. 字符集 (建議統一)。
  5. 各站點需複寫的 Schema 名稱 (本例分支均為 ORACL,總部建立對應 SHORACL, HZORACL, WHORACL)。

總部建立集中資料庫,版本不低於分支,為每分支建立獨立表空間與 Schema。

核心概念釐清

  • 主站點:提供資料源 (分支)。
  • 物化視圖站點:接收複寫資料的目標站點 (總部)。
  • 多主站點複寫:所有站點均為主站點,雙向同步。
  • 物化視圖複寫:單向,主站點 -> 物化視圖站點。本文採用此模式。
  • 物化視圖:目標站點對應來源表的實體表,僅透過複寫機制維護資料。
  • 快速/完全/強制刷新:快速僅傳遞變更 (需物化視圖日誌);完全重抓全部;強制為快速失敗時回退完全。
  • 主站點群組 / 物化視圖群組:被複寫物件的邏輯容器。
  • 物化視圖日誌:記錄主站點表變更,支援快速刷新。

本例採異步複寫,每日刷新一次。

部署實戰:上海站點 -> 總部

一、配置主站點 (上海 SH)

  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; /
  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(user_name => '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; /
    -- 若無主鍵,指定替代鍵
    BEGIN DBMS_REPCAT.SET_COLUMNS(sname => 'SHORACL', oname => 'CREDIT_CARD', column_list => 'CREDIT_CARD_ID'); END; /
    -- 產生複寫支援 (觸發器、套件)
    BEGIN DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(sname => 'SHORACL', oname => 'CREDIT_CARD', type => 'TABLE', min_communication => TRUE); END; /
  6. 建立物化視圖日誌 (支援快速刷新):
    CREATE MATERIALIZED VIEW LOG ON SHORACL.CREDIT_CARD;
    -- 無主鍵表用:
    CREATE MATERIALIZED VIEW LOG ON SHORACL.CREDIT_CARD WITH ROWID EXCLUDING NEW VALUES;
  7. 啟動複寫:
    BEGIN DBMS_REPCAT.RESUME_MASTER_ACTIVITY(name => 'sh_rep'); END; /

二、配置物化視圖站點 (總部 BJ)

  1. 建立複寫管理員 mvadmin (同主站點步驟 1)。
  2. 註冊傳播者 (同步驟 2)。
  3. 建立公共資料庫連結 (指向主站點全域名稱或連線字串):
    CREATE PUBLIC DATABASE LINK ORACLSH USING 'Oracle.shanghai.com';
    -- 或使用 TNS 描述
    CREATE PUBLIC DATABASE LINK ORACLSH USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=oracl)))';
  4. 排程清除作業 (同主站點步驟 3)。
  5. 建立 mvadmin 的私有資料庫連結 (連接主站點代理用戶):
    CREATE DATABASE LINK ORACLSH CONNECT TO proxy_bjoracle IDENTIFIED BY proxy_bjoracle;
  6. 排程推送作業 (定期將本地延遲交易推送至主站點):
    BEGIN DBMS_DEFER_SYS.SCHEDULE_PUSH(destination => 'ORACLSH', interval => 'SYSDATE + 1', next_date => SYSDATE, stop_on_error => FALSE, delay_seconds => 0, parallelism => 0); END; /
  7. 授權目標 Schema (SHORACL) 建立物化視圖所需權限 (CREATE SESSION, TABLE, VIEW, SNAPSHOT 等)。
  8. 建立目標 Schema 的私有資料庫連結 (連接主站點對應 Schema):
    CONNECT SHORACL/SHORACL@BJ
    CREATE DATABASE LINK ORACLSH CONNECT TO ORACL IDENTIFIED BY ORACL;
  9. 建立物化視圖 (快速刷新、主鍵模式):
    CONNECT mvadmin/mvadmin@BJ
    CREATE MATERIALIZED VIEW SHORACL.CREDIT_CARD REFRESH FAST WITH PRIMARY KEY AS SELECT * FROM ORACL.CREDIT_CARD@ORACLSH;
    -- 無主鍵用 ROWID
    CREATE MATERIALIZED VIEW SHORACL.CREDIT_CARD REFRESH FAST WITH ROWID AS SELECT * FROM ORACL.CREDIT_CARD@ORACLSH;
  10. 建立刷新群組並加入物化視圖 (每日刷新):
    BEGIN DBMS_REFRESH.MAKE(name => 'mvadmin.sh_refresh', list => '', next_date => SYSDATE, interval => 'SYSDATE + 1', implicit_destroy => FALSE, rollback_seg => '', push_deferred_rpc => TRUE, refresh_after_errors => FALSE); END; /
    BEGIN DBMS_REFRESH.ADD(name => 'mvadmin.sh_refresh', list => 'SHORACL.CREDIT_CARD', lax => TRUE); END; /

三、驗證與維護

  1. 查詢 SYS.DBA_JOBS 確認生成清除、推送、刷新三類作業。
  2. 確保 JOB_QUEUE_PROCESSES 參數 > 0 (預設為 0,需修改 init.ora 並重啟)。
  3. 監控 DBA_JOBS.FAILURES,失敗 16 次或間隔超過排程間隔會標記為 BROKEN,需手動 DBMS_JOB.RUN(job_no) 重跑並排查錯誤。

杭州、武漢站點部署

重複上述流程,修改站點名稱 (HZ/WH)、Schema (HZORACL/WHORACL)、資料庫連結名稱 (ORACLHZ/ORACLWH)、群組名稱 (hz_rep/wh_rep)、代理用戶 (proxy_bjoracle_hz 等) 即可。總部最終將擁有 7 個排程作業 (1 清除 + 3 推送 + 3 刷新)。

總結

本文示範最基礎的唯讀物化視圖異步複寫。Oracle 高級複寫還支援可更新物化視圖、多主站點同步/異步複寫、程序式複寫等進階功能。實務上應依系統即時性、效能需求選擇適當架構。

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