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

Oracle 物化視圖複寫實戰:從概念到多站點集中備份完整部署指南

     編輯:Oracle 資料庫基礎

業務場景

總部 (北京) 需集中三地分公司 (上海、杭州、武漢) 的交易資料,用於全域報表與備份。分公司獨立運作,網路延遲較大,採**非同步、每日一次**刷新。

核心概念速查

術語角色本案例對應
Master Site (主站點)資料來源端上海、杭州、武漢
Materialized View Site (MV 站點)資料接收端北京總部
Materialized View (物化視圖)儲存快照資料的實體表 (可刷新)北京端每張來源表對應一個 MV
Refresh 類型FAST (增量) / COMPLETE (全量) / FORCE (嘗試 FAST 失敗轉 COMPLETE)每日 FAST,需 MV Log
MV Log (物化視圖日誌)記錄主表 DML 變更 (PK/ROWID),支援 FAST REFRESH主站點每張複寫表建立一個
Master Group / MV Group邏輯分組,統一管理/刷新每分公司一組 (sh_rep, hz_rep, wh_rep)
Replication Administrator (RepAdmin)管理複寫環境的專用帳號各站點建立 repadmin/mvadmin
Propagator推送延遲交易佇列的背景程序主站點排程推送至 MV 站點

部署前提

  • 網路雙向通暢,配置 TNS 別名 (SH, HZ, WH, BJ)。
  • 所有資料庫版本一致 (建議 11gR2+),字元集一致 (AL32UTF8)。
  • 主站點表有主鍵 (或唯一非空索引),否則 FAST REFRESH 需 ROWID (效能較差)。
  • 總部預建表空間 (sh_data, hz_data, wh_data + 對應索引表空間) 容量 > 來源資料量 1.5 倍。
  • 建立對應 Schema (SHORACL, HZORACL, WHORACL) 接收 MV。

一、主站點部署 (以上海 SH 為例)

1. 建立 RepAdmin 並授權


CONNECT system/password@SH
CREATE USER repadmin IDENTIFIED BY repadmin;
BEGIN
  DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA('repadmin');
END;
/
GRANT COMMENT ANY TABLE TO repadmin;
GRANT LOCK ANY TABLE TO repadmin;
GRANT SELECT ANY DICTIONARY TO repadmin;  -- 使用視圖管理器需此權限

2. 註冊 Propagator


BEGIN
  DBMS_DEFER_SYS.REGISTER_PROPAGATOR('repadmin');
END;
/

3. 排程清除延遲佇列 (每日一次)


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

4. 建立 MV 站點代理用戶 (北京連線用)


CONNECT system/password@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. 建立 Master Group 並加入複寫物件


CONNECT repadmin/repadmin@SH
BEGIN
  DBMS_REPCAT.CREATE_MASTER_REPGROUP('sh_rep');
END;
/

-- 加入表 (假設 SHORACL.CREDIT_CARD 有 PK)
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               => 'IDX_CREDIT_CARD',
    sname               => 'SHORACL',
    use_existing_object => TRUE,
    copy_rows           => FALSE);
END;
/

6. 無主鍵表指定代理鍵 (可選)


BEGIN
  DBMS_REPCAT.SET_COLUMNS(
    sname      => 'SHORACL',
    oname      => 'CREDIT_CARD',
    column_list => 'CREDIT_CARD_ID');  -- 唯一非空欄位組合
END;
/

7. 產生複寫支援 (觸發器、包、內部程序)


BEGIN
  DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(
    sname            => 'SHORACL',
    oname            => 'CREDIT_CARD',
    type             => 'TABLE',
    min_communication => TRUE);  -- 最小通訊量
END;
/

8. 建立 MV Log (支援 FAST REFRESH)


-- 有主鍵
CREATE MATERIALIZED VIEW LOG ON SHORACL.CREDIT_CARD WITH PRIMARY KEY;

-- 無主鍵用 ROWID
CREATE MATERIALIZED VIEW LOG ON SHORACL.CREDIT_CARD WITH ROWID EXCLUDING NEW VALUES;

9. 啟動複寫


BEGIN
  DBMS_REPCAT.RESUME_MASTER_ACTIVITY('sh_rep');
END;
/

二、MV 站點部署 (北京 BJ)

1. 建立 MV Admin 並授權


CONNECT system/password@BJ
CREATE USER mvadmin IDENTIFIED BY mvadmin;
BEGIN
  DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA('mvadmin');
END;
/
GRANT COMMENT ANY TABLE TO mvadmin;
GRANT LOCK ANY TABLE TO mvadmin;
GRANT SELECT ANY DICTIONARY TO mvadmin;

2. 註冊 Propagator & 排程清除


CONNECT mvadmin/mvadmin@BJ
BEGIN
  DBMS_DEFER_SYS.REGISTER_PROPAGATOR('mvadmin');
  DBMS_DEFER_SYS.SCHEDULE_PURGE(
    next_date => SYSDATE,
    interval  => 'SYSDATE + 1');
END;
/

3. 建立 Public Database Link (指向主站點)


CREATE PUBLIC DATABASE LINK ORACL_SH
  CONNECT TO proxy_bj IDENTIFIED BY proxy_bj
  USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=sh.db.server)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))';
-- 同理建立 ORACL_HZ, ORACL_WH

4. 排程推送延遲交易至主站點


