Oracle到PostgreSQL的不停机数据库迁移

1970 年,数据库之父 Edgar Frank Codd 发表了“数据的关系模型”论文,该论文为往后的关系型数据库的发展奠定了基础。1979 年,基于关系模型理论的数据库产品 Oracle 2 首次亮相,并在过去的三四十年时间里,横扫全球数据库市场。

时间到了 1989 年,Oracle 进军中国市场,场面几乎也是 Oracle 一家独大,大部分大型企业都被 Oracle 占领。Oracle 功能强大,运行稳定的背后,是其高额的授权费用。尽管如此,由于 Oracle 的黏性实在太强,在没有替代方案的情况下,接下来的相当长一段年月里,企业也都只能乖乖掏钱。

时至今日,情况已经发生了翻天覆地的变化,替代方案层出不穷,PostgreSQL 作为其中的一员,除了兼具多样功能和强大性能之外,还具备非常优秀的可扩展性,可以较好地兼容 Oracle,企业也可以从长期活跃的开源社区中得到丰富的资源和技术支持,最重要的是,PostgreSQL 是开源软件,无需支付高昂的授权费用,这可以为企业省下不小的支出。因此,Oracle 到 PostgreSQL 的迁移成了众多企业的首选。

然而,Oracle 到 PostgreSQL 的迁移并不是说迁就能迁的,有很多不得不解决的问题。

Oracle 迁移到 PostgreSQL 不得不解决的问题

业务的可用性:迁移必须在不影响业务的前提下进行,换句话说,迁移时不能停机,那需要考虑的事情就非常多了:存量和增量数据如何完整迁移?如何处理迁移时的性能波动?如何实现应用程序的平滑切换?等等。

表的初始化:在同步数据之前,需要手动在 PostgreSQL 端创建和源端一致的表结构,然后才能从源端接收数据。当源端有大量表且表结构很复杂的情况下,工作量非常大。

数据结构的映射:两者数据结构不同,怎么确保数据从源端同步过来后的完整性?除非你对两者的数据模型的理解非常极致,且保证绝对不出错,才能达到理想的结果。

源端 DDL 语句的联动:如何保证源端的数据结构发生变化时,同步链路不中断?那就需要实时捕获源端 Oracle 的 DDL 变更,并及时在目标端的 PostgreSQL 中同步执行。

这些问题如果可以顺利解决,迁移工作将会相当丝滑。那么如何解决呢?方法自然是有的。对于上述 4 个问题,NineData 有绝对的发言权,我们先来看看它是如何解决这些问题的:

迁移过程不停机:在不影响源端业务的情况下,进行全量和增量数据的迁移,保证源和目标的一致性,并在迁移完成后实施无缝切换。

结构复制:基于目标端数据源的特性,自动高效地完成表的创建、数据结构的映射等工作。

复制性能:基于动态攒批、并行复制、Stream Load 等技术,复制性能轻松达到 200 MB/S。

DDL 捕获与执行:实时检测源端中的 DDL 操作,并同步在目标端中执行,保证其他业务变更能够稳定地进行。

轻松解决且非常愉快,下面来看看怎么操作。

步骤一:录入源和目标数据源

登录 NineData 控制台,单击数据源管理>数据源,然后在页面中单击创建数据源,选择需要录入的数据源。

根据页面提示进行配置,然后单击创建数据源完成创建。

步骤二:配置同步链路

登录 NineData 控制台,单击数据复制>数据复制,然后单击创建复制。

根据页面提示配置复制任务,由于我们需要不停机迁移,需要在复制类型处勾选增量复制。

配置完成后启动任务,针对您配置的所有迁移对象,NineData 会先对所有的存量数据进行全量迁移,接下来就是实时同步 Oracle 中新增的增量数据,所有新写入的数据都将一条不漏地同步到 PostgreSQL,每当目标端的增量数据追平源端时,任务面板中会显示延迟 0 秒,如下图所示。

步骤三(可选):校验目标端同步数据的完整性

除了同步功能以外,NineData 还提供了同步后源端和目标端同步数据的对比功能,以确保目标端数据的完整性。

