oracle迁移mysql实施方案

时间:2024-04-17 18:13:44

                                oracle迁移mysql实施方案

  • 数据库表迁移方法

虽然Oracle与mysql都是关系型数据库,但是两库原理和结构之间的差异依然巨大,在参考众多迁移方案后,决定使用工具Navicat Premium 15(版本最低要求12)经行迁移,该工具数据迁移简单,会自动转化两库的字段定义,例如:讲varchar2转换为varchar、number转换为decimal、就date转换为datatime。同时Navicat Premium会自动创建表、索引、表注释、列注释,自动同步表数据。

  • 实施操作过程

1,使用Navicat Premium连接两个要转换的数据库

2,点击工具、数据传输

3,选择要传输的数据库

注意:mysql手动创建好与oracle同名或其他名称的数据,做为目标数据库。

4,选择要同步的表

5,开始传输

  • 传输问题处理与数据处理
  1. 在步骤二中可能存在报错问题,导致数据库传输失败,例如最常见报错

这种是因为在oracle中字段类型varchar(n),并且该字段有索引存在,当n>255时工具会自动将varchar2转换为TEXT,在mysql中TEXT类型只能创建fulltext缩影,在创建普通索引时就会报错

处理方法:我们可以将oracle该字段定义小于255,如果字段中存储的数据确实无法变小,可以暂时删除该索引,完成后再在oracle中手动创建。修改后点击上一步,选中未同步的表的继续同步即可

如遇到其他问题无法解决,可联系我共同处理

  1. 同步后存在的问题及解决办法

Varchar2(255)以上自动转为换位TEXT,因为TEXT中无法创建普通索引,所以我们要根据实际情况选择时修改为varchar,还时继续使用TEXT。

注意:因为mysql5.7中,varchar每行可储存65535,在utf8下可存储21845个汉字,所以我们可以使用超过4000的定义。

Number会转换为decimal,未定义的number会转换为

Decimal(65,30),需要我们手动修改为int类型。

Blob会转换为longtext,我们可以根据实际长度,使用text,或者longtext.

以上操作可以在mysql中导出sql语句,使用note++批量操作。对于批量不能处理的只能手动修改

  1. 内置函数、自定义函数、存储过程、触发器、job其他对象的处理

Mysql与Oracle的内置函数名称不同,如:str_to_date---to_date、date_format---to_date、ifnull---nvl等等,对于应用层的代码是个问题,我们只能修改应用层SQL,或者手动创建同名函数。

对与oracle中自定义函数、存储过程、触发器、job等

因为Mysql中的语法不同,所以需要手动重新创建。

对于mysql5.7中不支持的递归、开窗、正则替换等等函数,都需要手动创建功能相同的自定义函数。

注意:以上大部分函数已经在mysql8.0版本中支持