Oracle Advanced Replication(高級複寫)同步複寫模式適用於多站點即時資料一致性需求極高的場景(如金融、電信計費)。本文記錄雙資料庫(A 為主定義站點,B 為主體站點)同步複寫的完整配置步驟,含前置條件、用戶建立、全域名稱修改、DB Link 建立、複寫組/物件創建、節點加入與啟動驗證全流程。
| 項目 | 站點 A(主定義站點) | 站點 B(主體站點) |
|---|---|---|
| 版本 | Oracle 10.2.0.1 | Oracle 10.1.0.3 |
| SID | eread | test |
| 全域名稱 | eread.im.com.cn | test.im.com.cn |
| 複寫管理員 | repadmin | |
| 應用用戶 | cqm | |
| 複寫物件 | CQM.TEST 表(含主鍵) | |
SELECT * FROM v$option WHERE parameter = 'Advanced replication'; -- VALUE 應為 TRUE
ALTER SYSTEM SET global_names = TRUE SCOPE = BOTH;
-- job_queue_processes > 0 (建議 ≥ 雙核數)
-- processes, sessions 足夠大
CREATE USER CQM IDENTIFIED BY CQM
DEFAULT TABLESPACE CQM
TEMPORARY TABLESPACE TEMP;
GRANT DBA TO CQM; -- 測試環境簡化,生產環境請依最小權限原則授予
CREATE USER REPADMIN IDENTIFIED BY REPADMIN
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
GRANT CONNECT, RESOURCE TO REPADMIN;
-- 授予管理任意 Schema 複寫組權限
EXEC DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA('REPADMIN');
-- 授予建立 Snapshot Log 權限
GRANT COMMENT ANY TABLE TO REPADMIN;
GRANT LOCK ANY TABLE TO REPADMIN;
-- 指定為 Propagator 並授予執行任意程序權限
EXEC DBMS_DEFER_SYS.REGISTER_PROPAGATOR('REPADMIN');
GRANT EXECUTE ANY PROCEDURE TO REPADMIN;
-- 站點 A
ALTER DATABASE RENAME GLOBAL_NAME TO eread.im.com.cn;
-- 站點 B
ALTER DATABASE RENAME GLOBAL_NAME TO test.im.com.cn;
-- 站點 A 建立指向 B 的 Link
CREATE PUBLIC DATABASE LINK test.im.com.cn
CONNECT TO REPADMIN IDENTIFIED BY REPADMIN USING 'test';
-- 站點 B 建立指向 A 的 Link
CREATE PUBLIC DATABASE LINK eread.im.com.cn
CONNECT TO REPADMIN IDENTIFIED BY REPADMIN USING 'eread';
驗證: `SELECT * FROM dual@test.im.com.cn;` 兩邊均成功。
CONN CQM/CQM@eread -- 或 @test
CREATE TABLE TEST (
ID NUMBER(10),
TIMESTAMP DATE DEFAULT SYSDATE
);
ALTER TABLE TEST ADD CONSTRAINT TEST_PK PRIMARY KEY (ID);
關鍵: 複寫表必須有主鍵,否則無法產生複寫支援。
以 REPADMIN 登入站點 A:
-- 1. 建立主複寫組
EXEC DBMS_REPCAT.CREATE_MASTER_REPGROUP('repg');
-- 2. 將物件加入複寫組
EXEC DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
sname => 'CQM',
oname => 'TEST',
type => 'TABLE',
use_existing_object => TRUE,
gname => 'repg',
copy_rows => FALSE
);
-- 3. 產生複寫支援(建立觸發器、內部封裝等)
EXEC DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT('CQM', 'TEST', 'TABLE');
EXEC DBMS_REPCAT.ADD_MASTER_DATABASE(
gname => 'repg',
master => 'test.im.com.cn',
use_existing_objects => TRUE,
copy_rows => FALSE,
propagation_mode => 'SYNCHRONOUS' -- 關鍵:同步模式
);
此步驟會將複寫定義推送到站點 B,耗時視物件數量而定。
EXEC DBMS_REPCAT.RESUME_MASTER_ACTIVITY('repg', TRUE);
-- 站點 A 插入
INSERT INTO CQM.TEST (ID) VALUES (999);
COMMIT;
-- 站點 B 立即可查
SELECT * FROM CQM.TEST WHERE ID = 999;
CREATE OR REPLACE PROCEDURE insert_into_test AS
i NUMBER; m NUMBER; n NUMBER := 0;
BEGIN
FOR i IN 1..10000 LOOP
m := i;
INSERT INTO CQM.TEST (ID) VALUES (m);
n := n + 1;
IF n = 1000 THEN COMMIT; n := 0; END IF;
END LOOP;
COMMIT;
END;
/
EXEC insert_into_test;
觀察兩站點資料一致性與同步延遲(同步模式下應極低)。
本文完整呈現 Oracle Advanced Replication 同步複寫雙主架構的標準化配置流程。同步模式提供強一致性但犧牲效能與可用性,選型時務必評估網路延遲、業務容錯需求。現代架構多改用 Oracle GoldenGate 或 Active Data Guard 實現異構/異地高可用與資料整合,Advanced Replication 逐漸走向維護模式,新專案謹慎採用。