就我所知 Oracle 的 streams 或者 Quest 的 shareplex 之类的工具。
是分析 Oracle 得 redolog 来找到数据库最近执行的 sql 语句,在响应到
目标复制数据库的。但是有这么几个问题我不知道,这些工具是如何解决的。问题:
1 如果在没有打开 suppliment loggin 的情况下 Oracle 的 redolog 的
update SQL语句是只纪录 ROWID 条件的。如果这句 SQL 语句到目标复制数
据库上当然会无效,我看 Quest 好像说不强制要求打开 suppliment loggin。
这是怎么回事?2   如果遇到 rollback 所产生的 SQL 语句,Oracle 得 redolog 是肯定只纪录
rowid 条件的(无论有没有打开 suppliment loggin),把这句 SQL 放至目
标复制数据库,也应该是无效的。望知道者赐教,这里先谢过。

解决方案 »

  1.   

    直接使用oracle的高级复制功能,不需要借助于第三方工具。
    可以在console中找到这两种方式
      

  2.   


    我并不是想知道怎么用 oracle 得复制,只是想知道他们实现的原理。
    oracle 自己的也好,第三方的也好。可能我对问题的阐述不够明确,我来举例说明吧 有 test1 表结构如下
        SQL> desc test1;
        名称      是否为空?   类型
        ------- ---------- --------
        ID                 NUMBER
        STR                VARCHAR2(20)    执行的 SQL 语句
        SQL> insert into test1 (id, str) values(1, 'test1');
        SQL> rollback;如此这样后用 LogMnr 分析 redolog 后得知响应得日志为SCN      CSCN    ROLLBACK  SQL_REDO
    -------  ------- --------- ------------------------
    244437   244439  0         insert into "SYSTEM"."TEST1"("ID","STR") values ('1','test1');
    244438   244439  1         delete from "SYSTEM"."TEST1" where ROWID = 'AAAHrhAABAAAIRvAAA';
    244439   244439  0         rollback;由此可见其实 rollback 是会产生一个相应的反操作 sql 语句的。然而这个 sql 语句只
    可能纪录 rowid 条件(无论开不开 supplement logging)。那样的话如何将这句相应至
    目标数据库,那里的 rowid 因该肯定不一样的。quest 的那个一点也摸不到边,不知道他是怎么干的。oralce 的 streams 因为他要设一个
    队列,所以怀疑,队列中回滚得 SQL 语句撤销的。但这好像又有问题了,如果队列太小,回滚太多
    是不是两边数据就不一致了?
    (注:以上的测试环境为 Win2000 Server SP4, Oracle 9.0 和 Linux 2.4.18, Oracle 9.2)