在Oracle11g Streams單向傳輸的基礎上,配置Streams雙向傳輸測試

mengzhaoliang發表於2010-12-20

 

描述:
原來在兩個資料庫伺服器直接配置了Streams的單向傳輸,
原來的源資料庫為兩臺叢集64位HP-UNIX的Oracle11gR2資料庫,
原來的目標資料庫為1臺64位Linux的Oracle11gR2的資料庫,
現在上面的基礎上,把1臺64位Linux的Oracle11gR2的當作源資料庫,把兩臺叢集64位HP-UNIX的Oracle11gR2資料庫當作目標資料庫,
安裝Streams的單向傳輸步驟進行配置,這樣就變成了兩個資料庫伺服器之間的Steams的雙向傳輸。


10.2.2.1:為源資料庫     10.1.1.1及10.1.1.2 叢集資料庫為目標資料庫

1、源資料庫歸檔模式
源:
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     420
Next log sequence to archive   422
Current log sequence           422


2、在源資料庫啟用追加日誌
啟用輔助日誌
SQL> alter database add supplemental log data;

Database altered.

3、需要傳輸testUser 使用者的資料,在源資料庫建立source佇列

> sqlplus  strmadmin/strmadmin

SQL> BEGIN DBMS_STREAMS_ADM.SET_UP_QUEUE(
  2  queue_table=>'SOURCE_QUEUE_TABLE',
  3  queue_name=>'SOURCE_QUEUE',
  4  queue_user=>'strmadmin');
  5  END;
  6  /

PL/SQL procedure successfully completed.

或者:

SQL> EXEC DBMS_STREAMS_ADM.SET_UP_QUEUE();

PL/SQL procedure successfully completed.
該命令會建立一個佇列預設名:streams_queue,佇列表預設是:STREAMS_QUEUE_TABLE

佇列儲存的object型別是anaydata

移除佇列:
exec dbms_streams_adm.remove_queue(
queue_name => 'streams_queue',
cascade => true,
drop_unused_queue_table => true);

可以用查詢dba_queues,dba_queue_tables來檢查:

SQL>  select owner,queue_table,name from dba_queues where wner='STRMADMIN';

OWNER               QUEUE_TABLE              NAME

----------------- ------------------------- ------------------

STRMADMIN          SOURCES_QUEUE_TABLE        SOURCES_QUEUE

STRMADMIN          SOURCES_QUEUE_TABLE        AQ$_SOURCES_QUEUE_TABLE_E

 

SQL>select owner,queue_table,object_type from dba_queue_tables where wner='STRMADMIN';

OWNER            QUEUE_TABLE           OBJECT_TYPE

-------------- --------------------- ------------------

STRMADMIN       SOURCES_QUEUE_TABLE     SYS.ANYDATA

4、在目標資料庫建立接收佇列
$ sqlplus strmadmin/strmadmin

 

SQL> BEGIN DBMS_STREAMS_ADM.SET_UP_QUEUE(
  2  queue_table=>'TARGET_QUEUE_TABLE',
  3  queue_name=>'TARGET_QUEUE',
  4  queue_user=>'strmadmin');
  5  END;
  6  /

PL/SQL procedure successfully completed.


5、在源資料庫建立capture程式
CBDBS01-> sqlplus

SQL> BEGIN DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
  2  schema_name=>'testUser',
  3  streams_type=>'capture',
  4  streams_name=>'capture_stream',
  5  queue_name=>'strmadmin.SOURCE_QUEUE',
  6  include_dml=>true,
  7  include_ddl=>true,
  8  SOURCE_DATABASE=>'bhoms',
  9  include_tagged_lcr=>false,
 10  inclusion_rule=>true);
 11  END;
 12  /

PL/SQL procedure successfully completed.

可以透過dba_capture檢視:

SQL> select CAPTURE_NAME,QUEUE_NAME,START_SCN,STATUS,CAPTURE_TYPE from dba_capture;

SQL> select * from  ALL_CAPTURE_PREPARED_SCHEMAS;

6、在源資料庫繼續建立傳播程式
CBDBS01-> sqlplus strmadmin/strmadmin

SQL> BEGIN DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES(
  2  schema_name=>'testUser',
  3  streams_name=>'source_to_target',
  4  source_queue_name=>'strmadmin.SOURCE_QUEUE',
  5  destination_queue_name=>'strmadmin.TARGET_QUEUE@CBOMS',
  6  include_dml=>true,
  7  include_ddl=>true,
  8  source_database=>'bhoms',
  9  inclusion_rule=>true,
 10  queue_to_queue=>true);
 11  END;
 12  /

PL/SQL procedure successfully completed.

重新啟動propagation process
 檢視propagation process名稱
 select * from all_propagation;

可以透過dba_propagations檢視propagation是否啟動

SQL> select PROPAGATION_NAME,SOURCE_QUEUE_NAME,DESTINATION_QUEUE_NAME,DESTINATION_DBLINK,STATUS from dba_propagation
如果status不是“ENABLED”,而是“DISABLED”

可以啟動
SQL>exec dbms_propagation_adm.start_propagation('source_to_target');   (關閉為exec dbms_propagation_adm.stop_propagation('source_to_target');)


