IT评测·应用市场-qidao123.com
标题:
从 Oracle 到 MySQL 数据库的迁徙之旅
[打印本页]
作者:
冬雨财经
时间:
2024-5-17 00:35
标题:
从 Oracle 到 MySQL 数据库的迁徙之旅
目录
引言
一、前期准备工作
1.搭建新的MySQL数据库
2 .创建相应的数据表
2.1 数据库兼容性分析
2.1.1 字段类型兼容性分析
2.1.2 函数兼容性分析
2.1.3 是否利用存储过程?存储过程的个数?复杂度?
2.1.4 是否利用触发器?个数?利用的场景?
2.2 建表过程中其他需要注意的事项
3.为项目配置Oracle和MySQL双数据源
4.对项目举行改造添加MySQL数据CRUD代码
二、数据迁徙操作步骤
1、配置初始化
2、同步数据检查
3、全量数据迁徙
4、检查全量迁徙的数据
5、开启双写
6、获取迁徙过程中oracle数据库的增量数据
7、增量数据脚本准备
8、数据补偿
9、核对整体数据
10、在灰度情况里验证数据的正确性
11、数据库读取的配置设置为从MySQL数据库读取。
12、数据库写入的配置设置为只写MySQL
三、数据迁徙的经验教训
1. 遇到的坑
引言
随着技术的进步,许多企业开始考虑将他们的数据从Oracle迁徙到更现代、成本效益更高的数据库系统如MySQL或PostgreSQL。本文将详细描述我们如何举行这样的数据迁徙过程。
一、前期准备工作
1.搭建新的MySQL数据库
首先,我们需要设置一个新的MySQL数据库情况,这将作为我们的新数据源。这包罗安装MySQL服务器,创建数据库,以及配置适当的用户权限。
2 .创建相应的数据表
我们可以利用PowerDesigner等数据表模型设计工具,将Oracle的模型转换成MySQL模型,然后根据这个模型生成DDL脚本。这些脚本可能需要根据实际情况举行一些修改。例如,我们可能需要调整字段类型以适应MySQL的特性,或者修改索引和约束的定义。
2.1 数据库兼容性分析
2.1.1 字段类型兼容性分析
以下是常用的oracle字段类型和和mysql字段类型的对应关系 ,如果利用特殊的字段类型,需要检查确认字段转换是否符合真实需求。
oracle字段类型mysql字段类型varchar2varcharnumber(1,0))->number(2,0)tinyintnumber(3,0)->number(4,0)smallintnumber(5,0)->number(6,0)mediumintnumber(7,0)->number(9,0)intnumber(10,0) -> number(18,0)bigintnumber(x,y)decimal(x,y)datedatetimetimestamp(6)datetimecharvarcharclobText 或 Midiumtext 或 longtext
2.1.2 函数兼容性分析
Oracle和MySQL的函数有一定对的相似性也要有一定的区别,下面表格列出了Oracle和MySQL常用函数的对比和区别。
功能oracle函数mysql函数备注舍入函数roundround一样取绝对值absabs一样返回 expr 的最小或最大值Max(expr)/Min(expr)Max(expr)/Min(expr)一样在字符串 str 中全部出现的字符串 from_str 均被 to_str 替换REPLACE(str,from_str,to_str)REPLACE(str,from_str,to_str)一样截取函数SUBSTR('abcd',2,2)substring('abcd',2,2)函数名称差别获取长度length(str)char_length()函数名称差别转大写UPPER(str)UPPER(str)一样转小写LOWER(str)LOWER(str)一样转字符TO_CHAR(SQLCODE)date_format/ time_format函数名称差别转时间to_date(str,format)STR_TO_DATE(str,format)函数名称差别获取当前时间SYSDATEnow() / SYSDATE()函数名称差别求和SUM(num)SUM(num)一样返回两个日期之间的天数(D1-D2)DATEDIFF(date1,date2)
2.1.3 是否利用存储过程?存储过程的个数?复杂度?
在这次的案例中,没有利用存储过程,因此不需要举行这方面的分析。
2.1.4 是否利用触发器?个数?利用的场景?
公司的数据库利用规范里禁止利用触发器,因此这次也不需要举行这方面的分析。
2.2 建表过程中其他需要注意的事项
自增主键
mysql默认需要有自增主键,而oracle的表可以不加主键
编码格式
:oracle的编码格式utf8在mysql需要修改成utf8mb4 要确保全部的表都有一个自增的主键列。
时间字段
:时间字段需要精确到时分秒的需要修改为datatime类型。这是因为MySQL的DATETIME类型可以存储到秒级别的时间信息,而Oracle的DATE类型只能存储到天级别的时间信息。
索引格式
:索引格式需要按照规范重新定义,最好在测试情况中举行检查和校验。这是因为Oracle和MySQL的索引实现方式有所差别,直接复制索引可能会导致性能问题。
3.为项目配置Oracle和MySQL双数据源
在项目的数据源配置里添加刚刚新建的MySQL数据源配置,并配置双数据源和Mapper的匹配规则。
4.对项目举行改造添加MySQL数据CRUD代码
添加一套针对MuSQL数据库CRUD的Dao和Mapper代码,同时我们写了一个注解以切面的方式实现根据配置实例化Oracle的Dao、MySQl的Dao、同时调用Oracle和MySQLDao的功能。
改造方式:
数据库迁徙切换流程:
二、数据迁徙操作步骤
数据迁徙操作的答题步骤如下图所示:
1、配置初始化
数据库写入的配置设置为只写Oracle数据库。数据库读取的配置设置为从OracleL数据库读取。
2、同步数据检查
查询待迁徙的几张表的数据量:
select count(1) from table;
3、全量数据迁徙
在迁徙工具上执行数据迁徙脚本SQL
4、检查全量迁徙的数据
查询迁徙后的数据量,检查是否和需要迁徙的数据量能匹配:
5、开启双写
数据库写入的配置设置为Oracle数据库和MYSQl数据库双写
6、获取迁徙过程中oracle数据库的增量数据
查询updated_time在全量数据迁徙开始时间之后的数据
select * from table whereupdated_time>to_Date('2022/12/16 04:00:00', 'yyyy/mm/dd hh24:mi:ss')
7、增量数据脚本准备
根据监控的增量数据对比,找出需要新增和修改的数据,准备脚本
8、数据补偿
在迁徙工具上执行数据补偿脚本SQL
9、核对整体数据
我们有额外的数据核对方案,通过应用读Oracle,再异步读取MySQL并举行对比的方式举行业务表的数据核对。这样可以确保数据的划一性。
10、在灰度情况里验证数据的正确性
将灰度机器的数据库读取的配置设置为从MySQL数据库读取。并在灰度情况验证数据的正确性
11、数据库读取的配置设置为从MySQL数据库读取。
将正式情况的机器的数据库读取的配置设置为从MySQL数据库读取。
12、数据库写入的配置设置为只写MySQL
在生产情况运行一段时间,如果运行平稳的话,就可以关闭数据库双写,将数据库写入配置改为只写MySQL数据库了。
三、数据迁徙的经验教训
1. 遇到的坑
在迁徙过程中,我们发现了一些Oracle语法与MySQL语法不兼容的地方,有些写法在Oracle中可行,在MySQL中会报错:
(1)子查询语句要取别名
(2)字段别名需要注意,AS后是否为空
(3)条件语句中判定需要注意
(4)oracle转mysql条件语句is null需格外注意,在Oracle中null和空串是一个含义,在mysql中是两个含(只针对字段类型为varchar类型的字段)
Oracle中:
IS_LIMIT_SUCESS is null
Mysql替换为:
(IS_LIMIT_SUCESS is null or IS_LIMIT_SUCESS = '')
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4