Server1出现MySQL client is not connected(Mysql2::Error)故障排查求助
Server1 MySQL连接失败(Mysql2::Error: MySQL client is not connected)排查与解决
问题背景
两台服务器Server1、Server2同时对接同一MySQL服务,Server2可正常通信,但Server1触发如下错误:
MySQL client is not connected (Mysql2::Error)
Server1完整报错日志:
I, [2023-06-15T06:07:30.674196 #5178] INFO -- : 2023-06-15T06:07:30+0000: [Worker(delayed_job host:94656cbd8b56 pid:5178)] Error while reserving job: MySQL client is not connected F, [2023-06-15T06:07:30.675210 #5178] FATAL -- : MySQL client is not connected (Mysql2::Error) /home/site/wwwroot/vendor/bundle/ruby/2.7.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/mysql2_adapter.rb:82:in `escape' /home/site/wwwroot/vendor/bundle/ruby/2.7.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/mysql2_adapter.rb:82:in `quote_string'
可能原因
- Server1本地网络/防火墙拦截:Server1到MySQL的网络链路中断,比如本地防火墙新增了MySQL端口拦截规则,或路由配置异常,导致无法建立TCP连接。由于Server2正常,排除MySQL服务本身故障。
- Server1连接配置错误:数据库连接参数(主机、端口、账号密码)被误改,或连接池配置过小导致连接耗尽,新请求无法获取可用连接。
- MySQL端对Server1的限制:MySQL权限表中移除了Server1 IP的访问权限;或MySQL总连接数达上限,Server1的新请求被拒绝;也可能是MySQL服务器防火墙对Server1 IP做了限流/封禁。
- mysql2 gem依赖异常:gem安装文件损坏,或版本与ActiveRecord 5.2.3不兼容,导致客户端连接逻辑出错。从报错栈看,是调用
escape方法时发现连接已失效。 - 长连接超时未重连:MySQL的
wait_timeout/interactive_timeout设置过短,Server1的长连接被主动断开,但应用未配置自动重连,后续请求复用失效连接对象。
解决步骤
1. 排查网络连通性
- 在Server1执行
telnet <mysql_host> <mysql_port>或nc -zv <mysql_host> <mysql_port>,测试端口连通性。 - 检查Server1本地防火墙(如ufw、iptables)是否拦截MySQL端口,同时确认MySQL服务器端防火墙允许Server1 IP访问。
- 执行
netstat -anp | grep mysql,查看是否有大量TIME_WAIT/CLOSE_WAIT状态的异常连接。
2. 验证连接配置
- 对比Server1与Server2的
database.yml配置文件,确认主机、端口、账号密码、数据库名完全一致。 - 在Server1用命令行手动连接:
mysql -h <mysql_host> -P <mysql_port> -u <user> -p,验证权限和连接是否正常。
3. 检查MySQL端限制
- 登录MySQL执行
SHOW GRANTS FOR '<db_user>'@'<server1_ip>';,确认Server1 IP有对应数据库的访问权限。 - 执行
SHOW VARIABLES LIKE 'max_connections';和SHOW STATUS LIKE 'Threads_connected';,检查当前连接数是否接近上限。 - 查看MySQL错误日志,搜索是否有针对Server1 IP的连接拒绝记录。
4. 修复gem依赖
- 在Server1重新安装mysql2 gem:
bundle install --force mysql2,确保文件完整。 - 确认mysql2 gem版本与ActiveRecord 5.2.3兼容(推荐2.1.x或2.2.x版本,避免过高版本的兼容性问题)。
5. 优化连接池与重连机制
- 在
database.yml中添加reconnect: true开启自动重连(注意:自动重连可能导致事务上下文丢失,需结合业务场景评估)。 - 调整
pool: <合理数值>,根据Server1的并发请求数设置连接池大小,避免连接耗尽。 - 检查应用代码,确保请求完成后正确释放连接,避免连接泄漏。
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

