MySQL高效导入sql文件

分享于:2020-12-19 21:55:10

不管是在命令行下使用 mysql 和 source 命令,还是使用Navicat软件运行SQL文件,当SQL文件达到百M时,导入数据会非常地缓慢,几小时,几天都有可能。如果一个应用系统需要数据恢复时,使用这种方式是极不可取的,这样需要关闭应用很长一段时间不可应用。


根据MySQL官方建议,我们有几个措施可以极大提高导入的速度,如下:


对innodb引擎表数据的恢复导入


原理是借助innodb的事务特性实现高速导入数据(前提是:单表SQL文件导入)。


在MySQL配置文件中修改如下参数配置:


1)innodb_log_buffer_size=1G


该参数确保有足够大的日志缓冲区来保存脏数据在被写入到日志文件之前。

如果一个SQL文件1G,此值最少设置为2G(至少单个文件大小的2倍以上)。


当然缓冲区不能设置太大,超过内存大小,也就是备份的SQL文件尽量最大在1G,太大就要分成多个SQL文件备份。

所以从业务的角度上来说,数据表数据过大时,尤其超过了1G以上(需要备份的)数据表,就得开始水平分表,不然恢复起来都是个大问题。

单个表单独备份。


2)autocommit=0


关闭自动提交事务。


3)在导入的SQL文件末尾加上 commit;


只需要完成这三步,SQL导入就会大幅度提高。


当然还可以继续从索引上做些优化:


4)删除表除主键索引以外的索引,导入完成后重建索引。


可以在SQL文件末尾加上自动加索引的语句:


alter table 表名 add KEY `索引名` (`字段`);
alter table 表名 add UNIQUE KEY `索引名` (`字段`);



5)关闭唯一索引检查:unique_checks=0。(关闭了这一项会影响on duplicate key update的效果)

关闭外键检查:foreign_key_checks=0。


6)有自增列的,设置:innodb_autoinc_lock_mode的值为2。


提示:导入完成后,需要把相关的配置参数改回来。


对myisam引擎表数据的恢复导入


首先你要确保数据导入SQL语句(insert语句)是这样写的:


INSERT INTO yourtable VALUES (1,2), (5,5), ...;一次插入多行数据的语句,insert值写在一条语句内。


然后在配置文件添加参数:


bulk_insert_buffer_size=1G


这样可以实现myisam表高效导入。


如果是使用Navicat工具备份myisam表,insert语句还是单行插入,把SQL文件的insert语句改造成多行插入,有点困难,而且容易出问题。


推荐导入myisam表的方法:


如果备份文件都是单行数据插入的SQL,则可以把表的引擎由myisam改成innodb表,导完以后再把innodb改回myisam


备注:


查看某些变量参数:

show variables like 'innodb_log_buffer_size';
show variables like 'bulk_insert_buffer_size';
show variables like 'autocommit';


使用MySQL自带的mysqldump工具备份数据,使用的是一条语句插入所有数据。


注意:


如果在做大数据导入时,最好先把应用服务关闭,导入完毕以后开启。