每周出现3-4次SQLSTATE[HY000] [2002] Connection refused报错如何排查?
SQLSTATE[HY000] [2002] Connection refused 报错原因及排查解决方法
SQLSTATE[HY000] [2002] Connection refused属于数据库连接类报错,本质是应用发起的数据库TCP连接请求被目标端直接拒绝,每周3-4次的偶发触发场景基本可以排除固定配置错误问题,均为临时异常导致。
常见产生原因
- 数据库服务偶发重启或崩溃:数据库侧触发定时自动重启、OOM Killer因内存占用过高kill掉数据库进程,重启间隙的请求会直接返回连接拒绝
- 数据库连接数耗尽:数据库
max_connections参数配置过低,数据同步、查询高峰期的并发请求占满所有可用连接后,新的连接请求会被直接拒绝 - 网络层偶发故障:服务器间防火墙规则临时波动、交换机端口丢包、TCP握手队列占满导致SYN包被丢弃,若用域名连接数据库还可能是DNS解析偶发失败
- 服务器资源饱和:应用端或数据库端的CPU、内存、磁盘IO在高峰期被占满,无法响应新的连接请求,比如批量同步任务占满磁盘IO后,数据库无法处理新连接建立请求
- 端口监听异常:数据库侧的端口监听偶发中断,或操作系统出现临时端口占用冲突,导致短时间内端口无法正常响应连接请求
排查解决方法
数据库侧排查
- 查看数据库错误日志,匹配报错时间点是否有进程重启、崩溃、OOM相关记录,MySQL默认错误日志路径为
/var/log/mysql/error.log - 执行
show global variables like 'max_connections';查询数据库最大连接数配置,再执行show global status like 'Threads_connected';查看历史连接峰值,若峰值接近最大连接数,将max_connections调整到合理值即可
网络层排查
- 确认应用连接数据库用的是IP还是域名,若使用域名,检查报错时间点的DNS解析日志,确认是否存在解析失败问题
- 在应用服务器上部署定时端口探测脚本,每1分钟执行一次
nc -zv 数据库IP 数据库端口,记录探测失败的时间点和系统日志做匹配,确认是否为网络波动导致 - 检查两端服务器的防火墙、安全组规则,确认无临时拦截策略,可适当调大操作系统TCP参数
net.core.somaxconn、net.ipv4.tcp_max_syn_backlog,避免握手队列满导致连接被丢弃
资源层排查
- 通过监控查看报错时间点应用端、数据库端的CPU、内存、磁盘IO、网络带宽占用情况,若为同步任务高峰期资源饱和导致,可调整同步任务执行时间、做请求限流,或升级服务器配置
临时兜底方案
短时间无法定位根因时,可在应用侧的数据库连接配置中增加重试机制,连接失败后间隔13秒重试23次,基本可以覆盖绝大多数偶发连接拒绝场景。
内容的提问来源于stack exchange,提问作者Kashyap Hindocha
相关产品推荐
相关产品推荐

