远程租用的MySQL连接启动时报ETIMEDOUT超时错误该如何解决?
远程MySQL连接ETIMEDOUT超时排查与解决方案
启动时报错堆栈:
Error: connect ETIMEDOUT at Connection._handleConnectTimeout (I:\Websites\backend\node_modules\mysql\lib\Connection.js:409:13) at Object.onceWrapper (events.js:519:28) at Socket.emit (events.js:400:28) at Socket._onTimeout (net.js:484:8) at listOnTimeout (internal/timers.js:557:17) at processTimers (internal/timers.js:500:7) -------------------- at Protocol._enqueue (I:\Websites\backend\node_modules\mysql\lib\protocol\Protocol.js:144:48) at Protocol.handshake (I:\Websites\backend\node_modules\mysql\lib\protocol\Protocol.js:51:23) at Connection.connect (I:\Websites\backend\node_modules\mysql\lib\Connection.js:116:18) at Object.<anonymous> (I:\Websites\backend\Main.js:20:4) at Module._compile (internal/modules/cjs/loader.js:1072:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10) at Module.load (internal/modules/cjs/loader.js:937:32) at Function.Module._load (internal/modules/cjs/loader.js:778:12) at Function.executeUserEntryPoint [as runMain] (internal/run_main.js:76:12) at internal/main/run_main_module.js:17:47 { errorno: 'ETIMEDOUT', code: 'ETIMEDOUT', syscall: 'connect', fatal: true }
第一步:基础网络层排查
- 先在运行服务的本地设备上用telnet测试端口连通性,命令为
telnet [数据库服务器IP] [MySQL端口,默认3306],如果telnet也超时,直接定位为网络层面问题,与代码逻辑无关 - 也可以用nc命令测试连通性:
nc -zv [数据库服务器IP] 3306,根据返回结果判断是否能正常建立连接 - 排查本地设备的出口防火墙、当前使用的运营商网络是否封禁了3306端口的出站请求,多数家用宽带、企业内网会默认封禁3306端口的公网访问
第二步:第三方数据库服务器侧排查
- 确认第三方服务器的入站安全组/防火墙规则,是否放行了本地设备的公网IP的3306端口访问,多数云服务商默认安全组不会放行3306端口的公网访问,或仅允许特定白名单IP访问
- 登录第三方服务器执行
systemctl status mysql(部分发行版为mysqld),确认MySQL服务处于active运行状态 - 检查MySQL配置文件中的bind-address参数,确认配置为
0.0.0.0(允许所有IP访问,生产环境不建议,优先绑定指定访问IP)或未绑定固定本地回环IP,默认安装的MySQL通常仅监听127.0.0.1,仅支持本地访问 - 检查数据库账号的访问权限,连接使用的账号需要授权对应公网IP的访问权限,授权参考语句为
grant all privileges on 库名.* to '用户名'@'你的本地公网IP' identified by '密码';,如果仅授权了本地访问权限,部分场景下也会返回超时错误
第三步:代码侧配置优化
- 单次直连的模式建议改为连接池模式,避免长连接被服务器端主动断开后没有自动重连机制,node-mysql连接池参考配置:
const mysql = require('mysql'); const pool = mysql.createPool({ host: '你的数据库服务器IP', user: '数据库用户名', password: '数据库密码', database: '目标库名', connectionLimit: 10, acquireTimeout: 30000, // 连接超时调整为30秒 connectTimeout: 30000 });
- 新增连接错误自动重连逻辑,单次连接场景下可以监听error事件,检测到fatal级错误时自动重建数据库连接
其他常见原因排查
- 第三方服务器的公网带宽跑满、CPU/内存负载过高,导致MySQL无法响应新的连接请求
- 本地公网IP发生变更,之前安全组白名单配置的是旧IP,新IP未被放行
- 第三方服务商存在区域性网络故障,可以尝试用其他地区的设备测试数据库连接,确认是否为网络线路问题
内容的提问来源于stack exchange,提问作者Adalbert Steiner
相关产品推荐
相关产品推荐

