Oracle雙向Stream配置實踐

來源:互聯網
上載者:User

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操作均可即時同步,驗證配置成功。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.