抱歉啊,因为没有一个与厂商无关的独立“数据库基础区”,所以只好在DB2和Oracle区都问一下啊问题:如何提取数据库更改的元操作?问题描述:
这里的“元操作”说法可能不准确,对数据库进行更改操作的时产生的结果,实际可以用一组等效而无歧义的SQL序列来表示,我看到的文章说在Oracle的日志中,更改操作是被存储为这样一组等效操作的。现在问的就是可不可以提取这一组元操作序列,因为生成日志的时候一定是提取元操作的。问题背景:
现要建立一个完全复制型多数据库,即多个数据库节点的模式和内容完全一致。需要把任何一个数据库节点发生的更改传播到所有其他节点。
我的方案设想:
在每个节点提取数据库更改的“元操作”——一组SQL语句,再作为消息传递到其他节点执行。
如果是读取日志的话,因为各个厂商日志格式不同,甚至读取日志也要专用程序,读取日志方法很可能不通用。
这里不用简单的触发器来传播更改是因为如果数据库节点的数量和位置不定,就要对触发器进行频繁改写。罗嗦了这么多,希望把问题完全说清了!

解决方案 »

  1.   

    这个要看你的其他节点的需求了,如果仅仅是作为一个副本,用于发生故障时切换的话,那么physical standby database可以满足你的要求.当然了,sql apply(logical standby database)就是你所说的到其他节点, 但是这两种都是作为主库的副本存在,只不过logical standby database现在稳定性不是在好.以上都是基于库的.stream也是基于日志的,可以基于schema,objects或者database,比较灵活,不过配置起来需要动较多的动作,相对standby database复杂一点.
      

  2.   

    谢谢1楼的回复,但是那不是我问的问题啊,现在就是要建复制型数据库(replicated database),没有哪个库是主要或者次要的,他们完全是地位等同的。而我要把任一个库的改变应用到所有别的库(这些库的数量和位置可能还会改变),就是这些
      

  3.   

    oracle级别的话,那就考虑使用stream吧.
      

  4.   

    不知道应用是如何设计的。RAC+dg也能达到目的。
      

  5.   

    谢谢liuyi8903,你说的stream确实可以提供我需要的功能,解析归档日志是一个解决办法。但是它有没有提供的API可以让我对stream的目的地进行编程?因为这个更新的过程是频繁而且不定期的
      

  6.   

    stream有两种执行方式,看你用那种了。
    过程dbms_streams_adm.pre_instantiation_setup中是要你指定源和目的地的.
      

  7.   

    谢谢,这个看起来确实是我要的功能,但是弱弱的问一下,我能从外部调用stream吗,比如在Java中,参数也可以传的吧
      

  8.   

    ....楼主说的意思是什么呢?是要通过java来实现部署stream?