从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连接会关闭,就会报这个错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值