最近处理一个需求,使用脚本方式将mysql里的数据迁移到oracle中。处理思路主要是利用mysqldump导出的insert dump文件,oracle中建立相同表结构执行insert。记录本次操作中遇到的问题与处理方式:
1、超4000字节字符串导入
问题描述
oracle varchar2是不能插入超4000字节的字符串的。但是mysql中并没有限制。此类字段数据无法导入。
处理方式
开始将字段转换为clob字段。但目标端oracle数据库部分业务使用dblink连接。dblink是不支持使用lob字段的。目标端oracle版本为12.2。oracle 12c版本已扩展最大值支持到32767。调整数据库支持32k修改如下:
ALTER SYSTEM SET MAX_STRING_SIZE = EXTENDED SCOPE=SPFILE;
shutodnw immediate;
startup upgrade;
@$ORACLE_HOME/rdbms/admin/utl32k ;
shut immediate;
startup;
再将导入列属性改为需求大小导入成功。但是还有一个问题,dblink不支持clob字段,但是超4000字节的字符串同样不支持。分析主要是select查询业务,业务的sql语句中改为substr取4000字节即可。
2、日期字段修改
问题描述
mysql dump方式导出的insert语句中,关于日期部分,目标oracle端建立date属性列无法识别导入。
处理方式
oracle建立表结构时先使用varchar导入。导入后再进行手工准换。
alter table test add col_name_t date; --添加一个date中间列
update test set col_name_t = TO_DATE(col_name,'yyyy-mm-dd hh24:mi:ss');
commit;
alter table test drop column old_col_name; --删除旧的列
alter table xxx rename column col_name_t to col_name; --转换中间列
3、目标oracle端数据与mysql时间相差8小时
问题描述
数据导入后,业务查询发现oracle端日期比mysql库晚8小时。这主要是时区导致。数据库采用北京时间东八区,mysqldump默认使用–tz-utc参数是0时区。导致导出文件中的timestamp时间值相对于数据库查询显示的时间倒退了8个小时。
处理方式
mysqldump加入 --skip-tz-utc参数