Oracle10gR2 Streams(八)表复制
NinGoo's blog

Oracle10gR2 Streams(八)表复制

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。

一、创建测试表

STRMADM@ning>create table ning.test( i int);

Table created.

要复制的表在目标库中不能已经存在。

二、传送源库日志到目标库

alter system set log_archive_dest_2=’service=dest arch noregister’;

三、在目标库执行maintain_tables

STRMADM@dest>DECLARE
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.

四、验证复制是否成功

在源库上插入测试数据

STRMADM@ning> insert into ning.test values(1);

1 row created.

STRMADM@ning>commit;

Commit complete.

归档当前日志

STRMADM@ning>alter system archive log current;

System altered.

稍等片刻在目标库查询

STRMADM@dest>select * from ning.test;

I
———-
1

发现复制已经正常。如果等了足够长的时间发现数据没有复制过来,仔细检查了capture/propagation/apply各进程的状态都是正常的,这种现象我在使用maintain_tts/maintain_schemas/maintain_tables试验表空间复制/用户复制/表复制的时候都遇到过。所有的东西看起来都是正常的,但是数据就是过不去。后来开了个tar问oracle,经过一个星期的折腾,最后oracle给的答复是修改一个隐含参数:

alter system set “_job_queue_interval”=1 scope=spfile;

并且将aq_tm_processes参数改为1(我原来这是为10)

alter system set aq_tm_processes=1;

改完后重启,发现数据就可以过去了。这个隐含参数只是控制对job队列的检查频率,默认5秒。复制正常后我再将这个参数改回默认值,重新配置streams复制也一切正常了。。。

本文网址:http://www.ningoo.net/html/2007/oracle10gr2_streams_table_replicationhtml.html

订阅到Google | 收藏到Del.icio.us | 推荐到鲜果

上一篇: 下一篇:
相关文章 随机文章

本文Tags: ,

7 条评论

  • At 2007.12.18 16:56, NinGoo said:

    双向复制只需要将配置过程的bi_directional参数设置成TRUE就行,当然还需要考虑冲突解决方案。《Oracle10gR2 Streams(三)全库复制之一》就是配置的双向复制。

    灾难恢复我还需要再试验试验啦,也刚开始研究这个东西,还不是太熟悉的^_^

    Streams采用的是logminer技术,如果要用内部触发器,可以考虑同步CDC,这是用触发器实现的。同步CDC我这里也有篇文章《关于Change Data Capture(二)

    第一次留言需要审核,垃圾留言太多了,没办法,呵呵。

    • At 2007.12.19 05:08, 木匠Charlie said:

      Test 2nd comment.

      • At 2008.05.02 17:58, rakit said:

        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;

        • At 2008.05.02 20:42, NinGoo said:

          两边的db link都确认配通了么?

          另外,可以通过Note 273674.1提供的脚本来获得更具体的错误信息

        • At 2008.05.02 18:47, rakit said:

          错误信息
          ORA-24035: AQ agent is not a subscriber for queue STRMADMIN.DBSOURCE$CAPQ

          • At 2008.08.28 09:50, lee said:

            为什么我执行maintain_tables后没有实现自动实例化,测试表没有导到目标中,后来我手动实例化才成功的。为什么没有自动实现?
            谢谢

            • At 2010.05.26 11:48, 忧郁猫 said:

              我发现一个问题,我的oracle版本为10.2.0.4 for windows 32bit
              在实施表复制的时候,如果只指定一张表,能成功,如果用DBMS_UTILITY.UNCL_ARRAY指定多张表就失败,capture/propagation/apply进程都正常,甚至都能看到capture都已经捕获到记录,但目标表一直没有发现变化。


              (Required)
              (Required, will not be published)