数据库迁移 | Oracle数据迁移方案之技术两三点

今年Oracle似乎又火了,火得要下掉,目前中国大概有240+数据库企业,在国产信创的大趋势下,一片欣欣向荣,国库之春已然来临。到今天为止,Oracle依旧是市场份额最大的数据库,天下苦秦久矣,Oracle在国内的这份市场,未来2-3年内注定会被瓜分得必须剩点渣,数据库市场格局也会基本定型。当年如火如荼的上,现在吹枯拉朽的下,小编君有种半夜从被窝里抓起来去扛炸药包的感觉,这么多年下来,去O才刚刚开始。

去O中数据迁移肯定是无法避免的,Oracle数据迁移的复杂度,在小编君接触的所有数据库里,应该算是最高的,庞大的功能对象和数据类型先不说,单就增量/全量数据同步上,就可以出一部专辑。我司的DBMotion数据传输迁移平台已经支持Oracle/MySQL/Mongo/openGauss/PostgreSQL的全系列,就目前中国的市场而言,Oracle和MySQL的需求量还是最大的,我们在支持这两款数据库的过程中也明显感觉,只要深入到细节,真是隔库如隔山。小编在这里列一些具体的技术点,各自体会。

1 增量数据获取

Oracle增量数据获取方式有很多,但实在不能忍受搞一堆的trigger,或者logminer那种蹩脚的dump+查表的方式,我们是直接解析的redo和归档文件,这是一件枯燥的逆向工程,自己组合数据类型,设计各种事务场景, dump分析日志输出,猜测验证日志格式,最终的效果就是速度快,实时性高, 50M/秒的redo量轻松应对,MySQL这块,我们是基于binlog的数据转换,这个文件的结构内容要清晰,精简太多。

2 事务边界

Oracle的redo日志一般是每隔3秒,或者用户commit时候刷到redo文件的,哪怕你不commit,也是有可能写到redo的,所以解析redo文件时,这个事务到底是回滚还是提交,你是不知道的,你得维护事务状态来应对即将到来的提交或回滚,包括大事务的回滚,而MySQL的binlog里面,就只有commit的事务,回滚事务是不记录binlog的,所以你只管往前解就可以,不用处理中间数据,不用考虑回滚。

3 事务的穿插混合

Oracle在10G开始就有了group commit,多个应用会话的事务在redo文件里是相互揉杂在一起的,你去解析的时候会发现,事务A开始了,操作了,下一条数据居然是事务B的,然后又是事务A的,而MySQL的binlog里面,每个事务一定是连成片的,绝对不交叉,排列得干净整齐,所以在事务的处理逻辑上Oracle需要更多的if else和结构设计。

4 列模式还是行模式

在数据库日志里面是存入行还是列?什么意思?就是你更新一行数据的A字段,日志里面是仅仅记录key+A字段的前后映像,还是将整行都记录进去?好像行业惯例里面,MySQL是全rows模式,Oracle基本是列模式,你很难扭转,这样在拼数据的完整映像时,Oracle就特别费劲,有时可能要反查源库。

5 神奇的RAC多日志流顺序

Oracle有种架构,叫RAC,多个节点,每个节点都能读写数据,现在MySQL界的Auroa架构只能实现一写多读,那么问题来了,你需要将多个Oracle RAC节点的日志流进行全局排序,保证数据更新的顺序,这个排序分批进行,不断前推,也要考虑部分节点事务未到达的等待窗口,想一想是不是和Flink多通道的CheckPoint barrier高水位有点相似了?

6 redo日志切换

Oracle的redo文件是固定的,循环覆盖使用,历史日志归档成archive文件,为了增量实时性,我们是直接解析online redo的,但当业务压力激增时,redo会击穿,你正在解析的数据可能会被抹掉,这是需要很精巧的机制去处理归档和redo的文件解析衔接,包括跨redo边界的事务处理,也有很多细节,MySQL的binlog是连续追加的,不存在这些问题。

7 基于rowid的全量抽取分片

