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

创建增量同步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 物化视图增量刷新的应用研究" Oracle 物化视图是 Oracle 公司提供的一种新技术,可以解决很多普通逻辑视图无法完成的功能。物化视图操作简单,支持增量刷新及全量刷新,可以支持复杂的表连接、聚合函数等...

    oracle物化视图_循序渐进学习笔记

    总之,Oracle物化视图是一种强大的工具,能够提升查询效率和数据同步速度。通过理解其基本概念、应用场景和管理策略,我们可以更有效地利用物化视图优化数据库性能,尤其是在大型数据仓库和分布式系统中。学习和掌握...

    SQL 优化之 oracle物化视图

    Oracle 物化视图 Oracle 物化视图是数据库对象,存储远程表的数据副本,也可以称为快照。物化视图可以查询表、视图和其他物化视图。通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。 创建...

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

    在Oracle 10g中,DBMS_ADVISOR程序包的TUNE_MVIEW过程简化了物化视图的优化过程,帮助自动创建必要的支持结构。 例如,创建一个物化视图如以下所示: ```sql create materialized view mv_hotel_resv refresh fast...

    Oracle物化视图使用[文].pdf

    Oracle物化视图是数据库管理系统中的一个重要特性,尤其在处理大量数据和复杂查询的场景下,它可以极大地提升查询性能和数据一致性。物化视图与普通的视图不同,后者是逻辑上的虚表,其内容在查询时动态计算,而物化...

    基于Oracle物化视图日志的数据同步技术研究.pdf

    总之,Oracle物化视图日志为解决分布式系统中的数据同步问题提供了一种有效且实用的方法。通过深入理解和应用这一技术,开发者可以构建出更加稳定、高效的数据同步架构,满足现代企业对数据实时性和一致性的高要求。

    ORACLE 物化视图 详解

    创建主键物化视图时,Oracle会使用主键来唯一标识记录,从而支持增量刷新。 - **示例**: ```sql CREATE MATERIALIZED VIEW mv_emp_pk REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/48 WITH PRIMARY ...

    物化视图的快速刷新

    FAST 刷新方式采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。FORCE 方式会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。 快速刷新是物化视图...

    oracle的物化视图

    Oracle的物化视图是一种数据库对象,它存储了查询结果,从而提供了一种高效的数据访问方式。物化视图的主要目标是提升查询性能,尤其是在处理复杂查询、连接操作或聚合计算时。它们在数据仓库环境中尤其有用,因为...

    oracle物化视图

    Oracle物化视图是数据库管理系统Oracle中的一种高级特性,它为用户提供了一种高效的数据管理和查询优化手段。物化视图的出现,主要是为了解决复杂查询的性能问题以及实现数据的分布式管理。从早期的快照概念到9i版本...

    Oracle物化视图使用详解

    Oracle物化视图是Oracle数据库系统中一种强大的性能优化工具,它允许用户预先计算和存储复杂的查询结果,以便后续的查询能快速获取数据。物化视图是数据库中实际存储的表,其内容反映了某个查询在创建时的结果,而...

    ORACLE中的物化视图

    ### ORACLE中的物化视图详解 物化视图,作为ORACLE数据库中的一种特殊对象,其实质上是预先计算并存储的查询结果集。它不仅能够提高查询效率,还能在分布式环境中提供本地数据副本,简化远程数据访问,以及在数据...

    物化视图的两种实现

    在使用物化视图时,还需要注意一些问题。首先,物化视图会占用额外的存储空间,因此需要考虑数据库的整体容量规划。其次,物化视图的维护可能会增加数据库的复杂性,特别是当有多个物化视图或复杂的更新逻辑时。最后...

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

    【Oracle物化视图】:Oracle物化视图是一种预计算的数据存储结构,它存储了查询结果集,类似于数据库中的一个快照。物化视图可以用来提高查询性能,特别是当查询涉及复杂联接、聚合操作或者从远程数据库中获取数据时...

    Oracle中管理物化视图变得更加容易

    在Oracle数据库中,物化视图(Materialized View, MV)是一种重要的性能优化工具,尤其在数据仓库和决策支持系统中。物化视图预先计算并存储了一个查询的结果,允许快速访问而不是每次需要时重新执行复杂的查询。在...

    OCM考试实验笔记之一_物化视图.pdf

    在Oracle数据库中,物化视图可以通过`CREATE MATERIALIZED VIEW`语句创建,并可以选择性地配置为立即刷新或定时刷新。 1. 创建物化视图时,可以指定`BUILD IMMEDIATE`选项来立即构建物化视图,这样当基础数据表发生...

    Oracle2Oracle数据同步

    对于简单的同步任务,数据库链接和物化视图可能是首选;而对于复杂、高可用性需求的环境,GoldenGate或第三方工具可能更合适。 在进行数据同步时,还需要注意以下几点: - **数据一致性**:确保在同步过程中不会...

Global site tag (gtag.js) - Google Analytics