資料複寫是企業級資料庫高可用與分散式架構的核心技術。Oracle Advanced Replication 提供 多主體複寫,允許多個資料庫節點同時接受讀寫操作,並自動同步資料變更。本文記錄在 Solaris 9 + Oracle 9.2.0.6 環境下的完整部署實戰過程。
| 項目 | 節點 1 (ORCL9I) | 節點 2 (ALPHA9I) |
|---|---|---|
| 作業系統 | SunOS 5.9 (Solaris 9) on Sun Fire V210 | |
| Oracle 版本 | Oracle 9i Enterprise Edition 9.2.0.6.0 64bit | |
| SID | ORCL9I | ALPHA9I |
| GLOBAL_NAME | ORCL9I.TAIKANG.COM | ALPHA9I.TAIKANG.COM |
| 角色 | Master Definition Site | Master Site |
-- 確認 Advanced Replication 選項已安裝
SQL> SELECT * FROM v$option WHERE parameter = 'Advanced replication';
PARAMETER VALUE
---------------------------------- ------
Advanced replication TRUE
注意: 若 VALUE 為 FALSE,需重新安裝 Oracle 並勾選 Advanced Replication 選項。
在兩節點的 tnsnames.ora 分別新增對方別名:
-- 節點 1 上
ALPHA9I.TAIKANG.COM =
(DESCRIPTION =
(ADDRESS = (PROTOCOL=TCP)(HOST=alpha_host)(PORT=1521))
(CONNECT_DATA = (SID=ALPHA9I))
)
-- 節點 2 上
ORCL9I.TAIKANG.COM =
(DESCRIPTION =
(ADDRESS = (PROTOCOL=TCP)(HOST=orcl_host)(PORT=1521))
(CONNECT_DATA = (SID=ORCL9I))
)
-- 兩節點均需設定(需重啟生效)
*.global_names = TRUE
*.job_queue_processes = 4
*.job_queue_interval = 60
*.open_links = 4
*.distributed_transactions = 4
*.replication_dependency_tracking = TRUE
-- 兩節點均執行
CREATE USER repadmin IDENTIFIED BY repadmin
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
GRANT CREATE SESSION, CREATE TABLE, CREATE PROCEDURE,
CREATE TRIGGER, CREATE SEQUENCE, CREATE VIEW,
CREATE SYNONYM, CREATE DATABASE LINK,
UNLIMITED TABLESPACE TO repadmin;
-- 必須授予的複寫專用權限
GRANT SELECT ANY DICTIONARY TO repadmin;
GRANT EXECUTE ON dbms_repcat TO repadmin;
GRANT EXECUTE ON dbms_reputil TO repadmin;
GRANT EXECUTE ON dbms_defer TO repadmin;
GRANT EXECUTE ON dbms_defer_sys TO repadmin;
GRANT EXECUTE ON dbms_refresh TO repadmin;
GRANT EXECUTE ON dbms_snapshot TO repadmin;
-- 節點 1 (ORCL9I) 執行
CONN repadmin/repadmin
CREATE DATABASE LINK alpha9i.taikang.com
CONNECT TO repadmin IDENTIFIED BY repadmin
USING 'ALPHA9I.TAIKANG.COM';
-- 節點 2 (ALPHA9I) 執行
CONN repadmin/repadmin
CREATE DATABASE LINK orcl9i.taikang.com
CONNECT TO repadmin IDENTIFIED BY repadmin
USING 'ORCL9I.TAIKANG.COM';
-- 驗證連線
SELECT * FROM dual@alpha9i.taikang.com;
SELECT * FROM dual@orcl9i.taikang.com;
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPGROUP (
gname => 'TAIKANG_REP_GROUP',
master_comment => '泰康保險核心業務複寫群組'
);
END;
/
BEGIN
DBMS_REPCAT.CREATE_MASTER_REPOBJECT (
sname => 'SCOTT',
oname => 'EMP',
type => 'TABLE',
use_existing_object => TRUE,
copy_rows => FALSE,
gname => 'TAIKANG_REP_GROUP'
);
END;
/
BEGIN
DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (
sname => 'SCOTT',
oname => 'EMP',
type => 'TABLE',
min_communication => TRUE
);
END;
/
BEGIN
DBMS_REPCAT.ADD_MASTER_DATABASE (
gname => 'TAIKANG_REP_GROUP',
master => 'ALPHA9I.TAIKANG.COM',
use_existing_objects => TRUE,
copy_rows => FALSE,
propagation_mode => 'ASYNCHRONOUS'
);
END;
/
BEGIN
DBMS_REPCAT.RESUME_MASTER_ACTIVITY (
gname => 'TAIKANG_REP_GROUP'
);
END;
/
SELECT gname, master, status
FROM dba_repgroup;
SELECT destination, deferred_tran_count, error_count
FROM dba_deferred_tran_db;
SELECT sname, oname, conflict_type_id, method_name
FROM dba_repconflict;
| 問題 | 原因 | 解決 |
|---|---|---|
| ORA-23308: 物件不存在 | 目標節點缺少基礎表 | 確認 use_existing_objects=TRUE 或預先建立表結構 |
| ORA-23375: 衝突未解決 | 雙向更新同一行 | 設定衝突解決規則(最新時間戳勝出、站點優先級等) |
| Deferred queue 堆積 | 網路中斷或目標節點掛起 | 檢查 DB Link 連線、重啟 Job Queue 進程 |
| GLOBAL_NAME 不符 | DB Link 名稱與 GLOBAL_NAME 不一致 | 強制 DB Link 名稱 = GLOBAL_NAME(global_names=TRUE 時) |
┌─────────────────┐ 非同步傳播 ┌─────────────────┐
│ ORCL9I (MDS) │ ◄─────────────────► │ ALPHA9I (MS) │
│ Master Def │ DBlink 雙向連線 │ Master Site │
│ SCOTT.EMP │ Deferred Queue │ SCOTT.EMP │
└─────────────────┘ └─────────────────┘
▲ ▲
│ │
讀寫分離 讀寫分離
應用端 應用端
Oracle 多主體複寫雖然架構複雜,但透過系統化的部署流程——環境檢查、網路互通、權限授予、Master Group 建立、物件註冊、支援生成、節點加入、活動恢復——即可構建企業級雙活架構。關鍵在於:前期規劃GLOBAL_NAME、雙向DB Link、衝突解決策略 三大核心要素。建議生產環境上線前進行完整的故障演練(網路中斷、節點故障、衝突模擬),確保複寫拓撲的穩健性。