Ubuntu 20.04服务器MySQL 8.0.34 Telnet连接超时问题求助
MySQL 8.0.34连接超时(Got timeout reading communication packets)问题排查与解决
问题场景
通过SSH连接Ubuntu 20.04服务器后,执行telnet 127.0.0.1 3306测试本地MySQL 8.0.34端口,连接建立后立即触发超时断开,具体输出如下:
Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. [ 8.0.34-0ubuntu0.20.04.1 2%0d|yj}?tPWSG^caching_sha2_password2#08S01Got timeout reading communication packetsConnection closed by foreign host.
可能成因
- 超时参数配置过严:
wait_timeout、interactive_timeout、net_read_timeout等参数设置过小,导致握手阶段就触发服务器超时断开。 - 认证协议不兼容:MySQL 8.0默认使用
caching_sha2_password加密认证插件,telnet是纯文本协议,无法完成加密握手流程,触发服务器端超时。 - 服务器资源耗尽:CPU、内存负载过高,MySQL进程无法及时处理连接请求,引发握手超时。
- 本地安全规则拦截:UFW防火墙或SELinux规则可能在连接建立后拦截数据包,导致超时错误。
- MySQL连接数耗尽:
max_connections已达上限,无法接收新连接。
排查步骤
检查MySQL服务状态与资源占用
- 用
htop或top查看CPU、内存使用率,确认mysqld进程是否占用过高资源。 - 执行
systemctl status mysql确认服务是否正常运行,有无异常日志。
- 用
查看MySQL关键参数
- 若能通过本地MySQL客户端登录,执行以下SQL查看参数:
SHOW VARIABLES LIKE '%timeout%'; SHOW VARIABLES LIKE 'max_connections'; - 重点核对
wait_timeout(默认28800秒)、net_read_timeout(默认30秒),若值远低于默认值需重点关注。
- 若能通过本地MySQL客户端登录,执行以下SQL查看参数:
查看MySQL错误日志
- 查看Ubuntu默认错误日志路径:
tail -n 50 /var/log/mysql/error.log,寻找与连接超时、认证相关的报错信息。
- 查看Ubuntu默认错误日志路径:
验证认证插件影响
- 尝试用官方客户端连接:
mysql -u root -p,若能正常连接,说明telnet的纯文本方式无法适配caching_sha2_password是核心问题;若客户端也超时,再排查其他因素。
- 尝试用官方客户端连接:
排查本地安全规则
- 执行
ufw status查看防火墙规则,临时关闭防火墙测试:ufw disable,再重试telnet连接。 - 执行
sestatus查看SELinux状态,若为Enforcing模式,临时切换为Permissive:setenforce 0,测试连接是否恢复。
- 执行
解决建议
调整超时参数
- 编辑MySQL配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf,添加或修改以下参数:wait_timeout = 28800 interactive_timeout = 28800 net_read_timeout = 60 net_write_timeout = 60 - 重启MySQL服务:
systemctl restart mysql
- 编辑MySQL配置文件
处理认证协议问题
- telnet本身无法完成
caching_sha2_password的加密握手,属于正常现象,建议用nc做端口连通性测试:nc -zv 127.0.0.1 3306。 - 若需要兼容旧客户端,可修改目标用户的认证插件:
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
- telnet本身无法完成
优化服务器资源
- 清理闲置进程释放资源,必要时升级服务器配置;同时可调整MySQL配置(如
innodb_buffer_pool_size)降低资源消耗。
- 清理闲置进程释放资源,必要时升级服务器配置;同时可调整MySQL配置(如
修复安全规则
- 若防火墙拦截,添加本地3306端口允许规则:
ufw allow from 127.0.0.1 to any port 3306 - 若SELinux拦截,执行
setsebool -P mysql_connect_any 1开放MySQL连接权限,或根据错误日志配置针对性规则。
- 若防火墙拦截,添加本地3306端口允许规则:
内容的提问来源于stack exchange,提问作者Rq Bhatti
相关产品推荐
相关产品推荐

