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!

posted @ 2023-02-10 11:12  摩尔迦娜  阅读(517)  评论(0)    收藏  举报