Stream的主要环节分为捕获(capture),分发(propagation)和应用(apply)。如果从应用这些环节所处的地方,可以分为:
UpStreams(capture和propagation在source数据库,apply在destination数据库)。
DownStream(capture和propagation,以及apply在destination数据库)
如果成对象来分,可以分成:
database级的stream
owner级的stream
table级的stream
下面我们来建立几个stream:
(一)owner级UpStream:
1.1 创建stream用户的表空间:
create tablespace tbs_stream datafile '/oracle/app/oracle/oradata/stream02/tbs_stream02.dbf' size 200M;
?
1.2 将logmnr的默认表空间转到刚刚建立的表空间:
SQL> execute dbms_logmnr_d.set_tablespace('tbs_stream');
?
PL/SQL procedure successfully completed.
?
SQL>
?
1.3 创建stream user和授权:
SQL> CREATE USER strmadmin IDENTIFIED BY strmadmin
? 2? DEFAULT TABLESPACE tbs_stream
? 3? QUOTA UNLIMITED ON tbs_stream;
?
SQL> grant dba to strmadmin;
?
Grant succeeded.
?
SQL>
SQL>
SQL> BEGIN
? 2? DBMS_STREAMS_AUTH.GRANT_ADMIN_PRIVILEGE(
? 3? grantee => 'strmadmin',
? 4? grant_privileges => true);
END;
/? ?5? ? 6?
?
PL/SQL procedure successfully completed.
?
SQL>
?
1.4 check stream admin用户的情况:
SQL> SELECT * FROM dba_streams_administrator;
?
USERNAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LOCAL_ ACCESS
------------------------------------------------------------ ------ ------
STRMADMIN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? YES? ? YES
?
SQL>
?
1.6 查一下arch目录是否设置正确,是否启动归档模式。
?
1.7 设置tnsname,能tnsping到对方的机器。
?
1.8 设置global_names
SQL> Alter system set global_names=TRUE scope=BOTH;
?
System altered.
?
SQL>
?
1.9 设置stream需要的初始化参数:
alter system set aq_tm_processes=2 scope=both;
alter system set global_names=true scope=both;
alter system set job_queue_processes=10 scope=both;
alter system set parallel_max_servers=20 scope=both;
alter system set undo_retention=3600 scope=both;
alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile;
alter system set streams_pool_size=25M scope=spfile;
alter system set utl_file_dir='*' scope=spfile;
alter system set open_links=4 scope=spfile;
?
?
1.10 建立dblink。
在source机:
create database link stream02 connect to strmadmin identified by strmadmin using 'stream02';
在destination机:
create database link stream01 connect to strmadmin identified by strmadmin using 'stream01';
?
2. 在source数据库启用Database 追加日志
alter database add supplemental log data;
?
3.在source数据库创建stream队列:
connect strmadmin/strmadmin
SQL> exec dbms_streams_adm.set_up_queue;? ?
?
PL/SQL procedure successfully completed.
注意如果没有指定queue_table和queue_name,数据库是默认给queue_name为STREAMS_QUEUE_TABLE ,queue_name为STREAMS_QUEUE:
SQL> select owner,queue_table,name from dba_queues where owner='STRMADMIN';
?
OWNER? ? ? ? ? ? ? ? QUEUE_TABLE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NAME
-------------------- ------------------------------------------------------------ ------------------------------------------------------------
STRMADMIN? ? ? ? ? ? STREAMS_QUEUE_TABLE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? STREAMS_QUEUE
STRMADMIN? ? ? ? ? ? STREAMS_QUEUE_TABLE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AQ$_STREAMS_QUEUE_TABLE_E
?
SQL>
?
?
4. 在destination数据库创建stream队列:
connect strmadmin/strmadmin
begin
dbms_streams_adm.set_up_queue(
queue_table => 'dest_queue_table',
queue_name => 'dest_queue');
end;
/
SQL> select owner,queue_table,name from dba_queues where owner='STRMADMIN';
?
OWNER? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? QUEUE_TABLE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NAME
------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------
STRMADMIN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DEST_QUEUE_TABLE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DEST_QUEUE
STRMADMIN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DEST_QUEUE_TABLE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?AQ$_DEST_QUEUE_TABLE_E
?
SQL>
?
?
5. 在source数据库创建capture进程:
connect strmadmin/strmadmin
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'hr',
streams_type => 'capture',
streams_name => 'capture_stream01_to_stream02',
queue_name => 'strmadmin.STREAMS_QUEUE',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
/
?
此时可以在source数据库看到有c001这样的进程.
?
?
?
6.初始化需要做stream的schema:
6.1 在source数据库导出:
exp userid=hr/hr file='/oracle/hr.dmp' object_consistent=y rows=y
?
6.2 在destination数据库导入
imp userid=system/oracle@stream02 file='/oracle/hr.dmp' ignore=y commit=y log='/oracle/hr.log' streams_instantiation=y fromuser=hr touser=hr
?
7.在source数据库创建schema级分发规则:
begin
dbms_streams_adm.add_schema_propagation_rules(
schema_name => 'hr',
streams_name => 'propag_strm01_to_strm02',
source_queue_name => 'strmadmin.STREAMS_QUEUE',
destination_queue_name => 'strmadmin.dest_queue@stream02',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'stream01',
inclusion_rule => true);
end;
/
?
注意此时job queue进程开始工作(j00x)
?
8. 在source数据库设置分发作业计划,latency => 0表示实时分发。
begin
dbms_aqadm.alter_propagation_schedule(
queue_name => 'STREAMS_QUEUE',
destination => 'stream02',
latency => 0);
end;
/
?
?
9. 在destination数据库创建apply进程:
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'hr',
streams_type => 'apply',
streams_name => 'apply_strm01_to_strm02',
queue_name => 'strmadmin.dest_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'stream01',
inclusion_rule => true);
end;
/
?
注意此时有a001进程出现。
?
10. 最后启动stream:
10.1 在destination数据库启动apply:
begin
dbms_apply_adm.start_apply(
apply_name => 'apply_strm01_to_strm02');
end;
/
?
?
10.2 在source数据库启动capture:
begin
dbms_capture_adm.start_capture(
capture_name => 'capture_stream01_to_stream02');
end;
/
?
11. 停止stream:
11.1 在source数据库停止capture:
begin
dbms_capture_adm.stop_capture(
capture_name => 'capture_stream01_to_stream02');
end;
/
?
11.2 在destination数据库停止apply:
begin
dbms_apply_adm.stop_apply(
apply_name => 'apply_strm01_to_strm02');
end;
/
(二) owner级downstream:
1.1~1.10 同upstream。
2. 在downstream site设置:
?
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='LOCATION=/oracle/app/oracle/arch/standby_arch VALID_FOR=(STANDBY_LOGFILE,PRIMARY_ROLE)' SCOPE=SPFILE;
3. 在source site和downstream site同时设置:
4. 从soruce site创建standby redo:
4.1 在source库查询redo情况:
?
?? THREAD#? ? ?GROUP# BYTES/1024/1024
---------- ---------- ---------------
?? ? ? ? 1? ? ? ? ? 1? ? ? ? ? ? ? 50
?? ? ? ? 1? ? ? ? ? 2? ? ? ? ? ? ? 50
?? ? ? ? 1? ? ? ? ? 3? ? ? ? ? ? ? 50
?
SQL>
注意创建standby redo时,大小要和source site的redo大小一致,数量上要比source site的redo多一个。
4.2 在downstream site:
('/oracle/app/oracle/oradata/stream02/stdy_redo04.log') SIZE 50M;
?
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5
('/oracle/app/oracle/oradata/stream02/stdy_redo05.log') SIZE 50M;
?
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6
('/oracle/app/oracle/oradata/stream02/stdy_redo06.log') SIZE 50M;
?
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7
('/oracle/app/oracle/oradata/stream02/stdy_redo04.log') SIZE 50M;
4.3 在downstream site上检查一下是否建立成功:
?
?? ?GROUP#? ? THREAD#? SEQUENCE# ARCHIV STATUS
---------- ---------- ---------- ------ --------------------
?? ? ? ? 4? ? ? ? ? 0? ? ? ? ? 0 YES? ? UNASSIGNED
?? ? ? ? 5? ? ? ? ? 0? ? ? ? ? 0 YES? ? UNASSIGNED
?? ? ? ? 6? ? ? ? ? 0? ? ? ? ? 0 YES? ? UNASSIGNED
?? ? ? ? 7? ? ? ? ? 0? ? ? ? ? 0 YES? ? UNASSIGNED
?
SQL>
5. 准备source site的参数:
?
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=stream02 LGWR SYNC NOREGISTER
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=stream02'
SCOPE=SPFILE;
6. 在source site和downstream site同时设置参数:
7. 开始stream配置:
7.1 在source site创建需要复制的schema:
?
User created.
?
SQL> grant connect, resource, create table to hjm;
?
Grant succeeded.
?
SQL>
7.2 在downstream site设置stream queue:
?
BEGIN
DBMS_STREAMS_ADM.SET_UP_QUEUE(
queue_table => 'strmadmin.DOWNSTREAM_Q_TABLE',
queue_name => 'strmadmin.DOWNSTREAM_Q',
queue_user => 'STRMADMIN');
END;
/
?
? 1* select name, queue_table,QUEUE_TYPE,USER_COMMENT from user_queues
SQL> /
?
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ?QUEUE_TABLE? ? ? ? ? QUEUE_TYPE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?USER_COMMENT
------------------------------ -------------------- ---------------------------------------- ------------------------------
AQ$_DOWNSTREAM_Q_TABLE_E? ? ? ?DOWNSTREAM_Q_TABLE? ?EXCEPTION_QUEUE? ? ? ? ? ? ? ? ? ? ? ? ? exception queue
DOWNSTREAM_Q? ? ? ? ? ? ? ? ? ?DOWNSTREAM_Q_TABLE? ?NORMAL_QUEUE
注意,从最佳实践出发,建议downstream设置一个queue,而不是多个queue。这一个queue将用于catpure和apply的queue,能避免分发和queue to queue传输的冗余。
7.3 在downstream site创建apply进程:
?
BEGIN
DBMS_APPLY_ADM.CREATE_APPLY(
queue_name => 'strmadmin.DOWNSTREAM_Q',
apply_name => 'DOWNSTREAM_APPLY',
apply_captured => TRUE
);
END;
/
7.4 检查 apply的信息:
?
APPLY_NAME? ? ? ? ? ? ? ? ? ? ?STATUS? ? ? ? ? ?QUEUE_NAME
------------------------------ ---------------- ------------------------------------------------------------
DOWNSTREAM_APPLY? ? ? ? ? ? ? ?DISABLED? ? ? ? ?DOWNSTREAM_Q
?
SQL>
?
SQL> l
? 1? SELECT parameter, value, set_by_user
? 2? FROM DBA_APPLY_PARAMETERS
? 3* WHERE apply_name = 'DOWNSTREAM_APPLY'
SQL> /
?
PARAMETER? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? VALUE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SET_BY
-------------------------------------------------- -------------------------------------------------- ------
ALLOW_DUPLICATE_ROWS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
COMMIT_SERIALIZATION? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?FULL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NO
DISABLE_ON_ERROR? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Y? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
DISABLE_ON_LIMIT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
MAXIMUM_SCN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INFINITE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NO
PARALLELISM? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
STARTUP_SECONDS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
TIME_LIMIT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?INFINITE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NO
TRACE_LEVEL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
TRANSACTION_LIMIT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INFINITE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NO
TXN_LCR_SPILL_THRESHOLD? ? ? ? ? ? ? ? ? ? ? ? ? ? 10000? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
WRITE_ALERT_LOG? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Y? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
?
12 rows selected.
?
SQL>
7.5 在downstream site创建capture进程:
?
BEGIN
DBMS_CAPTURE_ADM.CREATE_CAPTURE(
queue_name => 'strmadmin.DOWNSTREAM_Q',
capture_name => 'DOWNSTREAM_CAPTURE',
rule_set_name => NULL,
start_scn => NULL,
source_database => 'stream01',
use_database_link => true,
first_scn => NULL,
logfile_assignment => 'implicit');
END;
/
7.6 检查capture的信息:
?
CAPTURE_NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?STATUS
------------------------------------------------------------ ----------------
DOWNSTREAM_CAPTURE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DISABLED
?
SQL>
?
SQL> SELECT parameter, value, set_by_user FROM DBA_CAPTURE_PARAMETERS;
?
PARAMETER? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? VALUE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SET_BY
-------------------------------------------------- -------------------------------------------------- ------
DISABLE_ON_LIMIT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
DOWNSTREAM_REAL_TIME_MINE? ? ? ? ? ? ? ? ? ? ? ? ? N? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
MAXIMUM_SCN? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INFINITE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NO
MESSAGE_LIMIT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? INFINITE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NO
PARALLELISM? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
STARTUP_SECONDS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
TIME_LIMIT? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?INFINITE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NO
TRACE_LEVEL? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
WRITE_ALERT_LOG? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Y? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NO
?
9 rows selected.
?
SQL>
8. 为实时变动设置capture:
8.1 在downstream site:
?
SQL> BEGIN
? 2? DBMS_CAPTURE_ADM.SET_PARAMETER(
? 3? capture_name => 'DOWNSTREAM_CAPTURE',
? 4? parameter => 'downstream_real_time_mine',
? 5? value => 'y');
? 6? END;
? 7? /
?
PL/SQL procedure successfully completed.
?
SQL>
8.2 在downstream site设置rule规则:
? 2? DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
? 3? schema_name => 'hjm',
? 4? streams_type => 'capture',
? 5? streams_name => 'downstream_capture',
? 6? queue_name => 'strmadmin.downstream_q',
? 7? include_dml => true,
? 8? include_ddl => true,
? 9? include_tagged_lcr => false,
?10? source_database => 'stream01',
?11? inclusion_rule => TRUE);
?12? END;
?13? /
?
PL/SQL procedure successfully completed.
?
SQL>
8.3 在downstream site检查rule设置情况:
? 1? SELECT rule_name, rule_condition
? 2? FROM DBA_STREAMS_SCHEMA_RULES
? 3? WHERE streams_name = 'DOWNSTREAM_CAPTURE'
? 4* AND streams_type = 'CAPTURE'
SQL> /
?
RULE_NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RULE_CONDITION
------------------------------------------------------------ ------------------------------------------------------------
HJM15? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ((:dml.get_object_owner() = 'HJM') and :dml.is_null_tag() =
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 'Y' and :dml.get_source_database_name() = 'STREAM01.REGRESS.
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RDBMS.DEV.US.ORACLE.COM' )
?
HJM16? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ((:ddl.get_object_owner() = 'HJM' or :ddl.get_base_table_own
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? er() = 'HJM') and :ddl.is_null_tag() = 'Y' and :ddl.get_sour
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ce_database_name() = 'STREAM01.REGRESS.RDBMS.DEV.US.ORACLE.C
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OM' )
?
?
SQL>
9. 实例化需要同步的owner:
9.1 在source site:
9.2 在downstream site:
?
User created.
?
SQL> grant connect, resource, create table to hjm;
?
Grant succeeded.
?
SQL>
9.3 在source site:
10. 在downstream site开始启动apply进程:
?
SQL> exec DBMS_APPLY_ADM.START_APPLY(apply_name => 'DOWNSTREAM_APPLY');
?
PL/SQL procedure successfully completed.
10.1 检查 apply情况:
?
APPLY_NAME? ? ? ? ? ? ? ? ? ? ?STATUS
------------------------------ ----------------
DOWNSTREAM_APPLY? ? ? ? ? ? ? ?ENABLED
?
SQL>
可以看到已经从disbale变成enabled。
11. 在downstream site启动capture进程:
?
SQL> exec DBMS_CAPTURE_ADM.START_CAPTURE(capture_name => 'DOWNSTREAM_CAPTURE');
?
PL/SQL procedure successfully completed.
?
SQL>
11.1 检查 capture情况:
?
CAPTURE_NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?STATUS
------------------------------------------------------------ ----------------
DOWNSTREAM_CAPTURE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ENABLED
?
SQL>
看到capture的status也从disable变成enabled了。
至此,downstream建立完毕。
【trouble shooting】:
1.对于upstream,需要检查dba_capture, dba_propagation, dba_apply:
SQL> l
? 1? select propagation_name as name,status,ERROR_MESSAGE from dba_propagation
? 2? union all
? 3* select CAPTURE_NAME,status,ERROR_MESSAGE from dba_capture
SQL> /
?
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?STATUS? ? ? ? ? ?ERROR_MESSAGE
------------------------------------------------------------ ---------------- --------------------------------------------------
PROPAG_STRM01_TO_STRM02? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ENABLED
CAPTURE_STREAM01_TO_STREAM02? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ENABLED
?
SQL>
?
--在destination数据库:
? 1*? SELECT apply_name,status,error_message from dba_apply
SQL> /
?
APPLY_NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?STATUS? ? ? ? ? ?ERROR_MESSAGE
------------------------------------------------------------ ---------------- ----------------------------------------
APPLY_STRM01_TO_STRM02? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ENABLED
以上均为enable说明各个进程正常;
如果为disable,需要用dbms_capture_adm.start_capture/DBMS_PROPAGATION_ADM.start_propagation/dbms_apply_adm.start_apply包来进行启动;
如果是abort,说明是异常终止,需要查对应的error message,排除错误后启动。
案例一:
upstream的apply进程和capture进程都正常,但是无法同步,查dba_propagation,发现异常:
? 1* select propagation_name,status,ERROR_MESSAGE from dba_propagation
SQL>
PROPAGATION_NAME? ? ? ? ? ? ? ? ? ? ?STATUS? ? ? ? ? ? ? ? ERROR_MESSAGE
-----------------------------? ? ? --------------------- -----------------------------------------
PROPAG_STRM01_TO_STRM02? ? ? ? ? ? ? DISABLED? ? ? ? ? ? ?ORA-12541: TNS:no listener
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ORA-12541: TNS:no listener
进一步查alertlog中发现:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
ORA-12541: TNS:no listener
ORA-12541: TNS:no listener
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) disabled due to 16 consecutive errors.
Sun Jul 17 06:01:46 2011
Error 12541 received logging on to the standby
Check whether the listener is up and running.
Sun Jul 17 06:01:46 2011
Errors in file /oracle/app/oracle/admin/stream01/bdump/stream01_arc1_21844.trc:
ORA-12541: TNS:no listener
PING[ARC1]: Heartbeat failed to connect to standby 'stream02'. Error is 12541.
Sun Jul 17 06:06:46 2011
确实看到了问题存在。我们进一步看:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) encountered following error:
Propagation Schedule for (STRMADMIN.STREAMS_QUEUE, STREAM02.REGRESS.RDBMS.DEV.US.ORACLE.COM) disabled due to 16 consecutive errors.
[oracle@stream1 bdump]$
我们看到,propagation进程如果尝试连接,发现没有侦听,尝试16次之后,会自动disable propagation进程。
因此我们要做的就是启动侦听,再启动propagation进程。
? 2? DBMS_PROPAGATION_ADM.START_PROPAGATION(
? 3? propagation_name => 'propag_strm01_to_strm02');
? 4? END;
? 5? /
?
PL/SQL procedure successfully completed.
?
SQL>? select propagation_name,,status,ERROR_MESSAGE from dba_propagation;
?
PROPAGATION_NAME? ? ? ? ? ? ? STATUS? ? ? ? ? ?ERROR_MESSAGE
---------------------------? ----------------? -----------------------------
PROPAG_STRM01_TO_STRM02? ? ? ?ENABLED
?
?
?
SQL>
2. 对于downstream,由于没有propagation进程,我们可以直接看apply和capture进程的情况:
? 2? union all
? 3? select CAPTURE_NAME,status,ERROR_MESSAGE from dba_capture
? 4? union all
? 5? SELECT apply_name,status,error_message from dba_apply
? 6? /
?
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?STATUS? ? ? ? ? ?ERROR_MESSAGE
------------------------------------------------------------ ---------------- ----------------------------------------
DOWNSTREAM_CAPTURE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ENABLED
DOWNSTREAM_APPLY? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ABORTED? ? ? ? ? ORA-26714: User error encountered while
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?applying
?
?
SQL>
在这个案例中,我们看到apply进程出现了问题,问题是ora-26174。进一步:
26714, 00000, "User error encountered while applying"
// *Cause:? An error was encountered while applying.
// *Action:? Query the dba_apply_error view to determine the error and
//? ? ? ? ? ?take the appropriate action.
[oracle@stream2 ~]$
好,我们进一步来看dba_apply_error:
? 1* select APPLY_NAME,LOCAL_TRANSACTION_ID,SOURCE_COMMIT_SCN,MESSAGE_NUMBER,ERROR_MESSAGE from dba_apply_error
SQL> /
?
APPLY_NAME? ? ? ? ? ?LOCAL_TRAN SOURCE_COMMIT_SCN MESSAGE_NUMBER ERROR_MESSAGE
-------------------- ---------- ----------------- -------------- ------------------------------------------------------------
DOWNSTREAM_APPLY? ? ?9.44.280? ? ? ? ? ? ? 695025? ? ? ? ? ? ? 2 ORA-26687: no instantiation SCN provided for ""."" in source
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?database "STREAM01.REGRESS.RDBMS.DEV.US.ORACLE.COM"
?
?
SQL>
我们看到是downstream site库的是实例化没有成功,我们重新在source库做一次实例化,相关的包可以参见这里:
? 2? iscn? NUMBER;
? 3? BEGIN
? 4? iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
? 5? DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN(
? 6? source_schema_name => 'hjm',
? 7? source_database_name => 'stream02',
? 8? instantiation_scn => iscn,
? 9? recursive? => true);
?10? END;
?11? /
?
PL/SQL procedure successfully completed.
?
SQL>
然后重启apply进程:
?
PL/SQL procedure successfully completed.
?
SQL> exec dbms_apply_adm.start_apply(apply_name => 'DOWNSTREAM_APPLY');
?
PL/SQL procedure successfully completed.
检查进程情况,已经恢复正常:
? 2? union all? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 3? select CAPTURE_NAME,status,ERROR_MESSAGE from dba_capture? ? ? ? ? ? ? ? ? ? ?
? 4? union all? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
SELECT apply_name,status,error_message from dba_apply? ? ? ? ? ? ? ? ? ? ? ? ?
? 5? ? 6?
SQL> /
?
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?STATUS? ? ? ? ? ?ERROR_MESSAGE
------------------------------------------------------------ ---------------- ------------------------------------------------------------
DOWNSTREAM_CAPTURE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ENABLED
DOWNSTREAM_APPLY? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ENABLED
?
SQL>