在全量数据的抽取上,由于Oracle单表体量较大,需要考虑一些地方特色的加速方式,比如说同样是多线程抽取表数据,充分发挥并行IO的能力,每个线程获取独立的segment数据,自然是最快的,但是Oracle是堆表,根据Primary Key出来的范围数据,物理上不一定是连续的,也就是说IO层面在多线程上会交织影响的,这里有种方法,就是根据伪列rowid来计算分片边界,至少从OS角度,这个分片在物理上是连续且无交集的,pkrange和rowidrange的跑分结果如下,同样的环境,差距还是挺明显:


--fetch数据,并load加载到目标数据库,8并发,fetch size 40000笔
Bigoracle,81920000 rows,35480MBytes,pkrange parallel 8 process, ETL take 812 seconds!!!
Bigoracle,81920000 rows,35480MBytes,rowidrange parallel 8 process, ETL take 602 seconds!!!

--仅仅fetch数据,没有load操作,8并发,fetch size 40000笔

Bigoracle,81920000 rows,35480MBytes,pkrange parallel 8 process, ETL take 333 seconds!!!
Bigoracle,81920000 rows,35480MBytes,rowidrange parallel 8 process, ETL take 167 seconds!!!

rowid伪列的另外一个意义就是你可以认为Oracle所有的表都是有唯一性的,当我们处理MySQL的无主键/唯一键表时,困难就不止多了一点点。

以上只是Oracle迁移的冰山一角,可以看出,要高效处理Oracle的数据迁移,工程复杂度是挺高的。我们当初是先做的Oracle,大概花了1年多的时间,后面才做的MySQL,感觉如进了天堂一般,增量日志对接三个星期就拿下了,没任何悬念。当然解析出来的数据如何应用到目标端,同构异构,又是另外回事了。目前,我们会支持两种模式,一种是支持主流数据库的端到端;另一种是对接Kafka,设定好标准的数据格式,供下游系统订阅消费。

Oracle的历史包袱是很重的,很多业务开发重度依赖了O的各种特性,如dblink,存过包,分析函数,全局临时表,还有透明加密等等。这些功能不是在下一任里实现,就是到应用开发侧实现。在小编接触的去O中,大致分为3种,1是开发新系统,直接不用O,这是最开心的。2是借着系统重构和升级,将以前一些O系功能改造优化掉。3就是硬替,这种只发生在SQL写的很标准,基本把数据库当存储用的场景,否则没法执行。去O肯定是个持久战,也衷心希望,DBMotion能为去O贡献点绵薄之力!

本文作者:罗春,沃趣科技联合创始人&产品总架构师

Squids(squids.cn)是多云时代的数据库云服务提供商,基于公有云基础资源,提供云上RDS,云备份,云迁移,SQL窗口等企业级数据库服务功能,帮助企业快速构建云上数据库融合生态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/28757.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JVM 监控工具】JVisualVM的使用

文章目录 前言二、启动JVisualVM三、安装插件四、使用 前言 JVisualVM是一个Java虚拟机的监控工具,要是需要对JVM的性能进行监控可以使用这个工具哦 使用这个工具,你就可以监控到java虚拟机的gc过程了 那么,这么强大的工具怎么下载呢&…

顶奢好文:3W字,穿透Spring事务原理、源码,至少读10遍

说在前面 在40岁老架构师 尼恩的读者社区(50)中,最近有小伙伴拿到了一线互联网企业如阿里、美团、极兔、有赞、希音的面试资格,Spring事务源码的面试题,经常遇到: (1) spring什么情况下进行事务回滚? (2) spring 事务…

Transformer在CV领域有可能替代CNN吗?

目前已经有基于Transformer在三大图像问题上的应用:分类(ViT),检测(DETR)和分割(SETR),并且都取得了不错的效果。那么未来,Transformer有可能替换CNN吗&#…

索尼RSV视频修复方法论视频文件修复时样本文件的三同

索尼RSV类的文件修复案例有很多,程序操作也很简单没什么可说的,这次这个索尼ILCE-7SM3的案例就是为了让大家更好的认识视频修复中我称之为“三同“的重要性,想要恢复的效果好必须要把准备工作做到位。 故障文件:45.1G RSV文件 故障现象: 索…

工具篇--4 消息中间件-RabbitMq 模型介绍

1 介绍: RabbitMQ 是一个开源的消息中间件,它实现了 AMQP(高级消息队列协议)标准,并且支持多种语言和操作系统,包括 Java、Python、Ruby、PHP、.NET、MacOS、Windows、Linux 等等。RabbitMQ 提供了可靠的消息传递机制…

竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪)

竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪) 无名小哥 2023年6月10日 用户通过对前面两讲中全国大学生电子设计竞赛真题植保无人机(2021)、送货无人机&#…

【UE 从零开始制作坦克】2-控制坦克移动(简单的移动效果)

效果 步骤 1. 新建蓝图类,父类选择“VehicleWheel(载具车轮)” 这里就命名为“TankWheel” 双击打开“TankWheel”,设置形状半径为40 2. 打开 “BP_West_Tank_M1A1Abrams” 选中“网格体(VehicleMesh)&…

JMeter参数化4种实现方式

目录 前言: 1 参数化释义 2 参数化实现 CSV实例 注意事项 前言: 在使用JMeter进行测试时,参数化允许您模拟不同的用户、不同的数据、不同的操作等,从而增加了测试的灵活性和复用性 1 参数化释义 什么是参数化?…

设计模式(十八):行为型之观察者模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

分布式数据库HBase

大数据基础-分布式数据库HBase 概述HBase简介HBase与传统关系数据库的对比分析 HBase数据模型数据模型概述数据模型相关概念数据坐标 HBase的实现原理HBase功能组件表和RegionRegion的定位HBase框架结构HMasterRegionServerHBase协作组件RegionColumnFamilyKeyValue小结 HBase运…

STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

docker数据管理---数据卷,数据卷容器

在Docker中,数据卷(data volumes)和数据卷容器(data volume containers)是用于在容器之间共享和持久化数据的两种不同的机制。 一、数据卷 数据卷是一个特殊的目录或目录,可以绕过容器文件系统的常规层&a…

【RabbitMQ教程】第六章 —— RabbitMQ - 延迟队列

💧 【 R a b b i t M Q 教程】第六章—— R a b b i t M Q − 延迟队列 \color{#FF1493}{【RabbitMQ教程】第六章 —— RabbitMQ - 延迟队列} 【RabbitMQ教程】第六章——RabbitMQ−延迟队列💧 🌷 仰望天空,妳我亦是行人…

2023年前端面试高频考点HTML5+CSS3

目录 浏览器的渲染过程⭐⭐⭐ CSS 、JS 阻塞 DOM 解析和渲染 回流(重排)和重绘⭐⭐ 选择器 ID选择器、类选择器、标签选择器(按优先级高到低排序)⭐⭐ 特殊符号选择器(>,,~,空格&#xff0…

Stopwatch工具类计时器探究

搬砖的我们 特别是Java开发的童鞋们, 经常需要通过记录开始时间和结束时间,然后通过计算差值,得到时间差,如下面的代码: long start System.currentTimeMillis(); long end System.currentTimeMillis(); System.out.println(…

医疗设备都在用哪些晶振?

医疗设备是指用于医疗诊断、治疗、监测等方面的各种设备。随着科技的不断发展,医疗设备的功能不断增强,精度和稳定性也得到了大幅提升。在这些医疗设备中,晶振是非常重要的元件之一。本文将介绍医疗设备中常用的晶振类型及其特点。 一、晶振…

P20[6-8]编码器接口测速(软)

与外部中断编码器逻辑不同,此处编码器使用的是定时器方法 1.Encoder编码器部分: #include "stm32f10x.h" // Device header void Encoder_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCm…

阿里云弹性公网EIP收费价格表

阿里云弹性公网EIP怎么收费?EIP地域不同价格不同,EIP计费模式分为包年包月和按量付费,弹性公网IP可以按带宽收费也可以按使用流量收费,阿里云百科分享阿里云弹性公网IP不同地域、不同计费模式、按带宽和按使用流量详细收费价格表&…

Java泛型的使用

1.什么是泛型? 所谓泛型,就是允许在定义类、接口时通过 一个标识 表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时&#…

取石子游戏——算法与编程

取石子游戏 目录 问题描述输入输出格式输入格式:输出格式: 输入输出样例输入样例#1:输出样例#1:提示信息 算法尼姆博奕 代码 问题描述 A l i c e Alice Alice和 B o b Bob Bob在玩取石子游戏,摆在他们面前的有 n n n堆…