MySQL 5.7连接中止报错求助:Node.js应用运行异常
修复MySQL 5.7 "Got an error reading communication packets" 连接中断问题
我之前在维护Node.js+MySQL 5.7的项目时,刚好碰到过一模一样的报错,结合当时的排查经验,给你几个靠谱的修复方向:
先明确问题根源
你能正常登录MySQL控制台,说明MySQL服务本身是健康的,报错**"Got an error reading communication packets"** 基本都是应用与数据库的交互配置不匹配,或者网络/超时参数设置不合理导致的,不用再折腾重装MySQL啦。
1. 检查Node.js MySQL驱动的连接配置
先看你用的是mysql还是mysql2模块,重点调整超时和保活相关参数,默认配置很容易在长查询或高并发下断连:
- 如果是单个连接,试试加上这些配置:
const mysql = require('mysql'); // 或 require('mysql2') const conn = mysql.createConnection({ host: 'localhost', user: 'root', password: '你的密码', database: 'baza', connectTimeout: 60000, // 延长连接超时到60秒 acquireTimeout: 60000, timeout: 60000, keepAlive: true, // 开启TCP长连接保活 keepAliveInitialDelay: 30000 // 30秒后开始发送保活包 }); - 如果用连接池,还要检查连接池的
connectionLimit(不要设置过小)、waitForConnections(设为true避免直接报错):const pool = mysql.createPool({ // 其他基础配置 connectionLimit: 10, // 根据你的并发量调整 waitForConnections: true, queueLimit: 0 });
另外,务必确保每次查询后正确释放连接(连接池模式下调用conn.release(),单连接模式下用conn.end()关闭闲置连接)。
2. 调整MySQL的网络参数配置
编辑MySQL的配置文件(Ubuntu下通常是/etc/mysql/mysql.conf.d/mysqld.cnf),修改以下关键参数:
# 增大允许的数据包大小,避免大查询/传输时截断 max_allowed_packet = 64M # 延长闲置连接超时时间(和驱动超时保持一致) wait_timeout = 28800 interactive_timeout = 28800 # 延长读写操作的超时时间 net_read_timeout = 60 net_write_timeout = 60
修改后重启MySQL服务:
sudo service mysql restart
3. 排查应用的查询逻辑
- 有没有执行超耗时的查询?比如未加索引的大数据量查询,这类操作会导致连接长时间占用,触发超时断连。可以用
EXPLAIN分析慢查询,优化索引或拆分查询。 - 有没有未正确关闭的连接?比如代码里遗漏了连接释放逻辑,导致连接池耗尽,MySQL主动断开闲置连接。
4. 系统层面的排查
- 检查Ubuntu防火墙:暂时关闭防火墙测试(
sudo ufw disable),如果问题解决,再重新配置允许MySQL端口(默认3306)的访问规则。 - 调整系统文件句柄限制:执行
ulimit -n看当前值,如果低于65535,临时调整用ulimit -n 65535,永久调整需要编辑/etc/security/limits.conf,添加:mysql soft nofile 65535 mysql hard nofile 65535
按这个顺序排查,大概率能解决问题,我当时就是调整了驱动的保活配置和MySQL的max_allowed_packet参数后解决的。
内容的提问来源于stack exchange,提问作者Igor Petev
相关产品推荐
相关产品推荐

