答案:需通过配置文件永久设置wait_timeout=600、interactive_timeout=600、connect_timeout=10,并重启服务生效;应用层连接池idletimeout须比wait_timeout小30秒,且须用show global variables和processlist验证。

wait_timeout 和 interactive_timeout 是 MySQL 8.0 中最直接影响连接稳定性的两个参数,设得太长会导致空闲连接堆积、连接数耗尽;设得太短又会让正常业务连接被意外断开。必须结合应用行为和服务器资源来调。
修改配置文件是最稳妥的持久化方式
直接改 /etc/my.cnf(Linux)或 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini(Windows)里的 [mysqld] 段,比运行时 SET 更可靠,重启后不丢失:
-
wait_timeout = 600:非交互式连接(比如应用连接池里的连接)空闲 10 分钟就断开 -
interactive_timeout = 600:命令行登录这类交互式连接也按同样规则处理 -
connect_timeout = 10:客户端发起 TCP 连接请求后,MySQL 必须在 10 秒内完成握手,防慢速攻击
改完必须重启服务:systemctl restart mysqld(Linux)或 net stop mysql && net start mysql(Windows)。只 reload 配置不生效。
运行时动态设置适合临时调试或灰度验证
用 SET GLOBAL 修改参数,立刻生效但不持久,适合上线前验证效果:
SET GLOBAL wait_timeout = 300;SET GLOBAL interactive_timeout = 300;SET GLOBAL connect_timeout = 15;
注意:connect_timeout 不能通过 SET GLOBAL 修改,它只读 —— 必须写进配置文件再重启。另外,已存在的连接不会立即受新 wait_timeout 影响,它们仍按建立时的值计时。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
别忽略应用层的超时协同配置
数据库端设了超时,应用层不配合照样会出问题。常见坑点:
- Java JDBC 连接串里漏掉
connectTimeout=30000&socketTimeout=60000,导致网络卡顿时线程卡死 - Python
pymysql.connect(..., connect_timeout=30)设了,但没配read_timeout/write_timeout,大查询中途断连无感知 - 连接池(如 HikariCP)的
maxLifetime和idleTimeout比 MySQL 的wait_timeout还长,池子里的连接会被 MySQL 主动 kill,抛MySQL server has gone away
建议:连接池的空闲回收时间(idleTimeout)至少比 wait_timeout 小 30 秒,留出安全余量。
检查和验证必须做两件事
改完不验证等于没改。执行这两条 SQL 确认生效:
-
SHOW GLOBAL VARIABLES LIKE '%timeout%';—— 看wait_timeout、interactive_timeout、connect_timeout是否是你设的值 -
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE TIME > 300;—— 查看有没有空闲超 5 分钟还活着的连接,判断是否真生效
特别注意:wait_timeout 在 MySQL 8.0.22+ 支持持久化(PERSIST),但旧版本或某些 Docker 镜像默认不启用,靠配置文件才是唯一保险路径。










