MySQL:读取通信数据包时出错


14

我在mysql中收到此警告,

[Warning] Aborted connection 21 to db: 'MyDB' user: 'MyUser' host: 'localhost' (Got an error reading communication packets)

我已经浏览过Google的几个主题,并且根据一些建议,我max_allowed_packet128 to 512 to 1024相同的行为中增加了兴趣。

我使用的Drupal 7,和是有很多BLOB数据类型的,但1024 Mbmax_allowed_packet应该是足够的在我看来。

任何其他解决方法如何克服此警告?

编辑:

添加了一些设置作为@Rolando的建议/答案,我仍然收到相同的警告。

我的mysql配置看起来像这样:

[client]
port        = 3306
socket      = /tmp/mysql.sock
default-character-set = utf8

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16K 
max_allowed_packet = 1024M 
table_open_cache = 128 
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 192K
# Query cache disabled
thread_cache_size = 8
myisam-recover = BACKUP
max_connections = 100
thread_concurrency = 10
tmp_table_size = 128M
max_heap_table_size = 128M
log_error                = /var/log/mysql/mysql-error.log
log_slow_queries        = /var/log/mysql/mysql-slow.log
long_query_time = 2

log_warnings = 2

server-id   = 1
binlog-format = row
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
log_bin = mysql-bin
log-slave-updates
relay-log=mysqld-relay-bin
expire_logs_days        = 10
max_binlog_size         = 100M

innodb_data_home_dir = /var/db/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/db/mysql
innodb_buffer_pool_size = 8G
character-set-server = utf8
#innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 2047M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency = 8
innodb_lock_wait_timeout = 50
innodb_flush_method = O_DIRECT

[mysqldump]
quick
quote-names
max_allowed_packet = 16M
default-character-set = utf8

[mysql]
default-character-set = utf8

[myisamchk]
key_buffer_size = 32M
sort_buffer_size = 32M

[mysqlhotcopy]
interactive-timeout

[mysqld_save]
syslog

我的应用程序仅使用InnoDB,但是很少有像mysql这样的数据库,标准mysql安装附带的数据库仅是使用MyISAM引擎类型的数据库,我想这应该不是我关注的问题。

如您所见,我也具有复制功能,警告也与复制服务器中的警告相同,其配置与此相同。


您所有的表都是InnoDB吗?
RolandoMySQLDBA

@RolandoMySQLDBA,您好,是的,所有的表都是innodb,我根据您在本网站上回答的其他问题做了此操作,但仍然得到警告。

@RolandoMySQLDBA,我已经编辑了问题,并按照您的建议做了,我仍然收到警告。我在这里有mysql.cnf,您能看看吗,我可能丢失了一些东西

我开始在Drupal 6的MySQL 5.5.35上收到此错误,我从不理解这个问题,但是在升级到5.7.7时就消失了。现在返回5.7.9。我隔离了一个插入查询(少于6000个字符的文本),该查询在5.7.7上成功但在5.7.9上导致中止。它仅在远程执行而不是在本地执行时失败。因此,相同的客户端,两个版本的服务器在同一台机器上并排运行,相同的sql_mode,相同的字符集,巨大的max_allowed_pa​​cket。我被骗了 您解决了吗?
user19292

Answers:


10

我很高兴您说您所有的数据都是InnoDB,所以我可以回答如下:如果max_allowed_pa​​cket在1G时已用尽,而您仍然遇到问题,那么实际上只有两个地方可以查看:

  1. innodb_log_buffer_size:InnoDB用于写入磁盘上的日志文件的缓冲区大小(以字节为单位)。默认值为8MB。较大的日志缓冲区使大型事务可以运行,而无需在事务提交之前将日志写入磁盘。因此,如果您有大事务,则将日志缓冲区增大可以节省磁盘I / O。
  2. innodb_log_file_size:日志组中每个日志文件的大小(以字节为单位)。日志文件的总大小必须小于4GB。默认值为5MB。合理的值范围是缓冲池大小的1MB到1 / N,其中N是组中日志文件的数量。值越大,缓冲池中需要的检查点刷新活动越少,从而节省了磁盘I / O。但是,较大的日志文件也意味着在发生崩溃的情况下恢复速度较慢。

我说了大约2年前

建议

您需要增加InnoDB事务日志。以下是安全增加innodb_log_buffer_sizeinnodb_log_file_size的步骤:

步骤01:将它们添加到 /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M

步骤02:在mysql中运行

mysql> SET GLOBAL innodb_fast_shutdown = 0;

步骤03:关闭mysql

service mysql stop

步骤04:将旧日志移到一边

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

步骤05:启动mysql

service mysql start

而已。

现在,InnoDB基础结构应具有足够的日志记录空间来容纳不同大小的BLOB。

试试看 !!!


非常感谢您的答复,我已经编辑了问题以添加mysql.cnf文件。我按照您的建议做了,但仍然收到警告。我能看到max_allowed_packetmysqldump仅仅是16Mb,但我想这不是原因。key_buffer_size只是16Kb一遍又一遍,应该是MyISAM和我没有MyISAM在应用程序中使用存储引擎。

另外-对于使用apache服务器时遇到此问题的任何人,我也必须重新启动该服务。非常感谢您-我一无所知。
dgo

1

在阅读@ user19292在16年1月对这个旧问题的评论后,我从5.7.9升级到5.7.12,问题消失了。


2
我使用的是5.7.23,并且存在相同的问题
Jesus Uzcanga '18

1
此处相同,但存在5.7.26错误。在您的情况下,升级可能还会重置配置,因此这可能已经解决了您的问题。
Sliq

0

我只花了大约5到6个小时来更改选项并尝试使用不同版本的MySQL,但我总是收到错误消息。

我认为这很奇怪,因为:

  • 我的PHP代码未正确关闭db连接(这是警告,不是错误)mysql_close()或等效操作。
  • 或因为nginx缓存/代理服务器配置为在客户端关闭连接后关闭连接,所以缓存/代理服务器不会等待原始服务器(mysql也在其中)。
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.