我的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字段?
答案 0 :(得分:355)
通过在您的文件中的my.ini
或~/.my.cnf
部分下添加一行,更改[mysqld]
或[client]
文件:
max_allowed_packet=500M
然后重启MySQL服务,你就完成了。
有关详细信息,请参阅documentation。
答案 1 :(得分:191)
可以通过运行查询来全局设置max_allowed_packet变量。
但是,如果您未在my.ini
文件中更改它(如建议的dragon112),则即使您全局设置,该值也会在服务器重新启动时重置。
要将每个人的最大允许数据包更改为1GB,直到服务器重新启动:
SET GLOBAL max_allowed_packet=1073741824;
答案 2 :(得分:82)
我的一个初级开发人员在修改这个问题时遇到了问题,所以我想我会为linux用户更详细地扩展它:
1)打开终端
2)ssh root @ YOURIP
3)输入root密码
4)nano /etc/mysql/my.cnf(如果命令无法识别,请先执行此操作或尝试vi然后重复:yum install nano)
5)在[MYSQLD]部分下添加行:max_allowed_packet = 256M(显然可以根据需要调整大小)。他错误地把它放在文件的底部,所以它不起作用。
6)Control + O(保存)然后按ENTER(确认)然后按Control + X(退出文件)
7)service mysqld restart
8)您可以在phpmyadmin上查看变量部分的更改
答案 3 :(得分:38)
我想有些人还想知道如何在PC上找到my.ini文件。对于Windows用户,我认为最好的方法如下:
答案 4 :(得分:18)
遵循所有说明,这就是我所做的和工作:
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,直到它重新启动为止,如前所述。
答案 5 :(得分:12)
如果在执行备份时遇到此错误,可以在max_allowed_packet
中设置my.cnf
,尤其是mysqldump
。
[mysqldump]
max_allowed_packet=512M
我在执行mysqldump
时遇到此错误,但我不明白,因为我在my.cnf
部分的[mysqld]
内设置了此设置。一旦我发现我可以为[mysqldump]
设置它并设置值,我的备份就完成了。
答案 6 :(得分:9)
对于那些运行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;
答案 7 :(得分:4)
许多回答者发现了这个问题并且已经给出了解决方案。
我只想提出另一个解决方案,即从工具Mysql Workbench 中更改Glogal变量值。如果您使用Workbench在服务器上本地运行(或通过SSH连接)
,那就是当然您只需连接到您的实例并进入菜单:
服务器 - >选项文件 - >网络 - > max_allowed_packed
您设置了所需的值,然后您需要重新启动MySql服务。
答案 8 :(得分:3)
出现此错误是因为您的数据包含的值大于设定值。
只需写下max_allowed_packed=500M
或者您可以计算出500 * 1024k并使用它而不是500M(如果需要)。
现在只需重新启动MySQL。
答案 9 :(得分:3)
对于在Amazon RDS服务上运行MySQL的任何人,此更改都是通过parameter groups完成的。您需要创建一个新PG或使用现有PG(默认值为只读)。
您应该搜索max_allowed_packet
参数,更改其值,然后点击保存。
回到你的MySQL实例,如果你创建了一个新的PG,你应该将PG附加到你的实例(你可能需要重启)。 如果您更改了已附加到实例的PG,则无需重新启动即可对所有已附加该PG的实例应用更改。
答案 10 :(得分:2)
答案 11 :(得分:0)
如果您想在数据库中上传大尺寸图片或数据。只需将数据类型更改为'BIG BLOB'
。
答案 12 :(得分:0)
设置全局max_allowed_packet = 10000000000;
答案 13 :(得分:0)
在 MYSQL 5.7 中,max_allowed_packet
最多为 1G。如果你想设置为4G,它会失败,没有错误和警告。