`
mikixiyou
  • 浏览: 1086068 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:349344
社区版块
存档分类
最新评论

创建增量同步Oracle物化视图问题

阅读更多

我们采用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.iteye.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 楼 Simon.Ezer 2016-04-12  
请问对于“如果非主键字段值发生改变,则不会同步过去”这种情况,有没有什么解决方案?

相关推荐

    Oracle物化视图增量刷新的应用研究.pdf

    Oracle物化视图增量刷新的应用研究.pdf

    Oracle数据库中物化视图的原理剖析

    在 10g 中,新的 DBMS_ADVISOR 程序包中的一个名为 TUNE_MVIEW 的过程使得这项工作变得非常容易:您利用 IN 参数来调用程序包,这构造了物化视图创建脚本的全部内容。该过程创建一个顾问程序任务 (Advisor Task),它...

    基于物化视图的Oracle增量备份方法的实现.pdf

    基于物化视图的Oracle增量备份方法的实现.pdf

    阿里巴巴开源的Oracle数据迁移同步工具yugong.zip

    整个数据迁移过程,分为两部分:全量迁移增量迁移过程描述:增量数据收集 (创建oracle表的增量物化视图)进行全量复制进行增量复制 (可并行进行数据校验)原库停写,切到新库架构说明: 一个Jvm Container对应多个...

    yugong:阿里巴巴去Oracle数据迁移同步工具(全量+增量,目标支持MySQLDRDS)

    yugong译意: 愚公移山语言: 纯java开发定位: 数据库迁移 (目前主要支持oracle / mysql / DRDS)项目介绍整个数据迁移过程,分为两部分:全量迁移增量迁移过程描述:增量数据收集 (创建oracle表的增量物化视图)进行...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    说明:Oracle中需要创建用户一定是要具有dba(数据库管理员)权限的用户才能创建,而且创建的新用户不具备任何权限,连登录都不可以。 用法:create user 新用户名 identified by 密码 例子: 2. 修改密码 说明:...

    oracle cdc教程

    主要的 ETL 方案,一种是我们熟悉的物化视图(materialized view),另一种就是本文将要 介绍的 CDC 组件(Change Data Capture 改变数据捕获)。 CDC 特性是在 Oracle9i 数据库中引入的。CDC 能够帮助你识别从上次提取...

    深入解析Oracle.DBA入门进阶与诊断案例

    10.5 使用物化视图进行翻页性能调整 514 10.5.1 系统环境 514 10.5.2 问题描述 514 10.5.3 捕获排序SQL语句 515 10.5.4 确定典型问题SQL 515 10.5.5 选择解决办法 517 10.5.6 进一步的调整优化 518 ...

    Oracle数据库实验操作

    第一部分sql基础 9 基本查询语句 9 实验1:书写一个最简单的sql语句,查询一张表的所有行和所有列 9 ...实验161:物化视图的建立 253 实验162:查询重写 255 实验163:最后的sql优化办法,使用hints

    yugong:数据迁移工具

    背景 08年左右,阿里巴巴开始尝试MySQL的相关...增量数据收集 (创建oracle表的增量物化视图) 进行全量复制 进行增量复制 (可并行进行数据校验) 原库停写,切到新库 架构 {width="584" height="206"} 说明:  一个Jvm Co

    oracle详解

    ·有一些对象,如物化视图,基于函数的索引等不能被传输 可以用以下的方法来检测一个表空间或一套表空间是否符合传输标准: exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true); select * from sys....

Global site tag (gtag.js) - Google Analytics