大家好:
   最近开发一个项目,偏向数据收集类的,数据量大概在百万/天,可以理解为表对表的拷贝。
   举个例子:DA.Table1 到 DB.Table1,A、B表结构一样,正常增量情况下,两库的数据会一致。
   但当DA删除DB已有的数据时候,这时候就出现无法保持一致的问题。
   想到一些办法,但都有利由有弊
   1)采用触发器,在DA每张表里创建删除触发器,记录删除的数据,再通过程序去将DB里面相同的数据删除。这种是最直接但可靠性比较低
   2) 采用日志归档或者闪回规则,这相对来说比价可靠,但感觉有点大才小用
   3) 欢迎大家补充、拍砖
    
   Oracle数据一致

解决方案 »

  1.   

    这个物化视图或者oracle的cdc都有考虑过,但公司内部此前有考虑过这些,也不是很可靠
      

  2.   

       但当DA删除DB已有的数据时候,这时候就出现无法保持一致的问题。
    --这句话我不是太理解
      

  3.   


    是这个意思:A库里面的表1里面有1000条数据,在10点10分的时候已经同步到了B库的表1。
    在10点20的时候,A库的表1又新增了1000条,程序会从10点10分之后获取数据,也就是获取继续是1000条,如果10点10分到20分期间,删除了10点10分中的100条,也就是10点10分之前库A只有900条,而库B却还是有1000条。
      

  4.   

    用物化视图,刷新组,job一起来处理
      

  5.   

    你可以在操作库中再新建一张表。这张表是记录当前日期下的所有操作包括更新、删除、添加。当你的B库要更新数据的时候你只要取在A库中的相应记录就可以了。
    新建表你可以要这些字段:A表中的ID ,操作类型,操作时间
    当表中的操作类型为Delete时直接删除就OK了。
      

  6.   

    其实关键还是看你的B库的意义,是作为故障切换机器,还是只是简单对数据做备份。另外,要考虑实时性的要求,若对实时性要求高,而且又是作为热备机器的话,建议还是搭建DG,最安全最保险。如果只是简单对数据做备份,可以有很多种方式,比如可以直接通过DBLINK建表做调度,直接通过COPY命令同步表,都是比较快速直接的方案等
      

  7.   

     这不全是主库和备库的关系,B库是大库,收集A C D..等所有这些库的数据(ABCD表结构一样) 
      

  8.   


    如果都是百万级的数据量,那其实建立DBLINK,写一个通用的数据同步程序(drop...create...),定时调度就可以了。只要不是上亿的数据量,效率应该都可以接受。
      

  9.   

    看来这个问题让多少吊死程序员头痛不已啊~
    我一直觉得这是最初设计时系统架构的问题,在设计时就要明确区分当前信息记录表和历史信息记录表,当前信息的量相对小一些,表中可以用时间戳,或者可用性FLAG等来标注,没用的记录可以不用删除,加个状态栏位,没用的数据多久之后定时PURGE掉,保证同步时方便,历史信息记录表就是不能删除,干嘛要删除,任何增删改都必须有犯罪记录。这样我可以拍着胸脯说只要给我时间,我可以把数据还原到任何你想要的时间点去。其实就是ORACLE中REDO LOG的做法,但我们只需要从公司业务逻辑角度来保存重要业务数据。
      

  10.   


    你太想当然了...需求是业务决定的 而不是系统技术框架决定的
    恕我孤陋寡闻,你说的是对的,各行各业业务模型千差万别。最近刚巧看到oracle的oracle data integrator这个产品,花大力气做肯定是因为有市场。不过就你提出的问题,我几年前碰到类似的,但没有这么数据量大,当时基本也是你列出的这两种方案,trigger没有用是因为一旦trigger发生问题会导致主数据库的操作受影响,所以没有采用,后者公司觉得没能力也没钱,最终还是采用投机取巧的办法,通过业务的制约关系来处理数据。
    oracle的另一个产品干的就是这个事儿,基于log的,如果oracle基础产品能内嵌一个迷你版就完美了-----〉GoldenGate TDM(交易数据管理)软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步、双活。GoldenGate TDM 软件可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制。