物化视图刷新结合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来实现间接的全量刷新,不是主流的使用方法。
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
数据采集 人工智能 测试技术
还在死磕AI咒语?北大-百川搞了个自动提示工程系统PAS
【10月更文挑战第4天】北京大学和百川智能研究人员开发了一种名为PAS的即插即用自动提示工程(APE)系统,利用高质量数据集训练的大型语言模型(LLMs),在基准测试中取得了显著成果,平均提升了6.09个百分点。PAS仅需9000个数据点即可实现顶尖性能,并能自主生成提示增强数据,提高了灵活性和效率。尽管存在训练数据质量和提示多样性等方面的潜在局限性,PAS仍为解决提示工程挑战提供了有前景的方法,有望提升LLM的可用性和有效性。论文详见:https://arxiv.org/abs/2407.06027。
282 3
|
9月前
|
JavaScript 前端开发 API
低代码+阿里云部署版 DeepSeek,10 分钟速成编剧大师
阿里云部署版DeepSeek重磅发布,钉钉宜搭低代码平台已首发适配,推出官方连接器。用户可轻松调用DeepSeek R1、V3及蒸馏系列模型。通过宜搭低代码技术,结合DeepSeek大模型,仅需10分钟即可制作编剧大师应用。
1368 20
|
11月前
|
XML JSON 前端开发
一文带你了解 Flutter dio封装
一文带你了解 Flutter dio封装
1645 1
|
人工智能 自然语言处理 搜索推荐
如何利用AI技术改善学生的学习体验?
【5月更文挑战第19天】如何利用AI技术改善学生的学习体验?
564 1
|
关系型数据库 MySQL Linux
Linux命令systemctl详解
`systemctl`是Linux系统用于管理systemd服务的核心命令,它与systemd守护进程交互,实现启动、停止、重启服务及查看服务状态等功能。主要参数包括`start`、`stop`、`restart`、`status`、`enable`和`disable`等。例如,启动Apache服务使用`systemctl start httpd.service`,查看服务状态用`systemctl status &lt;service&gt;`。使用时需注意权限,服务名通常以`.service`结尾,但命令中可省略。最佳实践包括利用tab键补全、定期查看服务状态和合理配置服务自启。
|
弹性计算 Linux 数据安全/隐私保护
阿里云幻兽帕鲁palworld专用云服务器,搭建游戏联机服务器教程
阿里云幻兽帕鲁palworld专用云服务器,搭建游戏联机服务器教程,玩转幻兽帕鲁服务器,幻兽帕鲁Palworld多人游戏专用服务器一键部署教程,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云百科分享2024年新版基于阿里云搭建幻兽帕鲁服务器教程
858 0
H8
|
存储 传感器 机器学习/深度学习
数字孪生(Digital Twins)
数字映射(Digital twin),或译作数字孪生、数字分身,指在信息化平台内模拟物理实体、流程或者系统,类似实体系统在信息化平台中的双胞胎。借助于数字映射,可以在信息化平台上了解物理实体的状态,甚至可以对物理实体里面预定义的接口组件进行控制。
H8
901 1
|
监控 算法 安全
中间件数据传输数据加密
中间件数据传输加密涉及对称与非对称算法、混合加密、流与块加密模式、密钥管理、SSL/TLS协议、端到端加密、加密级别、合规性及监控审计。确保数据机密性与安全性需综合考虑多方面因素,并遵循相关法规标准。
230 1
|
存储 安全 测试技术
Docker Registry 部署镜像私有仓库及鉴权认证
了解什么是 Docker Registry,常用的 Docker Registry 的鉴权和认证机制有哪些,不同的认证机制在配置文件中的参数有所不同。可以根据实际需求选择相应的认证机制并进行配置。
2064 2
|
分布式计算 MaxCompute
Dataphin试用操作步骤
Dataphin, 试用, 操作步骤
1327 0
Dataphin试用操作步骤