【问题标题】:Packet for query is too large MySQLMySQL 查询包太大
【发布时间】:2016-05-06 21:07:28
【问题描述】:

我有一个连接到 MySQL Db / java 应用程序的 tomcat 应用程序

我一直在努力

查询包过大 1080>1024

我尝试更改 my.cnf: 在 my.cnf 中,最大数据包大小定义为 50 MB 和

socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir     = /usr
datadir = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
lower_case_table_names  = 1
skip-external-locking



bind-address = 0.0.0.0



key_buffer      = 16M
max_allowed_packet = 50M
thread_stack        = 192K
thread_cache_size       = 8
group_concat_max_len=100000
innodb_lock_wait_timeout=300
innodb_buffer_pool_size=22G
innodb_locks_unsafe_for_binlog = ON
innodb_additional_mem_pool_size=40M

我什至尝试将参数作为连接字符串的一部分传递

jdbc:mysql://serverIP:3306/dbname?maxAllowedPacket=2048000

到 jdbc 驱动程序 - 我仍然不断得到 ​​p>

查询包过大 1080>1024

每隔几个小时就会出现这种情况。

我应该检查什么?

MySQL 版本是 5.5

感谢您的帮助。

【问题讨论】:

  • 在客户端 - 是 maxAllowedPacket 还是 max_allowed_packet
  • 您正在运行什么样的查询?如果您正在操作 BLOB,则需要使用不同的技术来回推送数据。一个 50MiB 的数据包看起来很离谱。
  • 无关注释:innodb_additional_mem_pool_sizeworthless setting,除非您使用 MySQL 的内部内存分配器而不是标准的 malloc(您不应该这样做)。该设置已在更高版本的 MySQL 中删除。

标签: mysql tomcat tomcat-jdbc


【解决方案1】:

对于那些只想临时增加max_allowed_packet的大小并且不想使这个更改永久化的人,请尝试执行sql:

use your_db;
set global max_allowed_packet = 1024*1024*10; # set size to 10M  

要验证是否生效,需要打开一个新的查询会话并执行:

show VARIABLES like '%max_allowed_packet%';

请注意,此更改是临时性的,将在 mysql 重新启动时恢复为默认值。

【讨论】:

    【解决方案2】:

    看起来有些配置不正确...您在进行配置更改后是否重新启动了 MySQL?您必须配置两端的大小:

    客户端和服务器都有自己的 max_allowed_pa​​cket 变量,所以如果要处理大数据包,必须在客户端和服务器中都增加这个变量。

    但是,服务器的默认大小是 1mb (1024 kb)。鉴于您的错误说 1080>1024 我猜您的配置更改没有发生(至少不是在客户端和服务器上)。

    发生这种情况是因为查询、行或二进制日志事件大于 1mb:

    通信包是发送到 MySQL 服务器的单个 SQL 语句,发送到客户端的单个行,或者从主复制服务器发送到从服务器的二进制日志事件。

    我会尝试在客户端和服务器上达到 5mb(包括您的复制实例,如果您有的话)。您必须退回 MySQL 才能使更改生效。

    https://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html

    【讨论】:

    • 我重新启动了 MySQL 服务器 - 没有效果 - 同样的错误。除了连接url之外,还有其他方法可以在客户端定义变量吗?我如何检查
    • 您正在运行复制吗?您是否检查了客户端上参数的格式?看起来应该是蛇壳而不是骆驼壳max_allowed_packet
    • 无复制 - 一台服务器
    • 在蛇形案例中使用 url 字符串中的参数进行检查...如果可行的话会告诉你
    • 一些补充。阅读说大多数客户端默认设置为高于 1MB,因此不看好这是问题所在。一个有趣的注释是这个文档:dev.mysql.com/doc/refman/5.5/en/…,它说配置值应该是一个整数 - 你可以尝试max_allowed_packet = 51200 而不是50M(尽管文档的其他部分说这会起作用)。另外,当您对 my.cnf 进行更改时,您正在反弹 MySQL 实例,对吧?
    猜你喜欢
    • 2015-10-10
    • 2013-12-21
    • 2014-01-27
    • 2017-04-07
    • 2017-06-10
    • 1970-01-01
    • 2012-10-28
    • 2016-05-14
    • 2016-01-29
    相关资源
    最近更新 更多