Streams的技术和Logical Standby在本质上是一样的,都是通过logminer技术从redo中解析出sql语句,然后通过一系列的进程将这些sql重新在目标库中应用,从而在目标库产生源库数据的一个拷贝。而Oracle10gR2中的logical standby,从配置上来说,要比streams更加简单可靠。所以,从全库复制的角度来讲,可能logical standby要比streams更有优势。但是Streams也有自己的特点,就是支持到异构数据源的复制,也可以做到只复制特定的某些数据,灵活性比logical standby要高得多。
本系列前面一些文章已经分别演示了全库复制,表空间复制和用户级复制,本文将演示表复制的配置。
源库:ning.test
目标库:dest.test
要复制的表:ning.test
复制方式:单向,downstream异地捕获日志
这里采用impdb可以通过网络直接导入数据的特性来实现表数据的初始化,所以不需要配置directory。
一、创建测试表
Table created.
要复制的表在目标库中不能已经存在。
二、传送源库日志到目标库
三、在目标库执行maintain_tables
2 tables DBMS_UTILITY.UNCL_ARRAY;
3 BEGIN
4 tables(1) := 'ning.test';
5 DBMS_STREAMS_ADM.MAINTAIN_TABLES(
6 table_names => tables,
7 source_directory_object => NULL,
8 destination_directory_object => NULL,
9 source_database => 'ning.test',
10 destination_database => 'dest.test',
11 perform_actions => true,
12 bi_directional => false,
13 include_ddl => true,
14 instantiation => DBMS_STREAMS_ADM.INSTANTIATION_TABLE_NETWORK);
15 END;
16 /
PL/SQL procedure successfully completed.
四、验证复制是否成功
在源库上插入测试数据
1 row created.
STRMADM@ning>commit;
Commit complete.
归档当前日志
System altered.
稍等片刻在目标库查询
I
----------
1
发现复制已经正常。如果等了足够长的时间发现数据没有复制过来,仔细检查了capture/propagation/apply各进程的状态都是正常的,这种现象我在使用maintain_tts/maintain_schemas/maintain_tables试验表空间复制/用户复制/表复制的时候都遇到过。所有的东西看起来都是正常的,但是数据就是过不去。后来开了个tar问oracle,经过一个星期的折腾,最后oracle给的答复是修改一个隐含参数:
并且将aq_tm_processes参数改为1(我原来这是为10)
改完后重启,发现数据就可以过去了。这个隐含参数只是控制对job队列的检查频率,默认5秒。复制正常后我再将这个参数改回默认值,重新配置streams复制也一切正常了。。。
为什么我执行maintain_tables后没有实现自动实例化,测试表没有导到目标中,后来我手动实例化才成功的。为什么没有自动实现?
谢谢
两边的db link都确认配通了么?
另外,可以通过Note 273674.1提供的脚本来获得更具体的错误信息
错误信息
ORA-24035: AQ agent is not a subscriber for queue STRMADMIN.DBSOURCE$CAPQ
NinGoo
我在配置表的单向复制时很顺利就配置好了,
但配置表的双向复制时一直不成功,
按你的说法只需要把bi_directional配置成true就可以了
是不是这其中有其他的东西要配置?
附上我配置配置表双向复制的语句
begin
dbms_streams_adm.maintain_tables(
table_names => ’scott.test’,
source_directory_object => null,
destination_directory_object => null,
source_database => ’source.com’,
destination_database => ‘dest.com’,
perform_actions => true,
bi_directional => true,
include_ddl => true,
instantiation => dbms_streams_adm.instantiation_table_network);
end;
Test 2nd comment.
双向复制只需要将配置过程的bi_directional参数设置成TRUE就行,当然还需要考虑冲突解决方案。《Oracle10gR2 Streams(三)全库复制之一》就是配置的双向复制。
灾难恢复我还需要再试验试验啦,也刚开始研究这个东西,还不是太熟悉的^_^
Streams采用的是logminer技术,如果要用内部触发器,可以考虑同步CDC,这是用触发器实现的。同步CDC我这里也有篇文章《关于Change Data Capture(二)》
第一次留言需要审核,垃圾留言太多了,没办法,呵呵。