一尘不染

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

mysql

我在 mysql 中收到此警告,

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

我在谷歌浏览过几个主题,根据一些建议,我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 引擎类型的数据库,但我想这不应该是我关心的问题。

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


阅读 88

收藏
2022-10-13

共1个答案

一尘不染

我很高兴你说你所有的数据都是 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。但较大的日志文件也意味着在发生崩溃时恢复速度较慢。

建议

您需要增加 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

Step 04 : 把旧的原木移到一边

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

步骤05:启动mysql

service mysql start

而已。

InnoDB 基础设施现在应该有足够的日志空间来存储不同大小的 BLOB。

试试看 !!!

2022-10-13