最近处理一个需求,使用脚本方式将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参数
最后修改时间:2021-02-25 15:47:29
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




