[MySQL-应用报错"Communications link failure",同时数据库层也报错"Got timeout reading communication packets"]

1、背景

应用层报错如下:

image

 数据库层面报错:

image

 

2、查看数据库相关超时参数

image

 

net_read_timeout 是 MySQL 服务器端的一个系统变量,用于控制 服务器从客户端读取数据时的超时时间

官方定义

The number of seconds to wait for more data from a connection before aborting the read.

通俗理解:当 MySQL 服务器开始等待客户端发送数据时,如果超过 net_read_timeout 秒仍然没有收到完整的数据包,服务器就会中断连接,并记录类似 Got timeout reading communication packets 的错误日志。

触发场景

这个参数在以下两种典型场景中起作用:

    1. 执行 LOAD DATA LOCAL INFILE 命令
      客户端需要将文件内容分块发送给服务器。如果两次数据块发送的间隔超过了 net_read_timeout,服务器就会超时断开。

    2. 发送非常大的 SQL 语句(例如批量 INSERT 包含数百万行)
      当 SQL 语句的大小超过 max_allowed_packet 时,MySQL 驱动会自动将其拆分成多个数据包发送。如果发送两个数据包之间的间隔过长,也会触发 net_read_timeout

3、修改设置全局变量 net_read_timeout

set global net_read_timeout=7200;

生效方式:

1、重启应用

2、在配置文件中增加,重启数据库

 

【mysqld】

net_read_timeout=7200

观察数据库error.log,报错依旧

4、查看connect_timeout设置为10,可能出现应用链接超时的问题

image

 

connect_timeout=10 意味着:MySQL 服务器在 TCP 连接建立后,等待客户端完成认证握手(发送用户名、密码、数据库名等)的最长时间只有 10 秒
如果你的应用服务器与数据库之间网络延迟较高、MySQL 服务器负载高(慢查询堆积导致认证线程调度延迟)、或者认证插件需要额外资源(如 DNS 反向解析),很容易超过 10 秒,服务器就会断开连接,并记录 Got timeout reading communication packets

注意connect_timeout 是服务器端的参数,你已经在 JDBC URL 中添加了 connectTimeout=60000(客户端 60 秒),但服务器端只有 10 秒,最终是服务器先超时断开。

5、设置全局connect_timeout

set global connect_timeout=30;

生效方式:

重启应用后观察日志,没有继续报错,可以先观察几天,没有问题了,把配置写入到配置文档中

 

 

 

 

 
 
posted @ 2026-05-17 20:04  Linux运维-Friend  阅读(11)  评论(0)    收藏  举报