我的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错误1153的可能重复-收到的数据包大于'max_allowed_pa​​cket'字节

#1 楼

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

max_allowed_packet=500M


有关更多信息,请参阅文档。

评论


即使我希望不必手动修改ini文件也可以实现,但似乎仍在感谢。

– Muleskinner
2011年11月9日在9:24

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

– djb
13年10月10日在14:59

@Konerak,谁是嘲讽者?

–起搏器
2015年4月1日在5:21



给某人一个答案,然后告诉他们应该去Google查询答案,这似乎毫无意义。特别是因为,对于任何与编程相关的体面问题,SO始终占据最重要的几个结果。谈论编程无限循环!!! Google> SO> Google> SO> Google> SO等。

– Phill Healey
16年2月19日在11:06

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

– Halvor Holsten Strand
16 Dec 15'在8:26

#2 楼

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

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

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

SET GLOBAL max_allowed_packet=1073741824;


评论


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

– artnikpro
2014年7月3日在16:06



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

–AnnTea
2014年8月4日在12:09

对我不起作用。在变量_name ='max_allowed_pa​​cket'的地方显示变量

–波马
15年5月22日在22:47

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

–马特·克林克劳夫·沃格特
15年7月29日在20:51



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

–makriria
16年1月28日在9:16

#3 楼

我的一名初级开发人员在为我修改此文件时遇到了问题,因此我认为我将针对Linux用户对其进行更详细的介绍:

1)打开终端

2)ssh root @ YOURIP

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 restart

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

评论


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

– naw103
2015年6月16日,0:38



@tamasd我使用的一些GNU / Linux发行版(如Debian 8和CentOS 6)产生sudo:找不到命令,否则将报告此事件,因为尚未安装和配置sudo。最好在第一次设置sudo的说明中乱扔这个答案吗?

–达米安·耶里克(Damian Yerrick)
16 Sep 15 '16:38

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

–马丁·施耐德(Martin Schneider)
17 Mar 1 '17 at 21:43



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

–devsmt
18年2月1日在8:15

#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中编辑的my.ini。

– Robert Niestroj
19年1月25日在9:04

#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)


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

#6 楼

如果在执行备份时出现此错误,则可以在max_allowed_packet中设置my.cnf,尤其是对于mysqldump。了解,因为我在mysqldump部分的my.cnf中设置了此设置。一旦确定了可以为[mysqld]设置的值,然后设置了值,备份就可以顺利完成。

#7 楼

对于运行wamp mysql服务器的用户

Wamp tray图标-> 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。

评论


到MySQL实例的/etc/my.cnf或对于MariaDB的/etc/my.cnf.d/server.cnf

– Evgeny Lebedev
16年5月20日在20:24

#9 楼

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

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

您只需连接到实例并进入菜单: >选项文件->网络-> max_allowed_pa​​cked


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

#10 楼

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

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

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

#11 楼

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

#12 楼

设置全局max_allowed_pa​​cket = 10000000000;