物化视图刷新结合ADG的尝试(二)(r8笔记第57天)

之前写过一篇 物化视图刷新结合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来实现间接的全量刷新,不是主流的使用方法。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2016-04-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木头编程 - moTzxx

后台 配置页面功能设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

78240
来自专栏抠抠空间

MySQL之库操作

一、库的简介 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等 per...

28950
来自专栏用户2442861的专栏

mysql table相关命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

19020
来自专栏散尽浮华

Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlo...

45180
来自专栏乐沙弥的世界

Oracle 参数文件

主要用来记录数据库的配置文件,在数据库启动时,Oracle读取参数文件,并根据参数文件中的参数设置来配置数据库。

10210
来自专栏程序猿

SQL注入分析服务器类型

分析数据库服务器类型 一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的...

34660
来自专栏我的博客

ADODB简介以及简单使用

1、adodb数据库类介绍(http://adodb.sourceforge.net/) 虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据...

37470
来自专栏维C果糖

史上最简单的 MySQL 教程(二十)「数据的高级操作 之 主键冲突」

当主键存在冲突(duplicate key)的时候,可以选择性的进行处理,即更新或替换。

376110
来自专栏沃趣科技

MySQL8.0之数据字典

MySQL 8.0 将数据库元信息都存放于InnoDB存储引擎表中,在之前版本的MySQL中,数据字典不仅仅存放于特定的存储引擎表中,还存放于元数据文件、非事务...

60090
来自专栏Java成神之路

Linux_服务器_03_xxx is not in the sudoers file.This incident will be reported.的解决方法

1.切换到root用户下,怎么切换就不用说了吧,不会的自己百度去. 2.添加sudo文件的写权限,命令是: chmod u+w /etc/sudoers 3...

11830

扫码关注云+社区

领取腾讯云代金券