mysql千万条级数据导入
这两天在忙数据导入,要导入好几张表,都是1000万条以上数据。
公司的网需要连vpn再连服务器,网跟vpn都不太稳定。
最开始想用source导入,发现导入太慢了,几个小时都不到10%,
换成了Navicat导入,每次导到40%网就断了。
最后又换成使用LOAD DATA导入,把数据切割成几份,然后看数据在哪被断了,重新再导入,记录下这过程之间查到的一些资料。
1.为什么source导入比navicat慢
因为navicat是帮你把事务自动提交关了,他会帮你在结束的时候手动commit;
相当于这样一个流程
//sql_log_bin 关闭二进制日志 //autocommit 关闭事务自动提交 set sql_log_bin=off; set autocommit=0; use 数据库名; //开启事务 start transaction; source 文件.sql; commit; //改回配置 set sql_log_bin=on; set autocommit=1;
顺便再贴点配置,不知道有没有用,反正我是用了
# 进入mysql中执行如下 SET GLOBAL foreign_key_checks=0; SET GLOBAL unique_checks=0; SET GLOBAL innodb_flush_log_at_trx_commit=0; SET GLOBAL sync_binlog=0; --记得导入完成后还原原配置,使用下边的命令查看原始值 SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
2.记录下linux拆分文件并且把sql文件转成csv这种格式的文件供LOAD DATA导入
//处理原始数据文件格式,相当于把insert语句换成 'data', 'data2', 'data3'这样的数据文件 sed -i "s/INSERT INTO \`test1\` VALUES (//g" 2017.sql sed -i "s/);/, /g" 2017.sql //切割文件,500万条一个文件,会切割成2017_aa,2017_ab这种文件 split -l 5000000 2017.sql 2017_ //登录mysql mysql -uroot -p --local-infile=1 use dbname; //导入数据,不懂里面参数含义可以随便找点资料看下去 LOAD DATA LOCAL INFILE '/home/dell/opt/2017_ab' INTO TABLE test1 FIELDS TERMINATED BY ', ' ENCLOSED BY "'" LINES TERMINATED BY '\n'; //提示这种信息就是导完了,我500万条导了14分钟,速度还可以 Query OK, 5000000 rows affected, 65535 warnings (14 min 17.84 sec) Records: 5000000 Deleted: 0 Skipped: 0 Warnings: 10000000
贴下这位仁兄写的文章,基本参照他写的执行的,但是按他里面命令分割会出现漏数据的情况,我测试是因为行内分隔符的问题,在每行最后加上对应分隔符就行了,最后我直接在替换那步就把这个操作完成了。
https://www.cnblogs.com/likingzi/p/16637373.html
经过了导几个小时数据,断网锁表重来等一系列痛苦操作后,终于看见了胜利的曙光,nice!

浙公网安备 33010602011771号