| 屬性 | 主定義站點 A | 主站點 B |
| 版本 | Oracle 10.2.0.1 | Oracle 10.1.0.3 |
| SID | eread | test |
| 全域名稱 | eread.im.com.cn | test.im.com.cn |
| 複寫管理員 | repadmin | repadmin |
| 應用用戶 | cqm | cqm |
| 複寫物件 | REPTEST 表 |
八步驟配置流程
步驟 1:建立應用用戶 CQM(兩節點同步執行)
CREATE USER CQM IDENTIFIED BY CQM
DEFAULT TABLESPACE CQM TEMPORARY TABLESPACE TEMP;
GRANT DBA TO CQM; -- 測試環境簡化,生產建議最小權限
步驟 2:建立複寫管理員 REPADMIN(兩節點同步執行)
CREATE USER REPADMIN IDENTIFIED BY REPADMIN;
ALTER USER REPADMIN DEFAULT TABLESPACE USERS;
ALTER USER REPADMIN TEMPORARY TABLESPACE TEMP;
GRANT CONNECT, RESOURCE TO REPADMIN;
-- 授予管理任何複寫群組權限
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;
步驟 3:修改全域資料庫名稱(兩節點各自執行)
-- 節點 A
ALTER DATABASE RENAME GLOBAL_NAME TO EREAD.IM.COM.CN;
-- 節點 B
ALTER DATABASE RENAME GLOBAL_NAME TO TEST.IM.COM.CN;
關鍵:全域名稱必須與 Database Link 連接字串一致,且全網唯一。
步驟 4:建立雙向 Database Link(兩節點各自執行)
-- 節點 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';
- 使用
PUBLIC 供所有用戶使用
- 連接用戶為複寫管理員 REPADMIN
USING 參照 tnsnames.ora 別名
步驟 5:建立複寫物件表(應用用戶 CQM,兩節點同步執行)
CREATE TABLE REPTEST (
ID NUMBER(10) PRIMARY KEY,
TIMESTAMP DATE DEFAULT SYSDATE
);
-- 必須有主鍵,否則無法產生複寫支援
步驟 6:在主定義站點建立複寫群組與物件
以 REPADMIN 登入節點 A (eread):
-- 建立主複寫群組
EXEC DBMS_REPCAT.CREATE_MASTER_REPGROUP('REPG');
-- 加入複寫物件
EXEC DBMS_REPCAT.CREATE_MASTER_REPOBJECT(
SNAME => 'CQM',
ONAME => 'REPTEST',
TYPE => 'TABLE',
USE_EXISTING_OBJECT => TRUE,
GNAME => 'REPG',
COPY_ROWS => FALSE
);
-- 產生複寫支援(建立內部觸發器、封裝、佇列)
EXEC DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT('CQM', 'REPTEST', 'TABLE');
步驟 7:新增主站點並指定同步模式
EXEC DBMS_REPCAT.ADD_MASTER_DATABASE(
GNAME => 'REPG',
MASTER => 'TEST.IM.COM.CN',
USE_EXISTING_OBJECTS => TRUE,
COPY_ROWS => FALSE,
PROPAGATION_MODE => 'SYNCHRONOUS'
);
PROPAGATION_MODE => 'SYNCHRONOUS':同步複寫核心參數,異動同步推播、雙階段提交
USE_EXISTING_OBJECTS => TRUE:目標站點已有同結構表,直接啟用
步驟 8:啟動複寫活動
EXEC DBMS_REPCAT.RESUME_MASTER_ACTIVITY('REPG', TRUE);
至此配置完成,複寫群組進入正常運作狀態。
驗證測試
小資料量測試
-- 節點 A 插入
INSERT INTO CQM.REPTEST (ID) VALUES (1);
COMMIT;
-- 節點 B 立即可見
SELECT * FROM CQM.REPTEST; -- 應返回 ID=1
大資料量壓測程序
CREATE OR REPLACE PROCEDURE INSERT_INTO_REPTEST AS
I NUMBER;
M NUMBER;
N NUMBER := 0;
BEGIN
FOR I IN 1..10000 LOOP
M := I;
INSERT INTO CQM.REPTEST (ID) VALUES (M);
N := N + 1;
IF N = 1000 THEN
COMMIT;
N := 0;
END IF;
END LOOP;
COMMIT;
END;
/
EXEC INSERT_INTO_REPTEST;
- 每 1000 筆提交一次,觀察同步延遲、衝突處理、效能
- 同步複寫下,遠端節點必須同步完成才返回 COMMIT,網路延遲直接影響交易回應時間
同步複寫關鍵特性與限制
| 特性 | 說明 |
| 一致性 | 強一致性(ACID 跨節點),雙階段提交 |
| 延遲 | 等同於網路往返時間 (RTT),高延遲環境不適合 |
| 可用性 | 任一節點故障導致寫入失敗(除非配置 Quorum/多數派) |
| 衝突解決 | 同步模式下衝突極少(主鍵衝突即時報錯),無需複雜衝突解決程序 |
| 頻寬需求 | 高,每筆異動即時推播 |
| 支援 DDL | 不支援 DDL 自動複寫,結構變更需暫停複寫手動同步 |
監控與維護常用指令
-- 檢視複寫群組狀態
SELECT GNAME, STATUS FROM DBA_REPGROUP;
-- 檢視複寫物件
SELECT SNAME, ONAME, TYPE, STATUS FROM DBA_REPOBJECT WHERE GNAME = 'REPG';
-- 檢視延遲佇列
SELECT * FROM DBA_DEFER_TRAN WHERE DEST = 'TEST.IM.COM.CN';
-- 暫停/恢複寫
EXEC DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY('REPG');
EXEC DBMS_REPCAT.RESUME_MASTER_ACTIVITY('REPG', TRUE);
-- 衝突統計
SELECT * FROM DBA_REPRESOLUTION_STATISTICS WHERE GNAME = 'REPG';
總結
- 同步複寫提供強一致性,適合金融、庫存等核心業務
- 八步驟核心:建用戶、設全域名、建 DB Link、建表(含PK)、建群組、加物件、產生支援、加站點(同步模式)、啟動
- 網路延遲是最大敵人:跨機房 RTT > 5ms 將嚴重影響交易效能,建議同城雙活或專線互聯
- 生產環境務必規劃衝突監控、效能基線、故障切換預案
- Oracle 12c+ 建議考慮 Active Data Guard 或 GoldenGate 替代,Advanced Replication 已進入維護模式
- 上一篇文章: Oracle 資料庫備份基礎知識體系:結構、日誌、備份模式與角色管理
- 下一篇文章: RedHat 7.1 安裝 Oracle 8.1.7.0.1 完整步驟與補丁修正指南
Copyright ©
程式碼之家 All Rights Reserved