首页/数据/数据库速查/连接超时与空闲回收参数

连接超时与空闲回收参数

连接被莫名断开多与超时参数有关:wait_timeout、interactive_timeout、net_read_timeout,以及中间件/负载均衡的空闲回收。

数据库速查数据更新于 2026-10-13

连接超时参数是什么

MySQL 侧与连接生命周期相关的超时分成两类:空闲超时(wait_timeout、interactive_timeout)决定服务端多久回收没有活动的连接;读写超时(net_read_timeout、net_write_timeout)决定一次网络收发等待多久算失败。客户端报 Communications link failure、连接池偶发报错,多数要先在这几个参数和中间网络设备之间做取舍。

基本信息

空闲超时wait_timeout(默认 28800 秒)、interactive_timeout
读写超时net_read_timeout(默认 30 秒)、net_write_timeout(默认 60 秒)
连接超时connect_timeout,握手阶段等待时间
生效范围GLOBAL 影响新建连接;会话级直接改当前连接
排查入口SHOW VARIABLES LIKE '%timeout%'、SHOW PROCESSLIST

典型使用场景

  • 夜间无常访问的定时任务清晨首次执行报连接断开:空闲超时把连接回收了
  • 应用与数据库之间隔着负载均衡或防火墙:设备空闲回收时间常短于 MySQL 默认值
  • 报表类长查询被中断:net_read_timeout 太短或中间设备掐断长连接
  • 连接池存活连接数虚高:闲置连接未及时释放,需要与超时参数对齐
  • 安全合规要求收紧空闲连接:把 wait_timeout 调小,配合连接池校验

查看与调整

查看与调整
SHOW VARIABLES LIKE '%timeout%';              # 一次性看全部超时项
SHOW VARIABLES LIKE 'wait_timeout';           # 非交互连接空闲上限
SHOW VARIABLES LIKE 'interactive_timeout';    # 交互式客户端空闲上限
SET GLOBAL wait_timeout = 1800;                # 只影响之后新建的连接
SET SESSION wait_timeout = 600;                # 当前连接立即生效
SHOW PROCESSLIST;                              # 看连接时间与状态

客户端侧保活与校验

客户端侧保活与校验
# JDBC 连接串:连接超时 5s、读超时 30s
jdbc:mysql://db:3306/app?connectTimeout=5000&socketTimeout=30000&useSSL=false

# HikariCP 常用校验配置
maximumPoolSize=20
idleTimeout=300000
dataSource.connectionTimeout=5000
# testWhileIdle + validationQuery=SELECT 1 可剔除已被服务端回收的连接

参数选型对照

参数控制什么调小/调大的后果
wait_timeout非交互连接空闲多久被关调小连接池更易踩坑;调大则空闲连接长期占用内存
interactive_timeout交互式客户端空闲多久被关mysql 命令行、GUI 工具走它,别只改错那个
net_read_timeout等待客户端发来数据的时长太小会误杀慢查询;太大则异常连接迟迟不释放
connect_timeout握手阶段等待时长网络抖动场景适当放大,避免误报连接失败
wait_timeout 与 interactive_timeout 在会话建立时会相互影响:客户端带 CLIENT_INTERACTIVE 标志时用 interactive_timeout,其余用 wait_timeout,因此只调 wait_timeout 对 GUI 工具往往无效。
盲目把超时调大只是把问题推后:空闲连接断开引发的报错应该用连接池校验与重试解决;如果中间设备(SLB、防火墙、NAT)有更短的回收时间,MySQL 端调到 24 小时也拦不住它掐连接。

易错点

  • 只调大 wait_timeout 不配连接池校验:连接池仍持有已被中间设备掐断的死连接,报错照旧
  • 把 socketTimeout 设得比业务最慢查询还小:正常长查询被客户端主动断开,日志里表现为随机失败
  • 连接池 maxLifetime 大于服务端与设备的空闲回收时间:连接寿命超过上游限制,必然出现坏连接
  • 看到 Communications link failure 就改数据库参数,忽略 MySQL 错误日志里的 Aborted connection 与设备日志
  • 在 GLOBAL 层改超时后不记录变更:下次重启回到默认值,问题复发时又要重查一遍

数据来源与参考

  • MySQL 8.0 Reference Manual: Server System Variables

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