BEGIN
  DBMS_DEFER_SYS.SCHEDULE_PUSH(
    destination   => 'ORACL_SH',   -- 使用 Public DB Link 名
    interval      => 'SYSDATE + 1',
    next_date     => SYSDATE,
    stop_on_error => FALSE,
    delay_seconds => 0,
    parallelism   => 0);
END;
/

5. 授予目標 Schema 建立 MV 權限


CONNECT system/password@BJ
GRANT ALTER SESSION TO shoracl;
GRANT CREATE CLUSTER TO shoracl;
GRANT CREATE DATABASE LINK TO shoracl;
GRANT CREATE SEQUENCE TO shoracl;
GRANT CREATE SESSION TO shoracl;
GRANT CREATE SYNONYM TO shoracl;
GRANT CREATE TABLE TO shoracl;
GRANT CREATE VIEW TO shoracl;
GRANT CREATE PROCEDURE TO shoracl;
GRANT CREATE TRIGGER TO shoracl;
GRANT UNLIMITED TABLESPACE TO shoracl;
GRANT CREATE TYPE TO shoracl;
GRANT CREATE ANY SNAPSHOT TO shoracl;   -- 關鍵權限
GRANT ALTER ANY SNAPSHOT TO shoracl;

6. 目標 Schema 建立 Private DB Link (同名對應 Public Link)


CONNECT shoracl/shoracl@BJ
CREATE DATABASE LINK ORACL_SH
  CONNECT TO shoracl IDENTIFIED BY shoracl
  USING 'ORACL_SH';  -- 解析到 Public Link

7. 建立物化視圖 (FAST REFRESH + PRIMARY KEY)


CONNECT mvadmin/mvadmin@BJ
CREATE MATERIALIZED VIEW SHORACL.CREDIT_CARD
  REFRESH FAST WITH PRIMARY KEY
  AS SELECT * FROM SHORACL.CREDIT_CARD@ORACL_SH;

無主鍵表:REFRESH FAST WITH ROWID AS SELECT * FROM ...@ORACL_SH;

8. 建立刷新群組 (每日一次統一刷新)


BEGIN
  DBMS_REFRESH.MAKE(
    name                  => 'mvadmin.sh_refresh',
    list                  => '',           -- 稍後 ADD
    next_date             => SYSDATE,
    interval              => 'SYSDATE + 1',
    implicit_destroy      => FALSE,
    rollback_seg          => '',
    push_deferred_rpc     => TRUE,         -- 刷新前先推送延遲交易
    refresh_after_errors  => FALSE);
END;
/

-- 將 MV 加入群組
BEGIN
  DBMS_REFRESH.ADD(
    name => 'mvadmin.sh_refresh',
    list => 'SHORACL.CREDIT_CARD', ...);  -- 列出該組所有 MV
END;
/

三、杭州、武漢同樣步驟 (只改 TNS/Schema/Group 名)

重複上述主站點 (HZ/WH) 與 MV 站點 (BJ 增加 HZORACL/WHORACL Schema、DB Link、MV、Refresh Group) 部署。

四、監控與維護

任務檢查指令/視圖異常處理
刷新狀態SELECT * FROM dba_mviews WHERE owner IN ('SHORACL','HZORACL','WHORACL'); 檢查 LAST_REFRESH, REFRESH_METHOD, STALENESSSTALENESS='UNUSABLE' → COMPLETE REFRESH; 錯誤 → 檢查 dba_mview_refresh_times
延遲佇列堆積SELECT * FROM dba_def_error;, SELECT * FROM dba_def_tran;錯誤交易 → 分析原因、手動執行/刪除
MV Log 增長SELECT m.log_table, COUNT(*) FROM user_mview_logs m JOIN user_tables t ON m.log_table=t.table_name GROUP BY m.log_table;過大 → 確認刷新正常、考慮 PURGE LOG
刷新群組執行SELECT * FROM dba_refresh_children WHERE rname='SH_REFRESH';未執行 → 檢查 JOB 隊列、DBMS_JOB/DBMS_SCHEDULER 狀態

五、常見問題與對策

  • ORA-12004: REFRESH FAST 不可用:MV Log 缺失、主鍵變更、截斷表 → 重建 MV Log、COMPLETE REFRESH。
  • 網路中斷導致刷新失敗:FORCE REFRESH 自動轉 COMPLETE;若資料量大,考慮分批刷新或增加頻率。
  • 主站點結構變更 (DDL):需執行 DBMS_REPCAT.ALTER_MASTER_REPOBJECT 同步結構,或重建 MV。
  • 雙向複寫衝突:本案例單向 (主→MV) 無衝突;若雙向需定義衝突解決方法 (Site Priority, Timestamp, Custom)。

總結

Oracle 物化視圖複寫 (Advanced Replication) 提供**異步、增量、可監控**的多站點資料集中能力。關鍵成功因素:

  1. 主表有主鍵 + 建立 MV Log → FAST REFRESH 高效。
  2. 專用 RepAdmin/Propagator/Proxy 帳號分離職責,安全可控。
  3. Public/Private DB Link 命名一致,刷新群組統一排程。
  4. 日常監控 DBA_MVIEWS, DBA_DEF_ERROR, MV LOG 大小,異常即時處理。

現代替代方案:GoldenGate (即時 CDC、異構、雲同步)、Data Guard Far Sync (零資料損失遠端備份)、DBMS_STREAMS (已棄用)、**自訂 ETL/ELT** (Data Pump + 外部表 + 排程)。視即時性、異構需求、授權成本選型。

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