活动预告

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

杨建荣 2016-03-23 23:44:00

最近开发提了几个需求,需要把几个线上的分布式的表整合到统计系统中方便统计,看来分久必合,合久必分,当时的分开考虑,肯定没有想到以后会整合起来,这可对我们是一些额外的工作,这个时候增量数据的问题就摆在我们眼前,当然目前已经基本抛弃了根据日期来增量同步数据,因为会有dml的数据不准确,当然数据多了,分析多了,对统计系统对数据的精确度也在提高。


比如数据的架构是下面这种形式,左边的是线上系统,右边的统计系统。



当然这种刷新现在已然没有什么新意了,而且目前来看也算是经历住了一些大查询的考验。


但是如果结合ADG来看待物化视图刷新,是否能够成正果?


原本的刷新流程图是这样的情况,假设存在两个OLTP的主库primary1,primary2,数据都会通过物化视图日志增量刷新到统计库中。



我在处理这种案例的时候就在想,第一次刷新是一个全量的刷新,如果数据量很大的情况,对主库是不是压力有些大,如果物化视图比较多的情况下,这势必对主库有一些潜在的影响。


尤其是我碰到一个主库没有开大页,然后看着swap等待进程,剩余内存被越刷越少,老是担心出现OOM-killer的情况,这就得不偿失了。


如果是在备库执行,在ADG的环境中,可以认为是同一个数据源,只是一个只读,一个可写。


假设我们需要创建的物化视图如下:


create materialized view   TEST.ACC20_USER_INFO refresh fast as select *from ACC20.USER_INFO@public_primary1;


create materialized view   TEST.ACC15_USER_INFO refresh fast as select *from ACC15.USER_INFO@public_primary1;


我首先db link指向主库Primary1,然后常见了一个物化视图,指定快速刷新,执行成功。


然后在当前的session下,修改tnsnames.ora的配置,把它修改为备库ADG的ip。然后继续执行第二条语句,也是执行成功。所以最开始得出一个结论是ADG的这种刷新是可行的。


然后还自己起了移花接木的美名,想这样的话可以极大改善数据同步的问题。


自己的设想思路是:



但是吃了晚饭回去继续折腾这个问题,发现却不行了。


非常相似的语句,继续开了一个窗口执行就报错了。


SQL>create materialized view   TEST.ACC13_USER_INFO refresh fast as select *from ACC13.USER_INFO@public_primary1;


create materialized view   TEST.ACC13_USER_INFO refresh fast as select *from ACC13.USER_INFO@public_primary1;


                                                                                                      *


ERROR at line 1:


ORA-16000: database open for read-only access


ORA-06512: at "SYS.DBMS_SNAPSHOT_UTL", line 364


ORA-06512: at "SYS.DBMS_SNAPSHOT_UTL", line 446


ORA-06512: at line 1


继续测试,如果放低要求,全量刷新,结果还是不行。


SQL>create materialized view   TEST.ACC13_USER_INFO refresh fast as select *from ACC13.USER_INFO@public_primary1;


create materialized view   TEST.ACC13_USER_INFO  as select *from ACC13.USER_INFO@public_primary1;


                                                                                                      *


ERROR at line 1:


ORA-16000: database open for read-only access


ORA-06512: at "SYS.DBMS_SNAPSHOT_UTL", line 364


ORA-06512: at "SYS.DBMS_SNAPSHOT_UTL", line 446


ORA-06512: at line 1


自己在想,是不是物化视图日志影响的,于是删除了主库的物化视图日志,继续测试,在ADG的环境继续尝试全表扫描,依旧是同样的报错。


不能增量刷新着实让我有一些失落,为什么最开始的时候可以呢,那是因为在同一个session里。


不过退一步来说,对于ADG的数据刷新,如果附带这样的子查询的形式,其实还是可行的,不过对于大量数据的刷新就得不偿失了。


CREATE MATERIALIZED VIEW MIMI.MV_TEST

  TABLESPACE USERS

  BUILD IMMEDIATE

  REFRESH COMPLETE

  AS (SELECT * FROM TEST@MIMI_ROSTBY WHERE ROWNUM>0);