• 从navicat中导入sql文件过大:Got a packet bigger than 'max_allowed_packet' bytes


    失败背景:刚才通过navicat向本地mysql数据库中导入sql文件。第一个sql文件(多个表)大小为967M,导入成功;

    第二个sql(单个表)大小为50.1M,导入失败。

    1.在navicat中按F6进入mysql的命令界面

    输入命令: mysql>show VARIABLES like '%max_allowed_packet%';

    显示:

    +--------------------------+------------+
    | Variable_name            | Value      |
    +--------------------------+------------+
    | max_allowed_packet       | 4194304    |
    | slave_max_allowed_packet | 1073741824 |
    +--------------------------+------------+
    2 rows in set

    (1)显示:最大允许包(max_allowed_packet)等于4M,最大允许包(slave_max_allowed_packet)等于1G;

    (2)至此,发现:第一个sql是967M,此sql文件包含若干个表。大小在主从之间,导入成功。但是第二个sql为50.1M,此sql只包含一个表,导入失败,提示:Got a packet bigger than 'max_allowed_packet' bytes

    (3)猜想:

    ①这个max_allowed_packet所指的packet限制的是应该单个表而不是整个sql文件的大小,因为导入sql时是一张一张表得连续insert,所以限制的是一张表的大小,显然第二个sql文件是单个表大于4M;

    ②另外,不是还有个slave_max_allowed_packet,它的大小1G是大于两个sql文件的,为什么第二个sql还是失败了,这个应该是限制sql文件大小的,而第一次导入的sql中的都是若干个小表,第二次导入的sql是一张大的日志表。

    2.现在,把max_allowed_packet设置大于50.1M试试,我设置为160M,输入命令

    mysql>set global max_allowed_packet = 1024*1024*160;

    Query OK, 0 rows affected;

    再次导入这个50.1M的sql,成功!没报错!

    证明猜想①是对的,max_allowed_packet就是来限制单个表的大小,而不是sql文件大小。

    max_allowed_packet 针对的是一个事务中的一行记录大小,当一行记录超过了限制的大小,将会报错。sql文件中每次insert完进同一张表的所有数据被称为一个数据包(packet),max_allowed_packet就是来限制这个的大小的阈值,大于这个值,mysql的I/O连接会关闭,就会报这个错。

  • 相关阅读:
    centos7安装supervisor
    redis4.0 cluster搭建
    网易cetus数据库中间件安装-读写分离版本
    mongodb副本集基于centos7部署
    C# 单例模式实现
    HttpWebRequest的GET和POST方法
    C#中$的用法
    判断一个表是否存在
    C# 继承的一些解释
    C# 虚方法和抽象方法
  • 原文地址:https://www.cnblogs.com/Jansens520/p/9494679.html
Copyright © 2020-2023  润新知