7、在目標資料庫建立apply程式
$ sqlplus strmadmin/strmadmin

SQL> BEGIN
  2  DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
  3  schema_name=>'testUser',
  4  streams_type=>'apply',
  5  streams_name=>'target_apply_stream',
  6  queue_name=>'strmadmin.TARGET_QUEUE',
  7  include_dml=>true,
  8  include_ddl=>true,
  9  include_tagged_lcr=>false,
 10  source_database=>'bhoms',
 11  inclusion_rule=>true);
 12  END;
 13  /

PL/SQL procedure successfully completed.

可以透過:

dba_apply

v$streams_apply_reader

v$streams_apply_coordinator

v$streams_apply_server

8、直接設定SCN的方式進行例項化
源:
獲取源庫互置使用者的SCN
sqlplus strmadmin/strmadmin
SQL> set serveroutput on
SQL> DECLARE
  2  iscn NUMBER;
  3  BEGIN
  4  iscn:=DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
  5  DBMS_OUTPUT.PUT_LINE('Instantiation SCN is :'||iscn);
  6  END;
  7  /
Instantiation SCN is :5475315

PL/SQL procedure successfully completed.

在目標資料庫:
設定為目標庫互置使用者的SCN

sqlplus strmadmin/strmadmin
SQL> BEGIN
  2  DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN(
  3  source_schema_name=>'testUser',
  4  source_database_name=>'bhoms',
  5  instantiation_scn=>&iscn);
  6  END;
  7  /
Enter value for iscn: 5475315
old   5: instantiation_scn=>&iscn);
new   5: instantiation_scn=>5475315);

PL/SQL procedure successfully completed.

9、在目標資料庫啟動Apply程式
SQL> BEGIN
  2  DBMS_APPLY_ADM.SET_PARAMETER(
  3  apply_name => 'target_apply_stream',
  4  parameter=>'disable_on_error',
  5  value=>'n');
  6  END;
  7  /

PL/SQL procedure successfully completed.


SQL> BEGIN
  2  DBMS_APPLY_ADM.START_APPLY(
  3  apply_name=>'target_apply_stream');
  4  END;
  5  /

PL/SQL procedure successfully completed.


附註:
1、#停止Apply程式

SQL>begin
dbms_apply_adm.stop_apply(
apply_name => 'target_apply_stream');
end;
/

2、啟動Apply程式
begin
dbms_apply_adm.start_apply(
apply_name => 'target_apply_stream');
end;
/

檢視Apply狀態

SQL> select apply_name,queue_name,status from dba_apply;

3、啟動傳播程式
exec dbms_propagation_adm.start_propagation('source_to_target');

 

4、在源資料庫上啟動capture
SQL> BEGIN
  2  DBMS_CAPTURE_ADM.START_CAPTURE(
  3  capture_name=>'capture_stream');
  4  END;
  5  /

PL/SQL procedure successfully completed.

5、#停止Capture程式

begin
dbms_capture_adm.stop_capture(
capture_name => 'capture_stream');
end;
/

begin
dbms_capture_adm.start_capture(
capture_name => 'capture_stream');
end;
/
 
檢視Capture狀態:

SQL> select capture_name,status from dba_capture;

7、把資料庫的歸檔日誌空間設定成20GB
show parameter recover

alter system set db_recovery_file_dest_size=20G scope=both;

如果空間太小,還需要寫個rman的指令碼刪除多餘的歸檔日誌。


8、在目標資料庫沒有例項化錯誤ORA-26687:
在叢集的select * from dba_apply_error

ORA-26687: no instantiation SCN provided for "testUser"."TEST11" in source database "BHOMS"

在目標資料庫檢視初始化資料是否成功:
select source_database,source_object_name,instantiation_scn from dba_apply_instantiated_objects;
如果查詢出來的物件所對應的source_database為源資料庫的資料庫名稱則是已經例項化了

解決:
如果查詢出來的物件所對應的source_database不是源資料庫的資料庫名,則可以修改資料庫的資料字典(需要超級使用者sys進行操作)
select source_database,source_object_name,instantiation_scn from dba_apply_instantiated_objects order by  instantiation_scn
for update

把物件所對應的source_database不是源資料庫的資料庫名的資料查詢出來
select * from dba_apply_instantiated_objects s where s.source_database='CBOMS'

把下面的這些表物件的source_database值更改為源資料庫的資料庫名
update dba_apply_instantiated_objects s set s.source_database='BHOMS'
where s.source_database='CBOMS' and s.source_object_owner='testUser'
and s.source_object_name not like 'T%'

這樣可以解決了。

檢視資料庫表的對應的scn
SELECT * FROM DBA_CAPTURE_PREPARED_TABLES order by scn

啟動capture,propagation,apply並測試:
select * from dba_capture;
select * from dba_propagation;
select * from dba_apply;
select * from dba_apply_error;
select * from dba_apply_instantiated_objects;
select * from dba_rule_set_rules;
select * from dba_rule_sets;
select * from dba_rules;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12778571/viewspace-682166/,如需轉載,請註明出處,否則將追究法律責任。

相關文章