Oracle至MySQL数据库迁移工具

Oracle至MySQL数据库迁移工具

最近,我重新整理了一个之前开发的小工具,用于将Oracle数据库表结构迁移至MySQL。这个小工具能够自动生成建表语句以及创建外键的SQL脚本,极大地简化了迁移过程。现在,我决定将这个工具再次优化并分享出来,一方面记录方便后续自己使用,另一方面希望可以帮助那些可能遇到相似数据库迁移挑战的朋友们,避免重复劳动,提高工作效率。

初衷

很早之前接手了一个需求,需要把Oracle数据库迁移到MySQL上。一开始,我想着找个现成的工具来帮忙,毕竟这样能省不少事儿。于是,我上网搜了搜,发现Navicat和DataWorks都挺受欢迎的,说是能一键迁移数据库结构和数据。

遇到的麻烦

但是,当我试着用这些工具迁移我们的数据库时,问题就来了。我发现,这些工具在转换字段类型的时候,经常出错。比如,Oracle里的VARCHAR2字段,有时候会被转成MySQL的TEXT,有时候又变成了LONGTEXT,看着真是让人头疼。还有INTEGER类型,也被莫名其妙地转成了DECIMAL。更别提那些应该变成LONGTEXT的字段,结果却变成了TEXT。这些问题让我意识到,如果直接用这些工具迁移,我们的数据可能会出问题,甚至可能影响业务运行。

我的解决办法

于是,我决定自己动手,写一个专门用来转换Oracle到MySQL语法的小工具。这个工具会按照我设定的规则,精确地转换字段类型,避免那些类型转换的混乱,同时考虑了联合外键、联合索引等特殊情况。转化结构完毕后,使用DataX这个开源的数据传输工具来帮忙迁移数据,支持多种数据源,传输速度也快,关键是配置起来也不难,不过需要特别注意一点,对应个别字段在Oracle中是非内部字段,但在MySQL中是内部字段,DataX转化的SQL执行时会报错,比如:sql字段,需要单独处理同步字段为`sql`,方可同步。

使用指南

  • 配置自定义数据库地址或生成的SQL脚本路径

    # 数据库配置,自行修改
    spring:
      datasource:
      driver-class-name: oracle.jdbc.OracleDriver
      url: jdbc:oracle:thin:@localhost:1521:orcl
      username: test
      password: 123456
    
    # 自定义配置
    generate:
      # 指定字符集,默认:utf8mb4
      table_charset: utf8mb4
      # 指定排序规则,默认:utf8mb4_general_ci
      table_collation: utf8mb4_bin
      # 指定生成的表结构SQL脚本路径
      table_structure_script_path: D:/oracle2mysql/oracle2MysqlCreateTableStructureSql.sql
      # 指定生成的外键SQL脚本路径
      table_foreign_key_script_path: D:/oracle2mysql/oracle2MysqlTableForeignKeySql.sql
    
  • 转化接口,可以使用浏览器或postman直接调用

    /* 调用转化表结构接口 */
    /api/oracle2mysql/generateTableStructure
    
    /* 调用转化生成外键接口 */
    /api/oracle2mysql/generateTableForeignKey
    

注意事项

  • 两边语法差异对照,参考博客:https://www.cnblogs.com/yeyuzhuanjia/p/17431979.html
  • 当前转化规则,可根据实际情况调整(文件位置:mappers/TableFieldsAndTypesMapper.xml)
Oracle 字段类型条件MySQL 字段类型
VARCHAR2N < 255VARCHAR(N)
VARCHAR2N = 255 或 N = 256VARCHAR(254) (特殊处理,长度存不满,没必要转化为TEXT)
VARCHAR2N > 255TEXT
NVARCHAR2N < 255VARCHAR(N)
NVARCHAR2N = 255 或 N = 256VARCHAR(254)
NVARCHAR2N > 255TEXT
NUMBERDATA_PRECISION 不为空, DATA_SCALE 不为空DECIMAL(DATA_PRECISION, DATA_SCALE)
NUMBERDATA_PRECISION 不为空, DATA_SCALE 为空, DATA_PRECISION < 3TINYINT(DATA_PRECISION)
NUMBERDATA_PRECISION 不为空, DATA_SCALE 为空, DATA_PRECISION >= 3 且 < 5SMALLINT(DATA_PRECISION)
NUMBERDATA_PRECISION 不为空, DATA_SCALE 为空, DATA_PRECISION >= 5 且 < 8MEDIUMINT(DATA_PRECISION)
NUMBERDATA_PRECISION 不为空, DATA_SCALE 为空, DATA_PRECISION >= 8 且 < 10INT(DATA_PRECISION)
NUMBERDATA_PRECISION 不为空, DATA_SCALE 为空, DATA_PRECISION > 10BIGINT(DATA_PRECISION)
NUMBERDATA_PRECISION 不为空, DATA_SCALE 为空, 其他情况INT
NUMBERDATA_PRECISION 为空, DATA_SCALE 不为空INT
CHARCHAR_LENGTHCHAR(CHAR_LENGTH)
DATECHAR_LENGTH (忽略)DATETIME
FLOATCHAR_LENGTH (忽略)DOUBLE
RAWCHAR_LENGTH = 0, DATA_LENGTH > 0VARCHAR(DATA_LENGTH)
LONG 或 CLOBCHAR_LENGTH (忽略)LONGTEXT
UROWID无对应类型TEXT
其他类型不在上述特殊内容中的类型可以匹配按照Oracle字段转化

代码地址:Oracle迁移MySQL工具地址

以上就是我对Oracle迁移MySQL的一些思考和总结,希望能对您有所帮助。由于时间和水平有限,文章中难免存在疏漏和不足之处,恳请各位朋友不吝赐教,您的每一条建议和指正都是对我最大的支持和鼓励。期待在未来的日子里,我们能一起探讨更多有趣的技术话题,共同成长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值