本文記錄一次真實環境操作:修改資料庫名稱 (SID)、配置靜態監聽、建立 DB_LINK、使用 Materialized View (物化視圖) 與 Snapshot (快照) 實現跨資料庫資料同步。
SQL> SELECT instance_name FROM v$instance;
INSTANCE_NAME
----------------
orcl
SQL> SHUTDOWN IMMEDIATE;
$ lsnrctl stop orcl
/etc/oratab:將 orcl: 改為 bitc:~/.bash_profile:export ORACLE_SID=bitc 並 source ~/.bash_profile 生效cd $ORACLE_HOME/dbs
mv hc_orcl.dat hc_bitc.dat
mv lkORCL lkBITC
mv orapworcl orapwbitc
mv spfileorcl.ora spfilebitc.ora
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle entries=5 force=y
SQL> STARTUP
SQL> SELECT instance_name FROM v$instance;
INSTANCE_NAME
----------------
bitc
/etc/oratab、.bash_profile。$ORACLE_HOME/database。netmgr 圖形工具配置監聽器參數檔 (listener.ora)。SID_LIST_LISTENER 區段,註冊 SID_NAME = bitc。SQL> SHOW PARAMETER listener;
SQL> ALTER SYSTEM SET local_listener = 'BITC';
SQL> ALTER SYSTEM REGISTER;
$ lsnrctl start BITC
$ lsnrctl status BITC
輸出顯示 Service "bitc" 與 "orcl" 均指向 Instance "bitc",確認靜態註冊成功。
注意:動態監聽預設埠 1521,多實例共用;配置 namespace 時所有實例主機名與埠必須完全一致,否則可能阻塞。64 位元 Oracle 配置 32 位元遠端 listener 可能因版本不相容失敗。
BITC (u01/abc)TEST (原連 ORCL,現需重建 DB_LINK 指向 BITC)-- TEST 端
DROP PUBLIC DATABASE LINK conn_orcl;
CREATE PUBLIC DATABASE LINK CONN_BITC CONNECT TO u01 IDENTIFIED BY abc USING 'BITC';
-- BITC 端 (u01)
CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(30));
CREATE MATERIALIZED VIEW LOG ON t1; -- 必須有主鍵
-- TEST 端
CREATE MATERIALIZED VIEW t1_mv
REFRESH FAST
START WITH SYSDATE NEXT SYSDATE + 1/1440 -- 每分鐘
WITH PRIMARY KEY AS SELECT * FROM u01.t1@CONN_BITC;
REFRESH FAST:增量刷新,需 MV Log 支援。START WITH ... NEXT ...:自動排程刷新間隔 (1/1440 天 = 1 分鐘)。-- BITC 端插入資料
INSERT INTO t1 VALUES (1, 'chal');
COMMIT;
-- TEST 端:刷新前無資料,1 分鐘後自動同步出現
SELECT * FROM t1_mv; -- 顯示 1 | chal
-- BITC 端
CREATE TABLE stu (id INT, name VARCHAR(30)); -- 無主鍵
-- CREATE MATERIALIZED VIEW LOG ON stu; -- 報錯 ORA-12014
-- TEST 端:FORCE 模式 (嘗試 FAST,失敗則 COMPLETE) + ROWID
CREATE MATERIALIZED VIEW stu_mv
REFRESH FORCE
START WITH SYSDATE NEXT SYSDATE + 1/1440
WITH ROWID AS SELECT * FROM u01.stu@CONN_BITC;
ROWID,且只能 COMPLETE 或 FORCE 刷新。CREATE SNAPSHOT 等同於 CREATE MATERIALIZED VIEW,語法保留相容性。
-- BITC 端
CREATE TABLE test1 (id INT PRIMARY KEY, name VARCHAR(30));
CREATE SNAPSHOT LOG ON test1; -- 實為 MV LOG
INSERT ALL INTO test1 VALUES(1,'egg') INTO test1 VALUES(2,'apple') SELECT * FROM dual;
COMMIT;
-- TEST 端
CREATE SNAPSHOT sn_test1 AS SELECT * FROM u01.test1@CONN_BITC;
ALTER SNAPSHOT sn_test1 REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/1440 WITH PRIMARY KEY;
-- 驗證增量同步
INSERT INTO test1 VALUES (3, 'fish'); COMMIT;
-- 1 分鐘後 sn_test1 自動出現第 3 筆
-- BITC 端
CREATE TABLE test2 (id INT, name VARCHAR(30));
INSERT INTO test2 VALUES (1, 'beef'); COMMIT;
-- TEST 端:COMPLETE 刷新
CREATE SNAPSHOT sn_test2 REFRESH COMPLETE
START WITH SYSDATE NEXT SYSDATE + 1/1440
WITH ROWID AS SELECT * FROM u01.test2@CONN_BITC;
| 維度 | 熱備份 | 物化視圖/快照同步 |
|---|---|---|
| 目的 | 災難恢復、時間點恢復 | 業務資料異步複寫、報表卸載 |
| 模式 | ARCHIVELOG 模式 | 一般模式即可 |
| 粒度 | 表空間/資料檔/控制檔/歸檔日誌 | 特定表/查詢結果集 |
| 恢復能力 | 秒級、任意時間點、幾乎所有實體 | 僅同步定義的物化視圖資料 |
| 複雜度 | 高,操作失誤風險大 | 低,DBA 可透過排程自動管理 |
| 參數 | 查詢方式 | 說明 |
|---|---|---|
| DB_NAME | SELECT name FROM v$database;SHOW PARAMETER db_name | 資料庫名稱,建庫時指定 |
| INSTANCE_NAME | SELECT instance_name FROM v$instance;SHOW PARAMETER instance_name | 實例名稱,參數檔/註冊表設定 |
| ORACLE_SID | OS 環境變數 | 作業系統層面識別實例,必須與 INSTANCE_NAME 一致 |
| DB_DOMAIN | SHOW PARAMETER db_domain | 資料庫網域名稱 |
| SERVICE_NAME | SHOW PARAMETER service_name | 9i+ 引入;有域名則 = 全域資料庫名,否則 = DB_NAME |
| GLOBAL_NAME | DB_NAME.DB_DOMAIN | 全域資料庫名 |
SERVICE_NAME 而非 SID。