如何更改 max_allowed_packet 大小
Posted
技术标签:
【中文标题】如何更改 max_allowed_packet 大小【英文标题】: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_packet 对于现有连接不会更改。如果您断开连接并重新连接,您将看到更新后的值。
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 found
或 this 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_packet 已在 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_packet=1073741824 之后,服务器将拥有新的 max_allowed_packet 直到重新启动。
【讨论】:
【参考方案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_packed
您设置了所需的值,然后您需要重新启动 MySql 服务。
【讨论】:
【参考方案11】:使用 MySql Workbench 设置允许的最大数据包大小并重启服务器
【讨论】:
【参考方案12】:在 MYSQL 5.7 中,max_allowed_packet
最多为 1G。如果你想将它设置为 4G,它会失败而没有错误和警告。
【讨论】:
【参考方案13】:如果您想在数据库中上传大尺寸图像或数据。只需将数据类型更改为'BIG BLOB'
。
【讨论】:
【参考方案14】:设置全局 max_allowed_packet=10000000000;
【讨论】:
max_allowed_packet 的最大值为 1073741824以上是关于如何更改 max_allowed_packet 大小的主要内容,如果未能解决你的问题,请参考以下文章
如何检查和设置max_allowed_packet mysql变量[重复]
MySQL 抱怨 max_allowed_packet 违规,查询短于允许的限制
MySQL 错误 1153 - 收到的数据包大于“max_allowed_packet”字节
MySQL 错误 1153 - 收到的数据包大于“max_allowed_packet”字节
在 AWS RDS 上托管的数据库上导入 SQL 脚本期间出现 MySql 错误“max_allowed_packet”字节