oracle->mysql数据迁移数据事项
2022-12-04
oracle->mysql数据迁移数据事项
概述
从oracle数据迁移到mysql前,需要特别关注两者的区别,才能做好相应的转换及评估。
ORACLE&MYSQL主要差异
图片来源: https://www.infoq.cn/article/rc7urvfsmv94jcaw3z2a
MySQL 不支持的功能项
- MySQL 没有并行的概念,不支持并行;
- MySQL 优化器较弱,复杂 SQL 建议拆分简单 SQL;
- MySQL 对于子查询优化不是很好;
- MySQL 不支持物化视图、存储过程改造、同义词改造、dblink 需要改造。
迁移原则
参考: https://www.infoq.cn/article/rc7urvfsmv94jcaw3z2a
迁移数据时,请遵循以下准则,其中大部分准则同时适用于一次性加载方法和实时复制方法:
- 字符集:确保源 Oracle 数据库与目标 MySQL 数据库之间的字符集兼容;
- 外键:要提升提取速度,请暂时停用目标 MySQL 数据库上的外键限制条件。加载完成后再启用外键限制条件;
- 索引:与外键类似,目标 MySQL 数据库上的索引可能会显著降低初始加载的速度。确保在初始加载完成之前,在目标数据库上未创建索引;
- Oracle 序列:MySQL 支持 AUTO_INCREMENT 而不是序列。确保在初始加载期间停用 AUTO_INCREMENT 特性,以避免覆盖 Oracle 的序列生成的值。在初始加载完成后,将 AUTO_INCREMENT 特性添加到主键列;
- 网络连接:如果您使用的是 GoldenGate TDM,请确保来源环境和目标环境都可以与 GoldenGate TDM 产品建立网络连接,以允许在 Oracle 端捕获数据并在 MySQL 端加载数据。
迁移难点
参考:
https://www.infoq.cn/article/rc7urvfsmv94jcaw3z2a
字符集
对于字符集,需要考虑的问题为迁移过程字段长度匹配情况,迁移后数据是否乱码,以及迁移后字符集转换后空间的问题。
字段长度匹配,空间估算
NULL和空串处理
使用文件导入到 MySQL 时字段中的空值 null 需要使用\N 表示,如果用空字符串表示,那么根据不同的数据类型,MySQL 处理也各异。
- 数据库字段如果是字符串类型,插入空时,load data 默认导入 空字符串
- 数据库字段如果是数字类型,插入空时,load data 默认导入 0.00000000
- 数据库字段如果是日期和时间类型,插入空时,load data 默认导入 0000-00-00 00:00:00
Oracle 导出到文本文件,null 会变为空字符串,插入到 MySQL 后会被认为是空字符串插入,破坏了数据一致性,以下提供了三种方式进行规避:
1、可以在 Oracle 迁移之前将所有业务表的 null 值变更为无意义的值,等到迁移到 MySQL 后统一数据修复调整回来,例如:
UPDATE SUPPLIERS_TBL SET SUPPLIER_ID=NVL(null,‘N/A’) where SUPPLIER_ID is null;
2、使用 spool 导出的时候对 null 值进行转换,需要针对表和列进行修改
SelectNVL(TO_CHAR(id),'N/A')||','||NVL(name,'N/A')||','||NVL(SEX,'N/A')||','||NVL(ADDRESS,'N/A')||','||NVL(TO_CHAR(BIRTHDAY),'N/A') from user1;
日期格式处理
LOB 字段迁移
大小写敏感差异
数据类型转换
https://www.cnblogs.com/priestess-zhao/p/14308959.html
参考链接
https://www.infoq.cn/article/rc7urvfsmv94jcaw3z2a
https://zhuanlan.zhihu.com/p/94254106
https://blog.csdn.net/weixin_39713763/article/details/114906285
https://juejin.cn/post/6943857884006449183
https://developer.aliyun.com/article/184151