关于MySQL错误1153:MySQL错误1153-收到了一个大于’max_allowed_packet’字节的数据包

关于MySQL错误1153:MySQL错误1153-收到了一个大于’max_allowed_packet’字节的数据包

MySQL Error 1153 - Got a packet bigger than 'max_allowed_packet' bytes

我正在导入MySQL转储,并收到以下错误。

1
2
$ mysql foo < foo.sql
ERROR 1153 (08S01) at line 96: Got a packet bigger than 'max_allowed_packet' bytes

显然,数据库中存在附件,这使得插入量非常大。

这是在我的本地计算机上,一台从MySQL软件包安装了MySQL 5的Mac。

我在哪里更改max_allowed_packet以能够导入转储?

还有什么我应该设置的吗?

仅运行mysql --max_allowed_packet=32M …会导致相同的错误。


您可能必须为客户端(您正在运行以执行导入)和正在运行并接受导入的守护程序mysqld进行更改。

对于客户端,可以在命令行上指定它:

1
mysql --max_allowed_packet=100M -u root -p database < dump.sql

另外,更改mysqld部分下的my.cnf或my.ini文件并设置:

1
max_allowed_packet=100M

或者您可以在连接到同一服务器的MySQL控制台中运行以下命令:

1
2
set global net_buffer_length=1000000;
set global max_allowed_packet=1000000000;

(对于数据包大小,请使用非常大的值。)


正如michaelpryor所说,您必须为客户端和守护程序mysqld服务器都进行更改。

他为客户端命令行提供的解决方案很好,但是ini文件并非总能做到这一点,具体取决于配置。

因此,打开终端,输入mysql以获得mysql提示符,然后发出以下命令:

1
2
set global net_buffer_length=1000000;
set global max_allowed_packet=1000000000;

保持mysql提示符处于打开状态,并在第二个终端上运行命令行SQL执行。


可以在服务器部分下的my.ini文件(在Windows中,位于 Program Files MySQL MySQL Server中)中对此进行更改,例如:

1
2
3
[mysqld]

max_allowed_packet = 10M

在mysql.com dmg软件包分发中使用MySQL时,在Mac OS X上重新启动my.cnf

默认情况下,找不到my.cnf。

您需要将/usr/local/mysql/support-files/my*.cnf之一复制到/etc/my.cnf,然后重新启动mysqld。 (如果已安装,则可以在MySQL首选项窗格中进行。)


在etc / my.cnf中,尝试将max_allowed _packet和net_buffer_length更改为

1
2
max_allowed_packet=100000000
net_buffer_length=1000000

如果这不起作用,请尝试更改为

1
2
max_allowed_packet=100M
net_buffer_length=100K

解决方法是增加MySQL守护程序的max_allowed_pa??cket。您可以通过以超级用户身份登录并运行以下命令,对正在运行的守护程序执行此操作。

1
2
3
4
5
6
7
# mysql -u admin -p

mysql> set global net_buffer_length=1000000;
Query OK, 0 rows affected (0.00 sec)

mysql> set global max_allowed_packet=1000000000;
Query OK, 0 rows affected (0.00 sec)

然后导入转储:

1
gunzip < dump.sql.gz | mysql -u admin -p database


在CENTOS 6 /etc/my.cnf的[mysqld]部分下,正确的语法是:

1
2
3
4
5
6
[mysqld]
# added to avoid err"Got a packet bigger than 'max_allowed_packet' bytes"
#
net_buffer_length=1000000
max_allowed_packet=1000000000
#

与您的问题无关,因此这里是Google的问题之一。

如果没有mysqldump SQL,则可能是您的SQL已损坏。

我只是在我的代码中意外包含未封闭的字符串文字而收到此错误。马虎的手指发生了。

对于失控的字符串,这是一条奇妙的错误消息,感谢MySQL!


使用max_allowed_packet变量发出如下命令

mysql --max_allowed_packet=32M
-u root -p database < dump.sql


max_allowed_packet设置为较高的值存在安全风险,因为攻击者可以推入更大尺寸的数据包并使系统崩溃。

因此,要调整和测试max_allowed_packet的最佳值。

最好在需要时进行更改(使用set global max_allowed_packet = xxx)
而不是将其作为my.ini或my.conf的一部分。


有时键入设置:

1
max_allowed_packet = 16M

在my.ini中不起作用。

尝试确定my.ini,如下所示:

1
set-variable = max_allowed_packet = 32M

要么

1
set-variable = max_allowed_packet = 1000000000

然后重新启动服务器:

1
/etc/init.d/mysql restart


错误:

ERROR 1153 (08S01) at line 6772: Got a packet bigger than
'max_allowed_packet' bytes Operation failed with exitcode 1

查询:

1
2
SET GLOBAL max_allowed_packet=1073741824;
SHOW VARIABLES LIKE 'max_allowed_packet';

最大值:

1
2
3
4
Default Value (MySQL >= 8.0.3)  67108864
Default Value (MySQL <= 8.0.2)  4194304
Minimum Value   1024
Maximum Value   1073741824

我在共享托管环境中工作,并且托管了一个基于Drupal的网站。我也无法编辑my.ini文件或my.conf文件。

因此,我删除了与Cache相关的所有表,因此可以解决此问题。我仍然在寻找解决此问题的完美解决方案/方式。

编辑-删除表对我来说造成了问题,因为Coz Drupal希望这些表应该存在。因此,我清空了这些表的内容,从而解决了问题。


将max_allowed_pa??cket设置为与使用mysqldump进行转储时相同(或更多)。如果您不能这样做,请再次使用较小的值进行转储。

也就是说,假设您使用mysqldump进行了转储。如果您使用其他工具,那您就一个人了。


推荐阅读