背景:系统使用的 flyway 进行自动升级。现在要兼容 oracle。首要之事当然是制作 oracle 的数据初始化脚本。
失败经历:使用 Navicat Premium 12 的【工具->数据传输】将 mysql 的数据先迁移到 oracle ,到后直接导出 sql 。发现 dao 层的sql(我很确认我写的都是通用sql) 全部无法执行。
成功方式:使用 Navicat 直接导出 mysql 的脚本。然后一点点改为 oracle 的 DDL/DML 语法.
下面罗列下我用的:(ctr+H 整体替换)
- change drop table ... to -- drop table... (将 drop table 语句注释掉)
- delete ` (删除斜撇,就是键盘上ESC建下面那个波浪线键)
- delete ENGINE=InnoDB DEFAULT CHARSET=utf8 (同 2)
- change varchar to varchar2 (将 varchar 替换为 varchar2)
- delete CHARACTER SET utf8 COLLATE utf8_general_ci (同 2)
- change longtext to clob (将 longtext/text 替换为 clob)
- in tables ,change FieldName from : "from" ,change to : "to" (from 和to 是在oracle里是保留字,必须加双引号)
- in table pidcad_drawing,change size : "size" (size也是保留字)
- in table pidcad_file , change NOT NULL DEFAULT '1' : DEFAULT '1' NOT NULL (oracle 中 默认值和不为空的顺序是 DEFAULT '1' NOT NULL )
附上 mysql 和 oracle 的数据类型对应表 https://blog.csdn.net/huangyinzhao/article/details/80739291
没有迈过去,选择规避的坑:
有个问题是表中某个字段的数据类型是 longtext,里面有大量的数据。大字段数据作为 oracle 初始化时,生成的 sql 脚本是无法执行的。网上说必须变为 plsql ,我在flyway里没有试验成功。
我只能选择将这些大字段的置空,通过程序,后期访问的时候再进行初始化。