暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql数据迁移到oracle错误总结

1251

最近处理一个需求,使用脚本方式将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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论