登录 NineData 控制台,单击数据复制>数据复制,然后单击步骤二中创建的复制任务 ID。

单击数据对比页签,并单击开启数据对比(如果步骤二的任务配置中已勾选开启数据一致性对比,则此处直接展示对比结果)。

提示

开启后,系统将自动对比源端和目标端的同步对象,并给出对比结果。

您可以在一段时间后,单击页面中的重新对比,校验最新增量数据的结果。

步骤四(可选):配置任务异常告警

由于是增量迁移任务,您可能需要系统实时监控任务状态,在任务有异常时即刻通知您。

登录 NineData 控制台,单击数据复制>数据复制,然后单击步骤二中创建的复制任务 ID。

单击右上角的配置告警。

输入策略名称,单击保存配置即可。您可以直接使用内置的默认规则,在任务运行失败,或复制延迟大于等于 10 分钟的时候,发送短信提醒您。您也可以自定义创建规则,根据您的需求来进行通知。

最后

在 NineData 将所有数据迁移到 PostgreSQL 之后(延迟为 0),最后一步是在业务低峰期,将业务流量切换至 PostgreSQL,即可完成整个 Oracle 到 PostgreSQL 的迁移。这个切换过程是非常关键,需要谨慎规划执行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++风云录】创新编程:艺术生成与计算艺术

揭秘C创意编程库: 开源创意编码的艺术生成 前言 在现代软件开发中,C库的使用越来越广泛。这些库包括图形处理、音频处理、编程接口以及机器学习等多个领域,极大地方便了开发者创意编程和开发高质量的应用程序。本文将详细介绍六个重要的C库&#xff1a…

什么是web3D?应用场景有哪些?如何实现web3D展示?

Web3D是一种将3D技术与网络技术完美结合的全新领域,它可以实现将数字化的3D模型直接在网络浏览器上运行,从而实现在线交互式的浏览和操作。 Web3D通过将多媒体技术、3D技术、信息网络技术、计算机技术等多种技术融合在一起,实现了它在网络上…

浏览器各类好用插件使用及常见问题(技巧)总结

目录 Vimium C快捷键问题为什么Vimium C - 全键盘操作浏览器插件在百度页面中, x ,o,f等快捷键不起作用如何使用viminum c插件进行自定义快捷键?vimucm 为什么在浏览器首页时快捷键不起作用? 网页截图问题firefox 网页截图使用 idm问题浏览器点击idm 不下载? 待续、更新中 V…

oracle数据归档方案

