MySQL 如何快速导入 dump.sql 到数据库中?

时间:2022-09-13 22:31:07

导入dump.sql最常用的方法就是:

mysql -uroot database_name < dump.sql

但是如果dump.sql文件比较大的话,导入过程将会很漫长,下面是通过调整/etc/my.cnf的相关参数,来加快导入速度。


1. log-bin

即是binlogbinlog主要有两种用途,一是数据恢复,而是数据同步,在快速导入的场景下关闭binlog将会有效提升导入速度:

#log_bin=bin

注意:在给master导入数据的时候注意不要将该参数设置为off,因为masterslave是通过binlog同步数据,关闭binlog会导致数据不一致。


2. innodb_flush_log_at_trx_commit

大批量导入数据,调整innodb_flush_log_at_trx_commit将会非常有效,该参数有三个选项:

1 -- 是默认值,每次事务提交时都会把 log-buffer 的数据写入 log file,并且 flush 中去;
2 -- 每次事务提交时都会把 log-buffer 的数据写入 log file 。但是 flush 操作并不会同时进行。该模式下,MySQL 会每秒执行一次 flush 操作;
0 -- log-buffer 将每秒一次地写入 log file 中,并且 log file 的 flush 操作同时进行。该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。

在应用中该参数到底设置多少取决于应用系统对数据安全和效率的重视程度,但是在快速导入dump.sql到数据库这样的应用场景下,建议设置为0:

innodb_flush_log_at_trx_commit=0

3. innodb_log_buffer_size

这个参数是innodb存储引擎的事务日志所使用的缓冲区大小,配合innodb_flush_log_at_trx_commit=0使用,在导入数据的时候可以将该参数相应调大一点:

innodb_log_buffer_size=128M

4. innodb_log_file_size

这个参数是innodb日志文件大小,增大该文件大小可以有效减少IO

innodb_log_file_size=1G

注意:如果导入目标数据库不是新装数据库,修改这个值有可能会导致数据库启动不起来。


5. innodb_write_io_threads

该参数是服务.ibd文件的后台IO的线程数,默认是4,在当前情况下可以适当调大一点:

innodb_write_io_threads=16

注意:不要超过服务器CPU核心的数量。


6. innodb_doublewrite

该参数默认值是1,一般slave会通过设置成0来提升数据库性能,在master中非常不建议设置为0,但是在当前场景下可以暂时将该参数设置为0:

innodb_doublewrite=0

7. 总结:

为了快速导入数据,/etc/my.cnf参数调整为:

#log_bin=bin
innodb_flush_log_at_trx_commit=0
innodb_log_buffer_size=128M
innodb_log_file_size=1G
innodb_write_io_threads=16
innodb_doublewrite=0

!!!注意:上述参数调整只是为了快速导入数据,导入完成后,需要将以上参数调整到之前的值,以保证数据安全。


ref:

http://dba.stackexchange.com/questions/83125/mysql-any-way-to-import-a-huge-32-gb-sql-dump-faster
http://blog.itpub.net/124805/viewspace-1050519/
http://blog.itpub.net/22664653/viewspace-1063134/
http://www.cnblogs.com/whiteyun/archive/2011/12/01/2270132.html
http://blog.csdn.net/summerhust/article/details/7589049
http://database.chinaunix.net/a2011/1123/1278/000001278369_1.shtml