【问题标题】:How to change max_allowed_packet size如何更改 max_allowed_pa​​cket 大小
【发布时间】: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 字段?

【问题讨论】:

标签: mysql


【解决方案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 用户更详细地扩展这个:

  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 上查看变量部分的更改

【讨论】:

  • 这实际上是在 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用户,我认为最好的方法如下:

  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得到这个答案

【讨论】:

  • 这在 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
                  猜你喜欢
                  • 2017-01-15
                  • 2015-07-11
                  • 2017-11-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-08-31
                  • 1970-01-01
                  • 2012-10-05
                  • 2011-09-07
                  相关资源
                  最近更新 更多