Node.js日志中数据库连接问题怎么查
导读:Node.js 日志定位数据库连接问题的实操流程 一、先定位日志中的错误类型 在应用日志中快速检索关键字:Error、ECONNREFUSED、ETIMEDOUT、ENOTFOUND、ER_ACCESS_DENIED_ERROR、ER_N...
Node.js 日志定位数据库连接问题的实操流程
一、先定位日志中的错误类型
- 在应用日志中快速检索关键字:Error、ECONNREFUSED、ETIMEDOUT、ENOTFOUND、ER_ACCESS_DENIED_ERROR、ER_NOT_SUPPORTED_AUTH_MODE、MongoNetworkError、Authentication failed。这些关键词通常直接指向问题类别(网络、认证、超时、配置等)。
- 同时查看数据库服务端日志,获取更详细的失败原因:
- MySQL:常见路径为 /var/log/mysql/error.log
- MongoDB:查看 mongod 日志(由 systemd 管理时可用
journalctl -u mongod)
- 若使用 Ubuntu/Debian,可用
sudo systemctl status < service>检查数据库服务是否运行,并配合sudo journalctl -u < service> -f实时跟踪日志。
二、按错误类型对照排查
| 错误现象或关键词 | 优先检查 | 快速修复 |
|---|---|---|
| ECONNREFUSED / 目标主机主动拒绝 | 数据库是否启动、监听端口是否正确、云安全组/本机防火墙是否放行 | 启动数据库;如在 Ubuntu 用 sudo systemctl start mysql;开放端口(如 sudo ufw allow 3306/tcp);核对应用配置的 host/port |
| ETIMEDOUT / 连接超时 | 网络连通性、端口可达性、数据库负载 | ping/telnet <
host>
<
port>
或 nc -vz <
host>
<
port>
测试;检查安全组/防火墙;必要时优化数据库或网络 |
| ER_ACCESS_DENIED_ERROR / Authentication failed | 用户名、密码、连接来源主机、权限是否匹配 | 在数据库中核对用户与来源主机:SELECT User,Host FROM mysql.user;
必要时执行授权:GRANT ALL PRIVILEGES ON db.* TO 'user'@'host' IDENTIFIED BY 'pwd';
FLUSH PRIVILEGES;
|
| ER_NOT_SUPPORTED_AUTH_MODE | MySQL 8.0 默认 caching_sha2_password 与旧驱动不兼容 | 方案A:改用支持该插件的驱动(如 mysql2);方案B:将用户认证方式改为 mysql_native_password:ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd';
FLUSH PRIVILEGES;
|
| MongoNetworkError / wire version 不兼容 | MongoDB 与 Node.js 驱动版本不匹配 | 升级 MongoDB 或 Node.js 驱动/Mongoose 至兼容版本(参考官方兼容矩阵) |
| 连接池耗尽、Too many connections | 连接池大小、未释放连接、连接泄漏 | 调整连接池上限(如 connectionLimit)、确保查询后 release()/end()、增加超时与回收策略 |
| SSL/TLS 握手失败 | SSL 配置、证书路径、CA 信任链 | 在连接选项中正确设置 ssl: true、ca/cert/key,或临时关闭 SSL 验证用于排查(仅测试环境) |
三、环境与网络层面的核验
- 确认数据库服务处于活动状态:
- MySQL:
sudo systemctl status mysql,未运行则sudo systemctl start mysql - MongoDB:
sudo systemctl status mongod,未运行则sudo systemctl start mongod
- MySQL:
- 核对数据库监听地址:
- MySQL:在 /etc/mysql/mysql.conf.d/mysqld.cnf 检查
bind-address,需要远程访问时设为 0.0.0.0 并重启服务
- MySQL:在 /etc/mysql/mysql.conf.d/mysqld.cnf 检查
- 防火墙与安全组:
- UFW:
sudo ufw allow < port> /tcp(如 3306 或 27017) - 云上实例需同时放行云安全组对应端口
- UFW:
- 网络连通性测试:
ping < db_host>、telnet < db_host> < port>或nc -vz < db_host> < port>验证端口可达性
四、代码与配置层面的检查
- 配置正确性:逐项核对 host、port、user、password、database,避免拼写与类型错误(如端口写成字符串)。
- 驱动与版本:确保驱动与数据库版本匹配(如 MySQL 8.0 建议用 mysql2)。
- 连接池与健康检查:
- 合理设置
connectionLimit、acquireTimeoutMillis、idleTimeoutMillis - 启动时做一次性连接校验,运行期对连接错误进行 log + 告警/重试
- 合理设置
- 异步与错误边界:
- 使用 async/await 或 Promise 正确捕获连接/查询错误
- Express 全局错误中间件记录堆栈:
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!'); } )
- 最小化复现脚本:用一段只包含连接逻辑的最小脚本直连数据库,排除业务代码干扰。
五、5 分钟应急清单
- 在应用日志中 grep 关键字:Error / ECONNREFUSED / ETIMEDOUT / ER_ACCESS_DENIED_ERROR / ER_NOT_SUPPORTED_AUTH_MODE / MongoNetworkError。
- 在服务器上确认数据库运行:
sudo systemctl status mysql(或mongod),必要时sudo systemctl restart mysql。 - 放行端口:
sudo ufw allow 3306/tcp(或 27017),并检查云安全组。 - 直连测试:
mysql -h < host> -P < port> -u < user> -p或mongo --host < host> --port < port>。 - 若报 ER_NOT_SUPPORTED_AUTH_MODE,优先安装 mysql2 或调整用户认证方式。
- 复核连接池与超时配置,确保连接可复用且异常时有 重试与告警。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Node.js日志中数据库连接问题怎么查
本文地址: https://pptw.com/jishu/754176.html
