物化视图刷新结合ADG的尝试

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 之前写过一篇 物化视图刷新结合ADG的尝试,想必绝大多数的朋友看完再没有深究,其实也有些朋友做了建议,让我尝试prebuilt来做。这种数据迁移方式用的比较少,但是个人感觉还是很不错的。
之前写过一篇 物化视图刷新结合ADG的尝试,想必绝大多数的朋友看完再没有深究,其实也有些朋友做了建议,让我尝试prebuilt来做。这种数据迁移方式用的比较少,但是个人感觉还是很不错的。如果迁移的表不是很多,这种迁移方式还是非常强大的。
如果一个表非常大,我目前的设想就是通过ADG备库来把数据首先同步到统计库中,然后在主库端通过物化视图日志来增量刷新。

使用物化视图 prebuilt的方式确实可以实现,我产生了几个疑问,物化视图日志该什么时候创建。创建的时间太早或者太晚,对于增量刷新是否有影响,如果没有影响,我都幻想着可能是替代ogg的一个神器了。我做了下面三个测试。

###同步测试,物化视图刷新基于rowid       
统计库创建两个db link,一个指向主库,一个指向ADG
主库新增一个表  create table ACCtest20.test_mv_pri as  select * from dba_objects where rownum<1001;   
SQL> select count(*)from ACCtest20.test_mv_pri;
  COUNT(*)
----------
      1000
ADG+统计库创建表基于ADG的db link  
create table test.test_mv_pri as select *from ACCtest20.test_mv_pri@public_test0;
主库增加一条数据
insert into ACCtest20.test_mv_pri(owner,object_id,object_name,object_type) values('test',1000001,'test','TABLE');
commit;
主库修改一条数据
SQL> select object_id from ACCtest20.test_mv_pri where rownum<2;
 OBJECT_ID
----------
        20
update ACCtest20.test_mv_pri set object_id=1000002 where object_id=20;
 commit;
主库创建物化视图日志
create materialized view log on ACCtest20.test_mv_pri with rowid;
主库查询
SQL> select count(*)from ACCtest20.MLOG$_TEST_MV_PRI;
  COUNT(*)
----------
         0
主库+统计库创建物化视图基于主库的db link
create materialized view test.test_mv_pri on prebuilt table refresh fast with rowid as select *from ACCtest20.test_mv_pri@public_test0;
create materialized view test.test_mv_pri on prebuilt table refresh fast with rowid as select *from ACCtest20.test_mv_pri@public_test0
       *
ERROR at line 1:
ORA-12058: materialized view cannot use prebuilt table                                
做到这一步发现已经完全不支持了,所以就放弃了rowid的方式。
继续做第二个测试。

###同步测试    基于主键刷新 物化视图日志在全量同步后创建   
统计库创建两个db link,一个指向主库,一个指向ADG
主库新增一个表 
create table ACCtest20.test_mv_pri as  select owner,object_id,object_name,object_type from all_objects where rownum<1001 and object_id is not null;   
alter table ACCtest20.test_mv_pri modify(object_id primary key);
SQL> select count(*)from ACCtest20.test_mv_pri;
  COUNT(*)
----------
      1000
ADG+统计库创建表基于ADG的db link  
create table test.test_mv_pri as select *from ACCtest20.test_mv_pri@public_test0;
主库增加一条数据
insert into ACCtest20.test_mv_pri(owner,object_id,object_name,object_type) values('test',1000001,'test','TABLE');
  commit;
主库修改一条数据
SQL> select object_id from ACCtest20.test_mv_pri where rownum<2;
 OBJECT_ID
----------
        2
update ACCtest20.test_mv_pri set object_id=1000002 where object_id=2;
commit;
主库创建物化视图日志
 create materialized view log on ACCtest20.test_mv_pri ;
主库查询
 SQL> select count(*)from ACCtest20.MLOG$_TEST_MV_PRI;
  COUNT(*)
----------
         0
SQL> select count(*)from ACCtest20.test_mv_pri ;
  COUNT(*)
----------
      1001         
主库+统计库创建物化视图基于主库的db link
create materialized view test.test_mv_pri on prebuilt table refresh fast as select *from ACCtest20.test_mv_pri@public_test0;                           
查看数据条数
SQL> select count(*)from test.test_mv_pri;
  COUNT(*)
----------
      1000
增量刷新数据,查看数据条数是否完全同步
 exec dbms_mview.refresh('test.test_mv_pri','F');
SQL> select count(*)from test.test_mv_pri;
  COUNT(*)
----------
      1000
所以得到的结论是,在物化视图快速刷新的场景中,在本次测试中,在全量同步数据之后创建物化视图日志,快速刷新可能数据不一致,在全量同步的过程中,任何的dml操作可能都会丢失。

###同步测试    基于主键刷新  物化视图日志在全量同步前创建   
统计库创建两个db link,一个指向主库,一个指向ADG
主库新增一个表 
create table ACCtest20.test_mv_pri as  select owner,object_id,object_name,object_type from all_objects where rownum<1001 and object_id is not null;   
alter table ACCtest20.test_mv_pri modify(object_id primary key);
SQL> select count(*)from ACCtest20.test_mv_pri;
  COUNT(*)
----------
      1000
