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

Oracle 分散式資料同步方案選型指南:從 ETL 到高級復寫

     編輯:Oracle 資料庫基礎

方案分類總覽

類別方案特點適用場景
非即時
批次同步
ETL 工具 / 自製介面檔案傳輸 (FTP)、介面表清洗、SQL*Loader 大量載入資料倉庫、日報表、跨系統整合
HTTP + XMLWeb Service 介面、XML 解析、CDATA 區段處理異構系統、即時性要求低的 API 整合
即時
小批量
中介軟體 (Tuxedo 等)交易保證、高可靠、商業授權成本高電信、金融核心交易系統
Socket 自製Unix 環境穩定、XML 封裝、自描述能力強內部系統、團隊有網路程式能力
Oracle 內建DB Link + Stored Procedure + Job / 高級復寫無額外軟體、彈性強、DBA 可控Oracle 同質環境、雙向同步需求

Oracle 內建即時同步深度解析

方案 A:DB Link + 儲存程序 + Job

-- 1. 建立 DB Link
CREATE DATABASE LINK remote_db
CONNECT TO sync_user IDENTIFIED BY pwd
USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.2)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))';

-- 2. 同步儲存程序
CREATE OR REPLACE PROCEDURE sync_orders IS
BEGIN
    MERGE INTO local_orders t
    USING (SELECT * FROM orders@remote_db WHERE sync_flag = 'N') s
    ON (t.order_id = s.order_id)
    WHEN MATCHED THEN UPDATE SET t.qty = s.qty, t.amt = s.amt
    WHEN NOT MATCHED THEN INSERT VALUES (s.order_id, s.qty, s.amt);
    
    UPDATE orders@remote_db SET sync_flag = 'Y' WHERE sync_flag = 'N';
    COMMIT;
EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE;
END;

-- 3. 排程執行
BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        job_name => 'JOB_SYNC_ORDERS',
        job_type => 'STORED_PROCEDURE',
        job_action => 'SYNC_ORDERS',
        start_date => SYSTIMESTAMP,
        repeat_interval => 'FREQ=MINUTELY; INTERVAL=5',
        enabled => TRUE);
END;

方案 B:高級復寫 - 企業級雙向同步

核心概念

  • Replication Object:表、索引、檢視、程序等
  • Replication Group:物件邏輯分組,一物件屬一群組
  • Master Sites:多主節點,皆可讀寫
  • Propagation Mode:
    • 非同步:延遲 RPC 隊列,Store-and-Forward
    • 同步:兩階段提交,強一致性,高網路依賴
    • 程序式:Wrapper 封裝,減少網路傳輸

建立步驟 (主定義站點執行)

-- 1. 環境準備:repadmin 用戶、權限、GLOBAL_NAMES=TRUE
-- 2. 建立雙向 DB Link (名稱必須 = GLOBAL_NAME)
-- 3. 建立復寫群組
BEGIN
    DBMS_REPCAT.CREATE_MASTER_REPGROUP(
        gname => 'ORDER_RG',
        qualifier => '',
        group_comment => '訂單雙向同步');
END;

-- 4. 加入復寫物件 (以 TABLE 為例)
BEGIN
    DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
        gname => 'ORDER_RG',
        type => 'TABLE',
        oname => 'ORDERS',
        sname => 'SCOTT',
        copy_rows => FALSE,
        use_existing_object => TRUE);
END;

-- 5. 產生復寫支援 (觸發器、封裝)
BEGIN
    DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(
        sname => 'SCOTT', oname => 'ORDERS', type => 'TABLE');
END;

-- 6. 加入其他 Master 站點
BEGIN
    DBMS_REPCAT.ADD_MASTER_DATABASE(
        gname => 'ORDER_RG',
        master => 'REMOTE_DB',
        use_existing_objects => TRUE,
        copy_rows => FALSE,
        propagation_mode => 'ASYNCHRONOUS');
END;

-- 7. 啟動復寫活動
BEGIN
    DBMS_REPCAT.RESUME_MASTER_ACTIVITY(gname => 'ORDER_RG');
END;

常見錯誤與對策

錯誤代碼原因解決
ORA-23357: propagator does not existrepadmin 權限不足 / DB Link 非 repadmin / GLOBAL_NAME 保留字授予完整權限、確認 DB Link 連線用戶、修改 GLOBAL_NAME 避開保留字
ORA-23312: not the masterdef非主定義站點執行群組管理操作連線至主定義站點執行,或 RELOCATE_MASTERDEF
DB Link 無法使用GLOBAL_NAMES=TRUE 時 DB Link 名稱 ≠ GLOBAL_NAMEALTER DATABASE RENAME GLOBAL_NAME TO 'NEW_NAME'; 重建同名 DB Link

選型建議

  1. 單向、批次、大量 → SQL*Loader / Data Pump / ETL
  2. 單向、即時、少量 → DB Link + Procedure + Job
  3. 雙向、即時、多節點、結構複雜 → 高級復寫
  4. 異構/跨平台 → GoldenGate / XStreams / Kafka CDC
  5. 雲原生/微服務 → 事件驅動架構 (Outbox Pattern + CDC)

高級復寫雖強大,但維護複雜度高,12c 後建議改用 GoldenGate 或 Active Data Guard 實現即時雙向同步。

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