远程导入MySQL数据量大速度慢问题

1.导入方式
在MySQL中,有一对大名鼎鼎的“双一”参数,即 innodb_flush_log_at_trx_commit 与 sync_binlog 。为了安全性这两个参数默认值为1,为了快速导入脚本,我们可以临时修改下这两个参数,下面简单介绍下这两个参数:

innodb_flush_log_at_trx_commit:

innodb_flush_log_at_trx_commit默认值为1,可设置为0、1、2

如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。

如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.

如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

sync_binlog:

sync_binlog默认值为1,可设置为[0,N)

当sync_binlog =0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。

当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

这两个参数可以在线修改,若想快速导入,可以按照下面步骤来操作

# 1.进入MySQL命令行 临时修改这两个参数
set global innodb_flush_log_at_trx_commit = 2;
set global sync_binlog = 2000;
 
# 2.执行SQL脚本导入
mysql -h 127.0.0.1 -uroot -proot --default-character-set=utf8  loggerdb < C:\sys_log.sql
 
# 3.导入完成 再把参数改回来
set global innodb_flush_log_at_trx_commit = 1;
set global sync_binlog = 1;

还有另外一种场景是你的需求是新建从库,或者是不需要产生binlog,这时候导入SQL脚本时可以设置暂时不记录binlog,可以在脚本开头增加 set sql_log_bin=0; 然后再执行导入,这样速度会进一步加快。如果你的MySQL实例没有开启binlog则不需要再执行该语句了。

如果MySQL导入大型SQL文件时出现“MySQL Server has gone away”错误

1. 增加max_allowed_packet

max_allowed_packet是MySQL服务器配置文件中关键的参数之一,它定义了MySQL在一次查询中处理的最大数据包大小。如果导入的SQL文件中的语句超过了这个大小,MySQL就会断开连接并报错。

我们可以通过在MySQL配置文件中增加max_allowed_packet的值来提高其大小。例如:

[mysqld]
max_allowed_packet = 500M

Mysql
这里我们将max_allowed_packet的值设为500M,意味着MySQL可以在处理查询时处理高达500MB的数据包。

2. 分割SQL文件

如果我们无法增加max_allowed_packet的值,我们可以将大型SQL文件分割成多个小文件,并逐个导入。这样可以确保每个文件都保持在MySQL服务器的允许大小范围内。

3. 停止自动提交

当我们导入大型SQL文件时,MySQL会尝试在每个插入语句执行后自动提交。如果我们的SQL文件非常大,这会导致过多的提交,耗尽MySQL的资源,从而导致“MySQL Server has gone away”错误。

我们可以通过在命令行中使用以下语句禁用自动提交:

SET AUTOCOMMIT=0;

Mysql
然后在导入过程中手动提交:

COMMIT;

Mysql
通过这种方式,我们可以确保MySQL在每个提交后有足够的资源来继续处理查询。

你可能感兴趣的:(mysql,数据库)