• 远程导入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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    还有另外一种场景是你的需求是新建从库,或者是不需要产生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
    
    • 1
    • 2

    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;
    
    • 1

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

    COMMIT;
    
    • 1

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

  • 相关阅读:
    Sentinel控制台配置 持久化到nacos
    468. 验证IP地址-c语言
    每天一个设计模式之解释器模式(Interpreter Pattern)
    git远程仓库分支推送与常见问题
    Socket通信
    UDP报文结构
    三角网生成等高线
    Spring Boot 配置 jar 包外面的 Properties 配置文件
    关于SQL的返回行数top
    微信小程序中下载xlsx文件
  • 原文地址:https://blog.csdn.net/weixin_44538423/article/details/132836749