- 建立複寫管理員並授權
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;/
- 排程清除作業:定時清理延遲佇列
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(user_name=>'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;/
- 設定主鍵替代鍵(若無 PK)
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;/
- 建立實體化視圖日誌(支援快速刷新)
CREATE MATERIALIZED VIEW LOG ON SHORACL.CREDIT_CARD;
-- 無 PK 表使用 ROWID
CREATE MATERIALIZED VIEW LOG ON SHORACL.CREDIT_CARD WITH ROWID EXCLUDING NEW VALUES;
- 啟動複寫
BEGIN dbms_repcat.resume_master_activity(name=>'sh_rep'); END;/
- 建立複寫管理員 mvadmin,授權同主站點
- 註冊傳播者
- 建立公共資料庫連結(指向主站點全域名稱或連線字串)
CREATE PUBLIC DATABASE LINK ORACLSH USING 'Oracle.shanghai.com';
-- 或使用完整連線描述符
CREATE PUBLIC DATABASE LINK ORACLSH USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=oracl)))';
- 排程清除作業
- 建立 mvadmin 的私有資料庫連結(指定連線用戶)
CREATE DATABASE LINK ORACLSH CONNECT TO proxy_bjoracle IDENTIFIED BY proxy_bjoracle;
- 排程推送作業
BEGIN dbms_defer_sys.schedule_push(destination=>'ORACLSH', interval=>'SYSDATE+1', next_date=>SYSDATE, stop_on_error=>FALSE, delay_seconds=>0, parallelism=>0); END;/
- 授權目標 Schema 建立實體化視圖權限
- 建立目標 Schema 的資料庫連結(連線至主站點對應用戶)
- 建立實體化視圖
CONNECT mvadmin/mvadmin@BJ
CREATE MATERIALIZED VIEW SHORACL.CREDIT_CARD REFRESH FAST WITH PRIMARY KEY AS SELECT * FROM ORACL.CREDIT_CARD@ORACLSH;
-- 無 PK 使用 ROWID
CREATE MATERIALIZED VIEW SHORACL.CREDIT_CARD REFRESH FAST WITH ROWID AS SELECT * FROM ORACL.CREDIT_CARD@ORACLSH;
- 建立刷新群組並加入物件
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;/
重複上述主站點與目標站點步驟,修改服務名稱(HZ、WH)、Schema(HZORACL、WHORACL)、資料庫連結名稱。若每站點獨立刷新群組,總作業數 = 1 清除 + N 推送 + N 刷新。
本文展示 Oracle 高級複寫最基礎的單向唯讀實體化視圖架構。實際應用中尚可探索可更新視圖、多主站點雙向同步等進階功能,但技術選型應依據業務需求與效能考量,避免過度設計。