某企業總部設於北京,下轄上海、杭州、武漢三大營業部。各分部業務系統獨立運行,數據庫結構完全一致。業務需求:每日將三地分部的全量業務數據異步彙總至總部數據庫,滿足備份容災與全域統計分析雙重目標。這正是 Oracle 高級復制 實體化視圖 異步刷新模式的典型應用場景。
| 術語 | 定義 | 本案例映射 |
|---|---|---|
| 主站點 | 提供數據源的站點 | 上海、杭州、武漢數據庫 |
| 實體化視圖站點 | 接收數據的目標站點 | 北京總部數據庫 |
| 實體化視圖 | 目標端對應源表的實體表,僅通過復制機制維護 | 北京庫中 SHORACL、HZORACL、WHORACL 模式下的表 |
| 快速刷新 | 僅同步增量變更,需靠 MLOG 支持 | 本案例採用每日一次完全刷新策略 |
| 主體組 / 視圖組 | 源端/目標端復制對象的邏輯集合 | sh_rep 等 |
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;
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR(username => 'repadmin');
END;
/
-- 注意:原文拼寫 register_purpagator 應為 REGISTER_PROPAGATOR
CONNECT repadmin/repadmin@SH
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE(
next_date => SYSDATE,
interval => 'SYSDATE + 1', -- 每日執行
delay_seconds => 0
);
END;
/
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;
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.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 高級復制雖配置繁瑣,但通過標準化流程可構建穩健的異步數據分發體系。本案例展示了從環境準備、核心對象創建到調度部署的完整鏈路,為異構多站點數據同步提供了可落地的參考架構。