主库创建物化视图日志
create materialized view log on ACCtest20.test_mv_pri ;      
ADG+统计库创建表基于ADG的db link  
create table test.test_mv_pri as select *from ACCtest20.test_mv_pri@public_test0;
主库增加一条数据
insert into ACCtest20.test_mv_pri(owner,object_id,object_name,object_type) values('test',1000001,'test','TABLE');
commit;
主库修改一条数据
SQL> select object_id from ACCtest20.test_mv_pri where rownum<2;
 OBJECT_ID
----------
        2
update ACCtest20.test_mv_pri set object_id=1000002 where object_id=2;
commit;

主库查询
SQL> select count(*)from ACCtest20.MLOG$_TEST_MV_PRI;
  COUNT(*)
----------
         3
SQL> select count(*)from ACCtest20.test_mv_pri ;
  COUNT(*)
----------
      1001         
主库+统计库创建物化视图基于主库的db link
create materialized view test.test_mv_pri on prebuilt table refresh fast as select *from ACCtest20.test_mv_pri@public_test0;                           
查看数据条数
 SQL> select count(*)from test.test_mv_pri;
  COUNT(*)
----------
      1000
增量刷新数据,查看数据条数是否完全同步
 exec dbms_mview.refresh('test.test_mv_pri','F');
SQL> select count(*)from test.test_mv_pri;
  COUNT(*)
----------
      1000
主库查询
select count(*)from ACCtest20.MLOG$_TEST_MV_PRI;
  COUNT(*)
----------
         0      
###数据不一致 #############
主库继续插入一条数据
 insert into ACCtest20.test_mv_pri(owner,object_id,object_name,object_type) values('test',1000003,'test','TABLE');
commit;
增量刷新数据,查看数据条数是否完全同步
SQL> select count(*)from ACCtest20.test_mv_pri ;
  COUNT(*)
----------
      1002
结论,在这种场景中,可能会有数据丢失的情况。主要原因就是统计库的物化视图创建时间晚于源库的物化视图日志时间。
我这种测试不是说物化视图prebuilt的方式不好,而是在这种场景中还是会有一些影响。如果通过主库全量同步数据,再增量刷新肯定是没有问题的。我这个场景只是想通过ADG来实现间接的全量刷新,不是主流的使用方法。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
PgSQL——使用触发器自动刷新物化视图
PgSQL——使用触发器自动刷新物化视图
|
SQL 存储 缓存
MySQL Online DDL增量DML记录和回放的源码实现
中分析并验证了MySQL进行在线创建索引时,不会因为执行时间过长或业务压力较大,在回放增量DML时加锁时间过久而对业务造成严重影响,本文从MySQL 8.0.19源码出发,分析MySQL是如何实现的。同时也确认是否在回放DML时会报duplicate key。 核心处理流程和对象 增量DML处理流程主要在http://row0log.cc中。 /** @file row/row0log.cc Modification log for online index creation and online table rebuild Created 2011-05-26 Marko Make
220 0
SQL物化视图 自动更新 定时刷新
SQL物化视图 自动更新 定时刷新http://www.bieryun.com/3483.html 创建定时刷新-------------------------------------------------------------- create  MATERIALIZED VIEW LOG.
2569 0
|
Oracle 关系型数据库 数据库
Oracle 物化视图和物化视图日志
物化视图是将查询预先定义在结构中,并手动或者定期刷新将结果存储在物化视图段中,也就是说跟普通视图不同,它是需要存储空间的,从而不需要重新或者反复的执行sql语句,支持增量刷新,快速获取结果,提高数据获取的效率。
3432 0
物化视图快速刷新报 ORA-12008 & ORA-01031
物化视图快速刷新报 ORA-12008 & ORA-01031 用户A创建了物化视图,物化视图里边引用了用户B的表,现在用户C执行exec dbms_mview.
1601 0
|
监控 关系型数据库 数据库
物化视图加DBLINK实现数据的同步_20170216
【业务场景】需要把生产的ERP系统上面的一个表的数据抽取到另外一个报表的数据库里面,公司内部是没有ESB的平台,考虑到整个需求的紧急程度和对效率的要求,建议采用物化视图+DBLINK的方式来实现数据的同步; 【环境说明】 数据库的版本:11.
1685 0
|
SQL 数据安全/隐私保护 索引
物化视图自动刷新的碰壁
今天和开发的同事讨论一个问题,他们说source 1的环境中存在一个表,现在希望目标环境target 1和target 2中都需要用到这部分的数据。 对于这个问题看似处理也比较常规。
896 0
|
Shell 数据库
特殊的物化视图刷新
现在有一个需求,某个环境中存在两个用户,一个用户中存在物化视图,另一个用户中存在源表,根据业务的需要,需要做一种特别的物化视图刷新。 物化视图用户中的物化视图为CORP_NAME 源数据用户中的表为ADD_CORP_NAME 可能数据刷新是没有问题,关键就是在于CORP_NAME中的字段要比ADD_CORP_NAME多一些。
855 0
|
SQL Oracle 关系型数据库
物化视图失效的几种情况及测试
说明:物化视图(Materialized Views)是查询的结果集,所有原表和视图的变更都将导致物化视图的失效,最近就发现了一个物化视图经常失效的问题,以下是整理的文档。
1443 0