今日早上, 在网上看到一篇贴子, 问了如下两个问题:

数据仓库中有2007年之前的数据

问题一:
如何保持erp与数据仓库中2007年数据一致而数据仓库中2007年之前数据不变(以前通过dbms_mview.refresh('xxx','fast'))?

问题二:
我对x物化视图做了一个全部刷新,但是x物化视图中的数据全部变成2007年的数据,以前数据丢失?如阿恢复到刷新前的状态

    其中第一个问题是个难题, 现在很多公司都在想这样的一个解决方案, 其实就是一个实时复制方案, 从在的角度来说, 这方面可以用的方案有: 1, Quest公司的SharePlex; 2, DSG公司的RealSync(没有一点印象); 3, Oracle公司的Stream. 前两者都是比较贵的解决方案, Oracle的Stream懂的人少, 而且在9i中还不够稳定. 物化视图并不适合用来归档生产库的数据到历史库, 原来就象第二点所说的那样, 如果进行全部刷新, Oracle会先在目标数据库上运行一个DELETE命令来删除所有的数据(你可以SQL_TRACE一把), 估计这位老兄也是查了资料或翻了贴子后, 觉得物化视图可以做到这一点, 所以这样做了一把, 结果就是数据被删除了.

    最近我也一直在想这样的一个解决的方法, 在物化视图中, 用物化视图日志来捕获对表的变更, 是一个比较好的方法(对于负荷不是很高的数据库), 完全可以利用这一点, 自已编程来实现和物化视图刷新这样的功能, 最近我写的refresh_mysql角本就是用来做这个的. 当然当初考虑的是从Oracle中将数据比较实时地同步到MySQL或其他数据库中, 从角本的名字也可以猜出来. 但后来发现数据源也未必一定要是Oracle了, 其他的库可以用触发器来实现Oracle中的物化视图日志的功能, 目标数据也可以是Oracle.

    如何高效地维护一个表的逻辑拷贝, 其实是一个比较难的问题, 象SharePlex是Quest公司的最主要的拳头产品.