1、查询现有表空间数据量; -- system: 查询表空间使用情况 SELECT upper(f.tablespace_name) "Tablespace_name", round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2) " Used (%) ", round(f.total_bytes / d.Tot_groo…

23_Scala集合Set

文章目录 Set1.构建方式2.可变Set集合3.可变集合的增删改查 Set –无序,数据不可重复集合 –Set是特质,不能直接构建,默认是不可变集合 1.构建方式 // 1.构建方式 val set Set.apply(2,2,2,2,3,4,5) println(set) //Set(2, 3, 4, 5)2.可变Set集…

Hadoop3:HDFS的架构组成

一、官方文档 我这里学习的是Hadoop3.1.3版本,所以,查看的也是3.1.3版本的文档 Architecture模块最下面 二、HDFS架构介绍 HDFS架构的主要组成部分,是一下四个部分 1、NameNode(NN) 就是Master节点,它是集群管理者。 1、管…

CSS 样式清单整理:文字超出部分显示省略号和设置placeholder的字体样式

单行文本的溢出显示省略号(一定要有宽度) p{width:200rpx;overflow: hidden;text-overflow:ellipsis;white-space: nowrap;}多行文本溢出显示省略号 p {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;}设…

word格式技巧

文章目录 论文格式技巧论文交叉引用怎么弄论文的页码怎么弄 论文格式技巧 论文交叉引用怎么弄 1.取消文献原有的编号 2.定义新编号 3.具体编号设置 4.在引用的地方插入,具体引用选项卡–>交叉引用–>选择后插入 2. 4. 论文的页码怎么弄 假设我们有这样一…

Rust 常用 Web 开源代码库

Rust的web开发有许多优秀的开源库可供选择,以下是一些值得关注的库: Web框架: Axum:由Rust社区的异步事实标准Tokio团队开发,以高性能和强大的异步支持著称。其特点包括使用无宏API将请求路由到处理程序、使用提取器以…

Oracle完整截取汉字的方法

在Oracle数据库中,要完整截取汉字,你通常应该使用SUBSTR函数而不是SUBSTRB函数,因为SUBSTRB是基于字节进行截取的,而汉字在UTF-8等编码中通常占用多个字节。使用SUBSTR则能确保按照字符来截取,从而避免截断汉字。 SUB…

Nginx内存池源码刨析

Nginx 内存池刨析 实例源码刨析 #define BLOCK_SIZE 16 //每次分配内存块大小#define MEM_POOL_SIZE (1024 * 4) //内存池每块大小int i 0, k 0;int use_free 0;ngx_pagesize getpagesize();//获取系统的页大小//printf("pagesize: %zu\n",ngx_pagesize);ch…

SpringBoot @DS注解 和 DynamicDataSource自定义实现多数据源的2种实现方式

前言 在实际的项目中,我们经常会遇到需要操作多个数据源的情况,SpringBoot为我们提供了多种实现多数据源的方式。本文将介绍两种常见的方式:使用DS注解实现多数据源的切换以及使用DynamicDataSource自定义实现多数据源的切换。 我们将分别介…

LINUX 入门 9

LINUX 入门 9 day11 20240507 耗时:120min 课程链接地址 第9章 百万并发的服务器 1 百万并发项目介绍与并发概念讲解 书接上回,把server做成并发量百万级的服务量 装4台虚拟机 vmware右下角可以设置虚拟机内存 内核 没敲,就看了一下&a…

Python 正则表达式 re . 符号

Python 正则表达式 re . 符号 正文示例1示例2 正文 用法说明:(点号) 在默认模式下,匹配除换行符以外的任意字符。 如果指定了 flags 参数 DOTALL ,它将匹配包括换行符在内的任意字符。 示例1 import restr1 abcde print(re.search(., str…

[SWPUCTF 2021 新生赛]PseudoProtocols、[SWPUCTF 2022 新生赛]ez_ez_php

[SWPUCTF 2021 新生赛]PseudoProtocols 打开环境,提示hint.php就在这里,且含有参数wllm 尝试利用PHP伪协议读取该文件 ?wllmphp://filter/convert.base64-encode/resourcehint.php//文件路径php://filter 读取源代码并进行base64编码输出。 有一些敏…

scikit-learn实现单因子线性回归模型

1.是什么: 针对机器学习提供了数据预处理,分类,回归等常见算法的框架 2.基于scikit-learn求解线性回归的问题: 2.1.求解a,b对新数据进行预测: 2.2评估模型表现(y和y’的方差MSE)…

Python轴承故障诊断 (18)基于CNN-TCN-Attention的创新诊断模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Python轴承故障诊断 (一)短时傅里叶变换STFT Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 …

【Linux系列】file命令

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

hadoop学习---基于Hive的数据仓库相关函数机制及其优化方案

Hive相关函数&#xff08;部分&#xff09;&#xff1a; if函数: 作用: 用于进行逻辑判断操作 语法: if(条件, true返回信息,false返回信息) 注意: if函数支持嵌套使用 select if(aa,’bbbb’,111) fromlxw_dual; bbbb select if(1<2,100,200) fromlxw_dual; 200nvl函数:…

25_Scala集合Tuple

文章目录 tuple1.元组定义2.Tuple元素访问3.如果元素的len2&#xff0c;称之为键值对对象&#xff0c;也称之为对偶元组4.补充上节Map5.Map集合遍历6.集合之间相互转化 tuple 概念&#xff1a;scala语言采用特殊的方式将无关的数据作为一个整体&#xff0c;组合在一起’ 1.元…