debian

Debian Node.js 日志中的数据库连接问题

小樊
41
2025-11-20 18:53:47
栏目: 编程语言

Debian 上 Node.js 数据库连接问题的排查与修复

一 快速定位流程

二 常见错误与对应修复

错误现象或关键词 典型根因 修复要点
ETIMEDOUT 网络不通、数据库响应慢、超时阈值过低 检查网络与路由;适当增大客户端 connectTimeout/acquireTimeout(如 10000 ms);优化慢查询与索引;必要时提升数据库性能或超时阈值。
ECONNREFUSED 目标主机未监听端口、服务未启动、端口/地址错误、防火墙阻断 确认数据库已启动并监听正确端口;核对 host/port;开放防火墙端口(如 3306);远程访问时确保监听 0.0.0.0 而非仅 127.0.0.1
ER_ACCESS_DENIED_ERROR / Access denied 用户名/密码错误、权限不足、主机限制、认证插件不匹配 校验凭据;检查用户 host 白名单(如 ‘user’@‘%’ 或指定网段);必要时调整 MySQL 8.0 的认证插件(如 caching_sha2_password 兼容设置);执行 SHOW GRANTSFLUSH PRIVILEGES
ER_NOT_SUPPORTED_AUTH_MODE MySQL 8 默认认证插件与驱动不匹配 为用户设置兼容插件(如 mysql_native_password),或升级驱动/客户端以支持 caching_sha2_password
Cannot enqueue Handshake after invoking quit 应用侧连接未正确释放、重复关闭、连接池误用 规范连接生命周期:获取连接后 release/end;在异常分支也确保释放;避免对已关闭的连接操作。
连接池耗尽/Too many connections 并发过高、池上限过小、连接泄漏 调整 connectionLimit/max;确保每次使用后释放;监控并回收泄漏连接;必要时扩容数据库或限流。

三 配置与代码检查清单

四 最小可用示例 MySQL 连接

// db.js
const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: process.env.DB_HOST || '127.0.0.1',
  port: process.env.DB_PORT || 3306,
  user: process.env.DB_USER,
  password: process.env.DB_PASS,
  database: process.env.DB_NAME,
  ssl: process.env.DB_SSL === 'true', // 生产建议开启
  connectionLimit: 10,
  connectTimeout: 10000,
  acquireTimeout: 10000,
  timeout: 30000
});

async function test() {
  let conn;
  try {
    conn = await pool.getConnection();
    const [rows] = await conn.execute('SELECT 1 AS ok');
    console.log('DB OK:', rows[0].ok);
  } catch (err) {
    console.error('DB ERROR:', err);
    throw err;
  } finally {
    if (conn) conn.release();
  }
}

module.exports = { pool, test };

五 需要你提供的关键信息

0
看了该问题的人还看了