设为首页 收藏本站
查看: 692|回复: 0

[经验分享] 创建增量同步Oracle物化视图问题

[复制链接]

尚未签到

发表于 2016-7-26 10:03:19 | 显示全部楼层 |阅读模式
  我们采用Oracle的物化视图增量刷新机制定时将数据库A上的某个表的数据同步到另一个数据库B上。

我们常用的最简单的实现步骤是这样。首先在数据库A上确认该表有主键,然后建立在这个表上建立物化视图日志如“CREATE MATERIALIZED VIEW LOG ON T_tablename;”,再到数据库B上创建数据库链接和快速刷新的物化视图如“create materialized view mv_tablename refresh fast on demand start with sysdate next sysdate+1/288 as select * from T_tablename@dblink_name;”。

现在,数据库A上此表的主键约束因主键字段值重复而被disable了,在第三个数据库C上新建这个物化视图却失败,说:“ORA-12014: 表 'T_MV_TEST' 不包含主键约束条件”。如果将此表的主键增加字段并ENABLE后操作,又说:“ORA-23412: 主表的主键列已更改”。

但有一个奇怪的现象:在数据库B上我们也建立过物化视图,它却在此表的主键disable之后,还是正常运行。
  
  (miki西游 @mikixiyou 原文链接: http://mikixiyou.iyunv.com/blog/1753779
)


我们介绍一下在数据库B上的创建物化视图的操作过程。

首先,介绍环境。

数据库A和数据库B的版本为Oracle 10.2.0.4 for linux x86 64bit。

在数据库A上同步的表的结构如下:

create table T_MV_TEST
(
A DATE,
B DATE,
C DATE
);
alter table T_MV_TEST
add constraint PK_T_MV_TEST primary key (A,B);
  

这是一个测试表,很简单的3个字段。

接着,创建物化视图日志

在数据库A上创建这个表的物化视图日志,我们使用的创建方法是最简洁的,如下:

CREATE MATERIALIZED VIEW LOG ON T_MV_TEST;
  

这将在表T_MV_TEST上创建一个触发器和一个日志表MLOG$_T_MV_TEST。

它和CREATE MATERIALIZED VIEW LOG ON T_MV_TEST WITH PRIMARY KEY;的效果是一样的,是省略掉WITH PRIMARY KEY的操作。

但是这个日志表只能捕获到主键字段的删除和增加操作,如果非主键字段值发生改变,则不会同步过去。这是这个简易方法的局限性。

最后,创建物化视图

在数据库B上创建定时增量更新的物化视图,方法如下:

create materialized view t_mv_test
refresh fast on demand
start with sysdate next sysdate+1/288
as
select * from t_mv_test@dblink_name;
  

这是增量更新机制的物化视图的最简单的创建方法,将每5分钟检查数据库A上此表的主键字段的删除和插入操作而将变化的记录同步到另一个数据库B中。

这个过程同样也省略掉了with primary key关键字,它也是默认值。

create materialized view t_mv_test
refresh fast on demand
start with sysdate next sysdate+1/288 with primary key --默认值
as
select * from t_mv_test@dblink_name;
  


我们再分析一下物化视图的机制。

在数据库B中创建的物化视图对应的表是有主键的,其主键和数据库A上这个表的主键一致。因此在创建物化视图时,要检查数据库A上的表是不是也有主键,主键是不是启用的。

在数据库A上此表的主键disable之后,数据库B上该主键还是enable的。同步过程中,只要主库上的原主键字段值不重复,同步会照常运行。即使主键字段值因主键约束disable之后而重复,也不会因此同步到数据库B中的。

这种简易的增量同步的物化视图创建方法,只能同步记录的插入和删除及主键字段的修改操作,至于其他字段的修改操作无法同步,甚至修改的先后顺序也不能正确同步。


因此,我们需要一种更加规范的物化视图创建方法。

1、在物化视图日志创建时,这样操作:

CREATE MATERIALIZED VIEW LOG ON T_MV_TEST WITH SEQUENCE, ROWID (A,B,C)  INCLUDING NEW VALUES;
  

使用rowid,sequence捕获数据变化情况。如果在数据库B上需要使用with primary key方式创建物化视图,那么这里需要将primary key的值也捕获到。

CREATE MATERIALIZED VIEW LOG ON T_MV_TEST WITH PRIMARY KEY,SEQUENCE, ROWID (C)  INCLUDING NEW VALUES;
  

注意:加上including new values子句,是为了记录数据修改前的值。

2、在物化视图创建时,这样操作:

create materialized view t_mv_test
refresh fast on demand
start with sysdate next sysdate+1/288 with rowid
as
select * from t_mv_test@dblink_name;
  

这样,不管数据库A上的此表的主键如何变化,我一概不管。但是,有时必须要使用with primary key,例如跨库跨平台时。

物化视图对应的表上没有主键,如果需要索引可以另行添加。
  
  最后小结一下,这个文档借这个小问题分析一下物化视图运行机制,整理出更符合生产运行的物化视图创建规范。
  
  
有一篇文档可以参考一下:http://www.skill-guru.com/blog/2010/01/03/understanding-materialized-view-in-oracle/
这个文档有助于你理解Oracle的物化视图。

  
  附录一份时文,提醒自己。
  12月24日上午9时左右,江西贵溪滨江乡洪塘村合盘石童家村小组一面包车侧翻坠入水塘,事发时该7座面包车上载有17人,致11名儿童死亡。12月24日晚23时,江西贵溪市政府公布儿童伤亡名单,年龄最大的儿童为6岁,最小的仅4岁。据悉,校车司机就是幼儿园长彭春娥。其为节省成本,只能让十几个孩子挤在一辆车上。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249527-1-1.html 上篇帖子: oracle行转列的应用 下篇帖子: 如何查看Oracle的用户权限
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表