如何更改 max_allowed_pa​​cket 大小

Posted

技术标签:

【中文标题】如何更改 max_allowed_pa​​cket 大小【英文标题】:How to change max_allowed_packet size 【发布时间】:2011-12-25 03:18:57 【问题描述】:

我的 mysql 数据库中的 BLOB 字段出现问题 - 当上传大于约 1MB 的文件时,我收到错误 Packets larger than max_allowed_packet are not allowed.

这是我尝试过的:

在 MySQL 查询浏览器中,我运行了 show variables like 'max_allowed_packet',它给了我 1048576。

然后我执行查询 set global max_allowed_packet=33554432 后跟 show variables like 'max_allowed_packet' - 它给了我预期的 33554432。

但是当我重新启动 MySQL 服务器时,它会神奇地回到 1048576。我在这里做错了什么?

额外问题,是否可以压缩 BLOB 字段?

【问题讨论】:

BLOB 字段是二进制大对象。这只是一点点。所以是的,您可以压缩内容,它会提供您存储在 BLOB 字段中的其他(并且希望更少)位。它只是更改您放入其中的数据。当您再次需要 BLOB 内容时,您也必须对其进行解压缩。 好的,谢谢,希望 mysql 中存在压缩功能 MySQL Error 1153 - Got a packet bigger than 'max_allowed_packet' bytes的可能重复 dba.stackexchange.com/questions/45087/… 【参考方案1】:

通过在您的文件中包含[mysqld][client] 部分下的单行来更改my.ini~/.my.cnf 文件:

max_allowed_packet=500M

然后重启MySQL服务就完成了。

有关详细信息,请参阅documentation。

【讨论】:

Thanks 似乎有效,尽管我曾希望无需手动修改 ini 文件就可以做到这一点。 仅供参考的读者,这也是“MySQL has gone away”错误的解决方案 @Konerak,谁是嘲讽者? 给某人一个答案然后告诉他们应该去谷歌搜索答案似乎毫无意义。特别是因为对于任何体面的编程相关问题,SO 总是占据几个最佳结果。谈论编程一个无限循环! Google > SO > Google > SO > Google > SO 等等。 确保它在[mysqld] 下而不是[mysql] 下(非常相似)。花了我几分钟的时间。【参考方案2】:

max_allowed_packet 变量可以通过运行查询来全局设置。

但是,如果您不在my.ini 文件中更改它(如dragon112 建议的那样),该值将在服务器重新启动时重置,即使您将其设置为全局。

将每个人的最大允许数据包更改为 1GB,直到服务器重新启动:

SET GLOBAL max_allowed_packet=1073741824;

【讨论】:

没有帮助 :(。它显示“查询正常,0 行受影响(0.00 秒)” @artnikpro 它确实有效,“查询​​正常,0 行受影响(0.00 秒)”可能会让人产生误导,但它是正确的。 对我不起作用。 SHOW VARIABLES WHERE variable_name = 'max_allowed_packet' 仍然显示旧值 它显示旧值,因为 max_allowed_pa​​cket 对于现有连接不会更改。如果您断开连接并重新连接,您将看到更新后的值。 Matt Crinklaw-Vogt 是对的。它需要退出并重新连接【参考方案3】:

我的一个初级开发人员在为我修改这个时遇到了问题,所以我想我会为 linux 用户更详细地扩展这个:

    打开终端

    ssh root@YOURIP

    输入root密码

    nano /etc/mysql/my.cnf(如果无法识别命令,请先执行此操作或尝试vi,然后重复:yum install nano)

    [MYSQLD] 部分下添加行:max_allowed_packet=256M(显然可以根据需要调整大小)。他犯了一个错误,先把它放在文件的底部,所以它不起作用。

    Control + O(保存)然后Enter(确认)然后Control + X(退出文件)

    service mysqld restart

    您可以在 phpmyadmin 上查看变量部分的更改

【讨论】:

这实际上是在 CentosOS6 上完成的,我当然同意不使用 root ssh 访问权限 @tamasd 我使用过的一些 GNU/Linux 发行版(如 Debian 8 和 CentOS 6)会生成 sudo: command not foundthis incident will be reported,因为尚未安装和配置 sudo。将这个答案与第一次设置sudo 的说明一起乱扔会更好吗? 问题不是root ssh,而是密码登录。具有 sudo 权限的用户帐户几乎与 root 一样不安全。只需使用基于 SSH 密钥的身份验证。 如何登录机器的问题是OT,他在他的食谱中正确地报告了你必须以某种方式登录。【参考方案4】:

我想有些人还想知道如何在您的 PC 上找到 my.ini 文件。对于windows用户,我认为最好的方法如下:

    Win+R(“运行”的快捷键),输入 services.msc,回车 您可以找到类似“MySQL56”的条目,右键单击它,选择属性 你可以看到类似 "D:/Program Files/MySQL/MySQL Server 5.6/bin\mysqld" --defaults-file="D:\ProgramData\MySQL\MySQL Server 5.6\my.ini" MySQL56李>

我从http://bugs.mysql.com/bug.php?id=68516得到这个答案

【讨论】:

这在 Windows 上很重要。将 MySQL 作为服务并在 Workbench 中编辑了 my.ini,这个答案让我意识到 MySQL 作为服务使用另一个 my.ini,然后是我在 Workbench 中编辑的那个。【参考方案5】:

按照所有说明,这就是我所做和工作的:

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              20 |
+-----------------+
1 row in set (0.00 sec)

mysql> select @max_allowed_packet //Mysql do not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet; //That is better... I have max_allowed_packet=32M inside my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> **SET GLOBAL max_allowed_packet=1073741824**; //Now I'm changing the value.
Query OK, 0 rows affected (0.00 sec)

mysql> select @max_allowed_packet; //Mysql not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value. And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

因此,正如我们所见,max_allowed_pa​​cket 已在 my.ini 之外更改。

让我们离开会话并再次检查:

mysql> exit
Bye

C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              21 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value still here and And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Now I will stop the server
2016-02-03 10:28:30 - Server is stopped

mysql> SELECT CONNECTION_ID();
ERROR 2013 (HY000): Lost connection to MySQL server during query


Now I will start the server
2016-02-03 10:31:54 - Server is running


C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|               9 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The previous new value has gone. Now I see what I have inside my.ini again.
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

结论,如前所述,在 SET GLOBAL max_allowed_pa​​cket=1073741824 之后,服务器将拥有新的 max_allowed_pa​​cket 直到重新启动。

【讨论】:

【参考方案6】:

如果在执行备份时遇到此错误,可以在my.cnf 中设置max_allowed_packet,尤其是mysqldump

[mysqldump]
max_allowed_packet=512M

我在执行mysqldump 时不断收到此错误,我不明白,因为我在my.cnf[mysqld] 部分下设置了这个。一旦我发现我可以为[mysqldump] 设置它并设置值,我的备份就完成了,没有问题。

【讨论】:

【参考方案7】:

对于那些运行 wamp mysql 服务器的人

Wamp 托盘图标 -> MySql -> my.ini

[wampmysqld]
port        = 3306
socket      = /tmp/mysql.sock
key_buffer_size = 16M
max_allowed_packet = 16M        // --> changing this wont solve
sort_buffer_size = 512K

向下滚动到最后,直到找到

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

在中间添加packet_size这一行

[mysqld]
port=3306
max_allowed_packet = 16M
explicit_defaults_for_timestamp = TRUE

检查它是否适用于这个查询

Select @@global.max_allowed_packet;

【讨论】:

【参考方案8】:

出现此错误是因为您的数据包含大于设置的值。

只需写下max_allowed_packed=500M 或者您可以计算 500*1024k 并根据需要使用它而不是 500M。

现在只需重新启动 MySQL。

【讨论】:

/etc/my.cnf 用于 MySQL 实例,或/etc/my.cnf.d/server.cnf 用于 MariaDB【参考方案9】:

对于在 Amazon RDS 服务上运行 MySQL 的任何人,此更改通过 parameter groups 完成。您需要创建一个新的 PG 或使用现有的 PG(除了默认的,它是只读的)。

您应该搜索max_allowed_packet 参数,更改其值,然后点击保存。

回到您的 MySQL 实例,如果您创建了一个新的 PG,您应该将 PG 附加到您的实例(您可能需要重新启动)。 如果您更改了已附加到您的实例的 PG,则更改将在不重新启动的情况下应用到所有附加了该 PG 的实例。

【讨论】:

【参考方案10】:

许多回答者发现了问题并已经给出了解决方案。

我只是想提出另一种解决方案,即从工具 Mysql Workbench 中更改 Glogal 变量值。当然,如果您使用在服务器上本地运行的 Workbench(或通过 SSH 连接)

您只需连接到您的实例并继续菜单:

服务器 -> 选项文件 -> 网络 -> max_allowed_pa​​cked

您设置了所需的值,然后您需要重新启动 MySql 服务

【讨论】:

【参考方案11】:

使用 MySql Workbench 设置允许的最大数据包大小并重启服务器

【讨论】:

【参考方案12】:

在 MYSQL 5.7 中,max_allowed_packet 最多为 1G。如果你想将它设置为 4G,它会失败而没有错误和警告。

【讨论】:

【参考方案13】:

如果您想在数据库中上传大尺寸图像或数据。只需将数据类型更改为'BIG BLOB'

【讨论】:

【参考方案14】:

设置全局 max_allowed_pa​​cket=10000000000;

【讨论】:

max_allowed_pa​​cket 的最大值为 1073741824

以上是关于如何更改 max_allowed_pa​​cket 大小的主要内容,如果未能解决你的问题,请参考以下文章

如何检查和设置max_allowed_pa​​cket mysql变量[重复]

MySQL 抱怨 max_allowed_pa​​cket 违规,查询短于允许的限制

MySQL 错误 1153 - 收到的数据包大于“max_allowed_pa​​cket”字节

MySQL 错误 1153 - 收到的数据包大于“max_allowed_pa​​cket”字节

在 AWS RDS 上托管的数据库上导入 SQL 脚本期间出现 MySql 错误“max_allowed_pa​​cket”字节

运行 automysqlbackup 时出错