| 類別 | 方案 | 特點 | 適用場景 |
|---|---|---|---|
| 非即時 批次同步 | ETL 工具 / 自製介面 | 檔案傳輸 (FTP)、介面表清洗、SQL*Loader 大量載入 | 資料倉庫、日報表、跨系統整合 |
| HTTP + XML | Web Service 介面、XML 解析、CDATA 區段處理 | 異構系統、即時性要求低的 API 整合 | |
| 即時 小批量 | 中介軟體 (Tuxedo 等) | 交易保證、高可靠、商業授權成本高 | 電信、金融核心交易系統 |
| Socket 自製 | Unix 環境穩定、XML 封裝、自描述能力強 | 內部系統、團隊有網路程式能力 | |
| Oracle 內建 | DB Link + Stored Procedure + Job / 高級復寫 | 無額外軟體、彈性強、DBA 可控 | Oracle 同質環境、雙向同步需求 |
-- 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;
-- 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 exist | repadmin 權限不足 / DB Link 非 repadmin / GLOBAL_NAME 保留字 | 授予完整權限、確認 DB Link 連線用戶、修改 GLOBAL_NAME 避開保留字 |
| ORA-23312: not the masterdef | 非主定義站點執行群組管理操作 | 連線至主定義站點執行,或 RELOCATE_MASTERDEF |
| DB Link 無法使用 | GLOBAL_NAMES=TRUE 時 DB Link 名稱 ≠ GLOBAL_NAME | ALTER DATABASE RENAME GLOBAL_NAME TO 'NEW_NAME'; 重建同名 DB Link |
高級復寫雖強大,但維護複雜度高,12c 後建議改用 GoldenGate 或 Active Data Guard 實現即時雙向同步。