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

Oracle 資料庫集中式複寫實戰:多站點資料匯總至總部架構設計

     編輯:Oracle 資料庫基礎

前言

分散式應用需求日益增長,Oracle 資料複寫技術透過在不同物理站點複製資料,建立分散式資料環境。與分散式資料庫不同,複寫讓所有站點擁有相同資料物件的可用副本。典型場景:各分公司資料每日備份至總部,兼具異地備份與綜合統計分析功能。本文以某公司總部(北京)與三分公司(上海、杭州、武漢)為例,完整記錄實作流程。

前置準備與環境資訊蒐集

  • 需複寫的資料庫站點數量
  • 各站點 Oracle 版本號(本案皆為 9i)
  • 各資料庫大小與字符集(建議統一字符集)
  • 各站點所用 Schema 名稱

中央資料庫版本需高於所有主站點,為每個主站點建立獨立表空間(大小大於複寫資料量),並建立對應 Schema:SHORACL(上海)、HZORACL(杭州)、WHORACL(武漢)。

核心概念釐清

本案採用每日一次非同步複寫。

實作步驟:上海站點為例

一、主站點設定

  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;/
    
  6. 設定主鍵替代鍵(若無 PK)
    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. 建立實體化視圖日誌(支援快速刷新)
    CREATE MATERIALIZED VIEW LOG ON SHORACL.CREDIT_CARD;
    -- 無 PK 表使用 ROWID
    CREATE MATERIALIZED VIEW LOG ON SHORACL.CREDIT_CARD WITH ROWID EXCLUDING NEW VALUES;
    
  9. 啟動複寫
    BEGIN dbms_repcat.resume_master_activity(name=>'sh_rep'); END;/
    

二、實體化視圖站點(北京總部)設定

  1. 建立複寫管理員 mvadmin,授權同主站點
  2. 註冊傳播者
  3. 建立公共資料庫連結(指向主站點全域名稱或連線字串)
    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)))';
    
  4. 排程清除作業
  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 建立實體化視圖權限
  8. 建立目標 Schema 的資料庫連結(連線至主站點對應用戶)
  9. 建立實體化視圖
    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;
    
  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 需調整),否則不會自動執行
  3. 觀察 FAILURES 欄位,失敗 16 次或超過間隔時間會標記為 BROKEN,需手動 DBMS_JOB.RUN(job_no) 重跑並排除錯誤

杭州、武漢站點擴充

重複上述主站點與目標站點步驟,修改服務名稱(HZ、WH)、Schema(HZORACL、WHORACL)、資料庫連結名稱。若每站點獨立刷新群組,總作業數 = 1 清除 + N 推送 + N 刷新。

總結

本文展示 Oracle 高級複寫最基礎的單向唯讀實體化視圖架構。實際應用中尚可探索可更新視圖、多主站點雙向同步等進階功能,但技術選型應依據業務需求與效能考量,避免過度設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
術語定義
主站點提供資料來源的站點(如上海資料庫)
實體化視圖站點複寫目標站點(如北京總部)
多主站點複寫所有站點均為主站點,擁有同等管理權限
實體化視圖複寫單一主站點提供來源,目標站點複製資料
實體化視圖目標站點對應每個複寫表/視圖建立的儲存資料表,僅透過複寫機制維護
快速/完全/強制刷新快速僅同步變更;完全重抓全部;強制為快速失敗時回退完全刷新
主站點群組/實體化視圖群組被複寫物件的邏輯集合
實體化視圖日誌記錄主站點資料變更,支援快速刷新