Oracle雙向Stream配置實踐
摘要:本文描述了使用Oracle Stream流複製功能,進行雙向流複製。主要用於實現即時的資料庫同步和備份。 Oracle Stream功能是為提高資料庫的高可用性而設計的。Oracle Stream利用進階隊列技術,通過解析歸檔日誌,將歸檔日誌解析成DDL及DML語句,從而實現資料庫之間的同步。這種技術可以將整個資料庫、資料庫中的對象複製到另一資料庫中,通過使用Stream的技術,對歸檔日誌的挖掘,可以在對主系統沒有任何壓力的情況下,實現對資料庫物件級甚至整個資料庫的同步。
雙向Stream配置
以兩台oracle10g伺服器stream1(192.168.1.101)和stream2(192.168.1.102)配置雙向stream為例。
1. oracle歸檔模式,追加日誌,global_name
1.1. oracle歸檔模式
確認oracle處于歸檔模式,如不是,則修改為歸檔模式。
通過如下查看oracle是否處于歸檔模式:
SQL> archive log list
Database log mode Archive Mode
如上則為歸檔模式,如為非歸檔模式,可通過如下命令修改為歸檔模式,
sqlplus ‘/ as sysdba’
alter system set log_archive_dest_1=’location=/opt/test’ scope=spfile;
alter system set log_archive_start=TRUE scope=spfile;
alter system set log_archive_format=’ arch%t_%s_%r.arc’ scope=spfile;
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
1.2. oracle追加日誌
使用管理員賬戶登入
用於對沒有主鍵(Primary Key)的Table進行修改等操作時記錄日誌用於流複製。可以基於Database層級或Table層級啟用追加日誌(Supplemental Log)。
可以直接啟用database基本的追加日誌。
sql為:alter database add supplemental log data;
1.3. oracle global_name
使用管理員賬戶登入
在兩台機器上修改global_name
stream1:
SQL> alter system set global_names=true scope=both;
SQL> alter database rename global_name to stream1.home;
stream2:
SQL> alter system set global_names=true scope=both;
SQL> alter database rename global_name to stream2.home;
2. 配置tnsname
在兩台機器上分別配置tnsname,用來訪問對方。
在stream1:
stream2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.102)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl)
(SERVER = DEDICATED)
)
)
在stream2:
stream1=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl)
(SERVER = DEDICATED)
)
)
3. 建立Stream系統管理使用者
對於兩台機器都建立同樣的系統管理使用者。
先建立資料表空間streams_tbs
然後建立strmadmin系統管理使用者和分配DBA,stream許可權
SQL> CREATE USER strmadmin IDENTIFIED BY pword DEFAULT TABLESPACE streams_tbs QUOTA UNLIMITED ON streams_tbs;
結果:User created.
SQL> GRANT DBA TO strmadmin;
結果:Grant succeeded.
SQL> BEGIN
DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(
grantee => 'strmadmin',
grant_privileges => true);
END;
/
結果:PL/SQL procedure successfully completed.
4. 建立DB_LINK,STREAM隊列
使用strmadmin使用者登入
4.1. 建立DB_LINK
在stream1上建立:
CREATE DATABASE LINK stream2.home CONNECT TO strmadmin IDENTIFIED BY strmadminpw USING 'stream2';
在stream2上建立:
CREATE DATABASE LINK stream1.home CONNECT TO strmadmin IDENTIFIED BY strmadminpw USING 'stream1';
4.2. 建立Stream隊列
在stream1,stream2上執行
SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE();
PL/SQL procedure successfully completed.
5. 同步stream1和stream2資料結構和資料
主要為將主要資料庫user資料結構和資料,匯入至從資料庫。從而使兩個資料庫資料結構和資料一致。
可以採用主要資料庫user匯出dmp,從資料庫匯入或直接在從資料庫通過db_link匯入。
6. stream1 -> stream2 配置
使用strmadmin使用者登入
6.1. 在stream1上建立propagation
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(
schema_name => 'c4',
streams_name => 'stream1_to_stream2',
source_queue_name => 'strmadmin.streams_queue',
destination_queue_name => 'strmadmin.streams_queue@stream2.home',
include_dml => true,
include_ddl => true,
source_database => 'stream1.home',
inclusion_rule => true,
queue_to_queue => true);
END;
其中schema_name => 'c4', 為配置流複製的資料對象,也就是oracle user。以下配置中的schema_name都是同含義。
可以通過dba_propagations查看結果:
SQL> select PROPAGATION_NAME,SOURCE_QUEUE_NAME,DESTINATION_QUEUE_NAME,DESTINATION_DBLINK,STATUS from dba_propagation;
PROPAGATION_NAME SOURCE_QUEUE_NAME DESTINATION_QUEUE_NAME DESTINATION_DBL STATUS
-------------------------------- ------------------------------ --------------------------------- --------------- --------
STREAM1_TO_STREAM2 STREAMS_QUEUE STREAMS_QUEUE STREAM2.HOME ENABLED
STATUS為ENABLED則表示建立成功
6.2. 在stream1上建立Capture進程
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
schema_name => 'hr',
streams_type => 'capture',
streams_name => 'capture_stream1',
queue_name => 'strmadmin.streams_queue',
include_dml => true,
include_ddl => true,
inclusion_rule => true);
END;
可以通過dba_capture查看:
SQL> select CAPTURE_NAME,QUEUE_NAME,START_SCN,STATUS,CAPTURE_TYPE from dba_capture;
查詢到CAPTURE_NAME為CAPTURE_STREAM1 的記錄則表明建立成功,此進程還未啟動,所以STATUS會是DISABLED。
6.3. 在stream1進行與stream2同步SCN
DECLARE
v_scn NUMBER;
BEGIN
v_scn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN@stream2.home(
source_schema_name => 'c4',
source_database_name => 'stream1.home',
instantiation_scn => v_scn,
recursive => true);
END;
6.4. stream2上建立apply進程
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
schema_name => 'c4',
streams_type => 'apply',
streams_name => 'apply_stream2',
queue_name => 'strmadmin.streams_queue',
include_dml => true,
include_ddl => true,
source_database => 'stream1.home',
inclusion_rule => true);
END;
通過查詢語句 select * from dba_apply;
可以查詢到APPLY_NAME為APPLY_STREAM2的記錄。
7. stream2 -> stream1 配置
使用strmadmin使用者登入
7.1. 在stream2上建立propagation
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(
schema_name => 'c4',
streams_name => 'stream2_to_stream1',
source_queue_name => 'strmadmin.streams_queue',
destination_queue_name => 'strmadmin.streams_queue@stream1.home',
include_dml => true,
include_ddl => true,
source_database => 'stream2.home',
inclusion_rule => true,
queue_to_queue => true);
END;
其中schema_name => 'c4', 為配置流複製的資料對象,也就是oracle user。以下配置中的schema_name都是同含義。
可以通過dba_propagations查看結果:
SQL> select PROPAGATION_NAME,SOURCE_QUEUE_NAME,DESTINATION_QUEUE_NAME,DESTINATION_DBLINK,STATUS from dba_propagation;
PROPAGATION_NAME SOURCE_QUEUE_NAME DESTINATION_QUEUE_NAME DESTINATION_DBL STATUS
-------------------------------- ------------------------------ --------------------------------- --------------- --------
STREAM2_TO_STREAM1 STREAMS_QUEUE STREAMS_QUEUE STREAM1.HOME ENABLED
STATUS為ENABLED則表示建立成功
7.2. 在stream2上建立Capture進程
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
schema_name => 'hr',
streams_type => 'capture',
streams_name => 'capture_stream2',
queue_name => 'strmadmin.streams_queue',
include_dml => true,
include_ddl => true,
inclusion_rule => true);
END;
可以通過dba_capture查看:
SQL> select CAPTURE_NAME,QUEUE_NAME,START_SCN,STATUS,CAPTURE_TYPE from dba_capture;
查詢到CAPTURE_NAME為CAPTURE_STREAM2 的記錄則表明建立成功,此進程還未啟動,所以STATUS會是DISABLED。
7.3. 在stream2進行與stream1同步SCN
DECLARE
v_scn NUMBER;
BEGIN
v_scn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN@stream1.home(
source_schema_name => 'c4',
source_database_name => 'stream2.home',
instantiation_scn => v_scn,
recursive => true);
END;
7.4. stream1上建立apply進程
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
schema_name => 'c4',
streams_type => 'apply',
streams_name => 'apply_stream1',
queue_name => 'strmadmin.streams_queue',
include_dml => true,
include_ddl => true,
source_database => 'stream2.home',
inclusion_rule => true);
END;
通過查詢語句 select * from dba_apply;
可以查詢到APPLY_NAME為APPLY_STREAM1的記錄。
8. 啟動
8.1. stream1-> stream2
均使用strmadmin使用者登入
在stream2上啟動apply:
SQL>
BEGIN
DBMS_APPLY_ADM.SET_PARAMETER(
apply_name => 'apply_stream2',
parameter => 'disable_on_error',
value => 'n');
END;
結果:PL/SQL procedure successfully completed.
SQL>
BEGIN
DBMS_APPLY_ADM.START_APPLY(
apply_name => 'apply_stream2');
END;
結果:PL/SQL procedure successfully completed.
通過如下sql查詢狀態:
SQL> select apply_name,queue_name,status from dba_apply;
APPLY_NAME QUEUE_NAME STATUS
------------------------------ -------------------------- --------
APPLY_STREAM2 STREAMS_QUEUE ENABLED
在stream1上啟動capture:
SQL>
BEGIN
DBMS_CAPTURE_ADM.START_CAPTURE(
capture_name => 'capture_stream1');
END;
通過如下sql查詢啟動狀態:
SQL> select capture_name,status from dba_capture;
CAPTURE_NAME STATUS
------------------------------ ------------
CAPTURE_STREAM1 ENABLED
8.2. stream2 -> stream1
在stream1上啟動apply:
SQL>
BEGIN
DBMS_APPLY_ADM.SET_PARAMETER(
apply_name => 'apply_stream1',
parameter => 'disable_on_error',
value => 'n');
END;
PL/SQL procedure successfully completed.
SQL>
BEGIN
DBMS_APPLY_ADM.START_APPLY(
apply_name => 'apply_stream1');
END;
PL/SQL procedure successfully completed.
SQL> select apply_name,queue_name,status from dba_apply;
APPLY_NAME QUEUE_NAME STATUS
------------------------------ -------------------------- --------
APPLY_STREAM1 STREAMS_QUEUE ENABLED
在stream2上啟動capture:
SQL>
BEGIN
DBMS_CAPTURE_ADM.START_CAPTURE(
capture_name => 'capture_stream2');
END;
SQL> select capture_name,status from dba_capture;
CAPTURE_NAME STATUS
------------------------------ ------------
CAPTURE_STREAM2 ENABLED
啟動完成後,通過對兩個庫進行DDL,DML操作均可即時同步,驗證配置成功。