如何更改max_allowed_pa​​cket大小


317

我的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字段?


1
BLOB字段是二进制大对象。只是一点点而已。因此,是的,您可以压缩内容,它会提供存储在BLOB字段中的其他(希望更少)位。它只是更改您放入的数据。您也需要在再次需要时解压缩BLOB内容。
Konerak 2011年

好的,谢谢,希望存在内置到mysql中的压缩功能
Muleskinner

Answers:


407

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

max_allowed_packet=500M

然后重新启动MySQL服务即可。

请参阅文档以获取更多信息。


1
即使我希望不必手动修改ini文件,也可以做到这一点,但似乎仍在感谢。
Muleskinner

62
仅供参考,这也是“ MySQL已消失”错误的解决方案
djb

1
@Konerak,谁是嘲讽者?
Pacerier

14
给某人一个答案,然后告诉他们应该去Google查询答案,这似乎毫无意义。特别是由于SO总是占据任何与编程相关的体面问题的顶级结果。谈论编程无限循环!!!Google> SO> Google> SO> Google> SO等。
Phill Healey

5
确保它在下面,[mysqld]而不是[mysql](非常相似)。花了我几分钟的时间。
Halvor Holsten Strand

225

max_allowed_pa​​cket的变量可以在全球范围通过运行查询进行设置。

但是,如果您未在my.ini文件中更改它(如dragon112所建议的那样),则即使重新设置服务器,该值也会在服务器重新启动时重置。

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

SET GLOBAL max_allowed_packet=1073741824;

7
没有帮助:(。它显示“查询确定,受影响的0行(0.00秒)”
artnikpro

15
@artnikpro它确实起作用,“查询确定,受影响的0行(0.00秒)”可能会引起误解,但这是正确的。
2014年

10
对我不起作用。SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'仍然显示旧值
博马

50
它显示旧值,因为max_allowed_pa​​cket对于现有连接不会更改。如果断开连接并重新连接,您将看到更新后的值。
Matt Crinklaw-Vogt,2015年

2
Matt Crinklaw-Vogt是对的。它需要退出并再次连接
makriria

89

我的一名初级开发人员在为我修改此文件时遇到了问题,因此我想我将为Linux用户更详细地介绍这一点:

1)打开终端

2)ssh root @您的IP地址

3)输入root密码

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

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

在此处输入图片说明

6)Control + O(保存),然后按ENTER(确认),然后按Control + X(退出文件)

7)服务mysqld重启

8)您可以在phpmyadmin的变量部分中检查更改


这实际上是在CentosOS6上完成的,我当然同意不使用root ssh访问
naw103 2015年

@tamasd我使用了一些GNU / Linux发行版(例如Debian 8和CentOS 6),sudo: command not found或者this incident will be reported因为sudo尚未安装和配置它们。最好sudo在首次设置说明时将此答案丢掉吗?
Damian Yerrick '16

不是root ssh是问题,而是密码登录。具有sudo权限的用户帐户几乎与root用户一样不安全。只需使用基于SSH密钥的身份验证即可。
Martin Schneider

关于如何登录机器的问题是旧版,他正确地在食谱中报告您必须以某种方式登录。
devsmt

41

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

  1. Win + R(“运行”的快捷方式),键入services.msc,输入
  2. 您可以找到类似“ MySQL56”的条目,右键单击它,选择属性
  3. 您可能会看到类似“ 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得到了这个答案


2
这在Windows上很重要。将MySQL作为服务并在Workbench中编辑了my.ini,这个答案使我意识到MySQL作为服务使用的是另一个my.ini,而不是我在Workbench中编辑的my.ini。
罗伯特·涅斯特罗伊

20

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

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,直到重新启动为止。


13

如果在执行备份时出现此错误,max_allowed_packet可以在中my.cnf特别设置mysqldump

[mysqldump]
max_allowed_packet=512M

执行a时mysqldump,我一直收到此错误,但我不理解,因为我在本节my.cnf下进行了设置[mysqld]。一旦确定可以设置[mysqldump]的值并设置了值,备份就可以顺利完成。


10

对于那些运行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;

5

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

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

现在,只需重新启动MySQL。


2
/etc/my.cnfMySQL实例或/etc/my.cnf.d/server.cnfMariaDB
Evgeny Lebedev

5

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

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

您只需连接到实例并进入菜单:

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

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


4

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

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

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


0

如果要上传大尺寸图像或数据库中的数据。只需将数据类型更改为即可'BIG BLOB'


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.