生产环境的Oracle数据库到Mysql数据库千万级数据迁移实战

1、源数据库Oracle11g,目标数据库Mysql5.7,迁移表约6张,其中1张表要拆成Mysql对应的3张表。

2、最大表的数据量大约2000万+,拆成MySql表后,对应为2000万*3张表。

3、一开始方案是,将Oracle数据库导出到excel中,然后再读取excel写入MySQL数据库,使用java程序导出导入数据,导入时耗时非常长,平均统计耗时为100万条数据插入耗时1小时左右(100万*3张表)。

4、后续采用MySQL的Load Data local infile命令导入数据,导入速度和java程序比非常快,平均统计耗时(2分左右导入100万条数据到单表中),数据导出还是使用java程序导出,导出时就按目标表组织好数据,2000+万数据导出大概耗时30分钟,每100万数据写入到1个csv文件中。

5、导入数据遇到的问题:MySQL数据库用了mycat做分库处理,导致load data命令有小差异

      5.1、直连MySQL时,导入命令不用输入table的列名,按建表语句的字段顺序组织data.csv即可

LOAD DATA LOCAL INFILE '/root/data.csv' INTO TABLE table_name 
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '' 
ESCAPED BY '\'
LINES TERMINATED BY '\n'

      5.2、使用mycat导入时,必须指定导入的列名,且ENCLOSED BY 不能为空如下所示

LOAD DATA LOCAL INFILE '/root/data.csv' INTO TABLE table_name 
FIELDS TERMINATED BY ',' 
ESCAPED BY '\'
LINES TERMINATED BY '\n'
(id, name, type, age, card_type, card_no, city_no, city_name, prov_name, country, source_system, channel_id, flow_no, create_time, update_time, is_deleted);

6、导入过程中还是会遇到各种报错,导致导入失败,第一次导入时,2000万数据成功1700+万,大部分是因为数据中有部分乱码导致导入失败。排查问题的过程通过将导入失败的大数据文件分割成小文件,然后再导入小文件来定位具体导入失败的行号。下面是用来大文件分割成小文件的shell命令,分割后的小文件继续导入,更容易定位导入失败的行号。

split -l 10000 data.csv datanew.csv

7、注意:因为load data命令中指定了转义字符'\'  所以:数据字段中包含转义字符时,也会导致数据装载失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值