测试 TiDB 集群,业务程序频繁创建数据库连接未正常关闭,一段时间后所有新查询执行失败,客户端抛出报错 too many connections,已连接的会话还能正常操作数据。
用explain analyze分析SQL执行计划。
程序连接泄漏,频繁新建连接却未关闭,占用满 TiDB 全局最大连接数
看看processlist,tidb默认活跃连接数有好像是1000上限
确认版本和集群拓扑,检查各组件状态。
连接数超了, 执行SHOW PROCESSLIST查看会话,定位并清理无效连接
- 报错:
too many connections= TiDB 全局最大连接数被打满; - 存量旧连接正常可用、新建连接直接拒绝:完全符合连接泄漏特征(应用频繁新建连接、未执行 close 释放,连接堆积耗尽配额);
- TiDB 默认系统变量:
max_connections全局默认 4096。
很多人登录吗?
业务创建连接不关闭,数据库连接数满了,无法新建连接。
学习了
– 查看最大连接数
mysql> SHOW VARIABLES LIKE ‘max_connections’;
– – 查看总连接数
mysql> SELECT COUNT(*) FROM information_schema.processlist;
业务程序需要设计最大连接数和最长连接时间呀
这是连接泄漏:客户端不断新建连接却不归还/关闭,触达 max_connections 后新连接被拒,已有会话仍可用。处理:业务侧改用连接池并保证 close/归还;查 information_schema.PROCESSLIST / CLUSTER_PROCESSLIST 看连接来源;临时调大 max_connections 只是缓冲,根治是修泄漏。也可用 wait_timeout 回收空闲连接。
链接上限了吗