zoukankan      html  css  js  c++  java
  • 从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连接会关闭,就会报这个错。

  • 相关阅读:
    愿你始终不移真心
    beautiful sentences
    (转)Design Pattern 新解(非常经典贴近生活)
    简述.Net下的应用程序授权。(转)
    thin的调试汇集
    Asp.net1.0 升级 ASP.NET 2.0 的几个问题总结 (转)
    Microsoft .NET Pet Shop 4 架构与技术分析 (转)
    面向对象编程,我的思想[上](转)
    七个问题:经济学常识 (转),真的很好,值的思考
    .NET控件收集(转)
  • 原文地址:https://www.cnblogs.com/Jansens520/p/9494679.html
Copyright © 2011-2022 走看看