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命令中指定了转义字符'\' 所以:数据字段中包含转义字符时,也会导致数据装载失败。