總部 (北京) 需整合三地分公司 (上海、杭州、武漢) 同結構資料庫資料,作為備份與綜合統計來源。採用 Oracle 9i Advanced Replication,**異步物化視圖複寫**,每日刷新一次。
-- 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; -- 供 OEM/Grid Control 使用
-- 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_bj IDENTIFIED BY proxy_bj;
BEGIN
DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP(
user_name => 'proxy_bj',
privilege_type => 'PROXY_SNAPADMIN',
list_of_gnames => NULL
);
END;
/
GRANT SELECT_CATALOG_ROLE TO proxy_bj;
-- 5. 建立主群組
CONNECT repadmin/repadmin@SH
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP(gname => 'SH_REP');
END;
/
-- 6. 加入複寫物件 (表、索引)
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
gname => 'SH_REP', type => 'TABLE',
oname => 'CREDIT_CARD', sname => 'SH_ORACL',
use_existing_object => TRUE, copy_rows => TRUE
);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
gname => 'SH_REP', type => 'INDEX',
oname => 'IDX_CREDIT_CARD', sname => 'SH_ORACL',
use_existing_object => TRUE, copy_rows => FALSE
);
END;
/
-- 7. 若無 PK,指定識別欄位
BEGIN
DBMS_REPCAT.SET_COLUMNS(
sname => 'SH_ORACL', oname => 'CREDIT_CARD',
column_list => 'CREDIT_CARD_ID'
);
END;
/
-- 8. 產生複寫支援 (建立 Trigger/Package)
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(
sname => 'SH_ORACL', oname => 'CREDIT_CARD',
type => 'TABLE', min_communication => TRUE
);
END;
/
-- 9. 建立物化視圖日誌 (快速刷新必備)
CREATE MATERIALIZED VIEW LOG ON SH_ORACL.CREDIT_CARD
WITH PRIMARY KEY; -- 無 PK 時用 WITH ROWID
-- 10. 啟動複寫
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY(name => 'SH_REP');
END;
/
-- 1. 建立 MV 管理員
CONNECT system/passwd@BJ
CREATE USER mvadmin IDENTIFIED BY mvadmin;
BEGIN
DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA(username => 'mvadmin');
END;
/
GRANT COMMENT ANY TABLE TO mvadmin;
GRANT LOCK ANY TABLE TO mvadmin;
GRANT SELECT ANY DICTIONARY TO mvadmin;
-- 2. 註冊傳播者
BEGIN
DBMS_DEFER_SYS.REGISTER_PROPAGATOR(username => 'mvadmin');
END;
/
-- 3. 公共資料庫連結 (指向主站點全域名稱)
CREATE PUBLIC DATABASE LINK ORACL_SH
CONNECT TO proxy_bj IDENTIFIED BY proxy_bj
USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=sh-host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))';
-- 4. 清除作業排程
CONNECT mvadmin/mvadmin@BJ
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE(
next_date => SYSDATE,
interval => 'SYSDATE + 1',
delay_seconds => 0
);
END;
/
-- 5. MV 管理員私有資料庫連結
CREATE DATABASE LINK ORACL_SH
CONNECT TO proxy_bj IDENTIFIED BY proxy_bj
USING 'ORACL_SH'; -- 使用公共連結名稱
-- 6. 推送作業排程 (每小時推送延遲佇列)
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PUSH(
destination => 'ORACL_SH',
interval => 'SYSDATE + 1/24',
next_date => SYSDATE,
stop_on_error => FALSE,
parallelism => 1
);
END;
/
-- 7. 授權目標 Schema 建立物化視圖權限
CONNECT system/passwd@BJ
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SNAPSHOT,
CREATE PROCEDURE, CREATE TRIGGER, UNLIMITED TABLESPACE TO sh_oracl;
-- ... 其他必要權限
-- 8. 目標 Schema 建立資料庫連結 (連回主站點原 Schema)
CONNECT sh_oracl/sh_oracl@BJ
CREATE DATABASE LINK ORACL_SH
CONNECT TO oracl IDENTIFIED BY oracl
USING 'ORACL_SH';
-- 9. 建立物化視圖 (快速刷新,主鍵模式)
CONNECT mvadmin/mvadmin@BJ
CREATE MATERIALIZED VIEW SH_ORACL.CREDIT_CARD
REFRESH FAST WITH PRIMARY KEY
AS SELECT * FROM ORACL.CREDIT_CARD@ORACL_SH;
-- 10. 建立刷新群組 (每日一次)
BEGIN
DBMS_REFRESH.MAKE(
name => 'MVADMIN.SH_REFRESH',
list => '',
next_date => SYSDATE,
interval => 'SYSDATE + 1',
implicit_destroy => FALSE,
push_deferred_rpc => TRUE,
refresh_after_errors => FALSE
);
END;
/
-- 11. 加入物化視圖至刷新群組
BEGIN
DBMS_REFRESH.ADD(
name => 'MVADMIN.SH_REFRESH',
list => 'SH_ORACL.CREDIT_CARD',
lax => TRUE
);
END;
/
本文示範 Oracle 9i 多主站點異步物化視圖複寫的標準化部署流程。雖步驟繁瑣,但透過 `DBMS_REPCAT`/`DBMS_DEFER_SYS`/`DBMS_REFRESH` 套件實現了「配置一次、自動運行」的異地資料整合。生產環境務必建立完善的監控告警 (Job 失敗、刷新延遲、MV Log 空間) 並定期演練災難恢復。