MySQL 连接被拒绝(ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx'
)
这是最常见的通信异常,本质是客户端根本没发出去请求,或服务端压根没监听对应地址。先确认
mysqld进程是否在运行:
systemctl status mysql或
ps aux | grep mysqld。如果进程存在,检查监听配置:
bind-address是否设为
127.0.0.1却尝试用外网 IP 连接;若需远程访问,应设为
0.0.0.0或具体内网 IP,并确保
skip-networking未启用。
连接超时(ERROR 2013 (HY000): Lost connection to MySQL server during query
)
这类错误往往不是网络中断,而是服务端主动断开——常见于查询执行时间超过
wait_timeout或
interactive_timeout。可通过
SHOW VARIABLES LIKE '%timeout%';查看当前值。若应用有长耗时事务,建议在连接层设置
SET SESSION wait_timeout = 28800,而非盲目调大全局值。另外,防火墙、中间代理(如 HAProxy)的空闲超时设置若短于 MySQL,也会触发该错误,需同步调整。
SSL/TLS 握手失败导致通信中断
启用
require_secure_transport=ON后,所有连接必须走加密通道。但客户端未配 SSL 参数就会报
ERROR 9002 (HY000): SSL connection error。验证方式:用
mysql -u user -p --ssl-mode=REQUIRED -h host测试;若失败,检查服务端
ssl_ca、
ssl_cert、
ssl_key路径是否可读,证书是否过期。开发环境临时绕过可用
--ssl-mode=DISABLED,但生产环境不建议关闭验证。
包大小限制引发的“半截”通信(Packets larger than max_allowed_packet are not allowed
)
当执行含大 BLOB、长 JSON 或批量 INSERT 的语句时,客户端和服务端的
max_allowed_packet值不一致会导致连接突然中断。务必两端统一设置:在
my.cnf中设
max_allowed_packet = 64M,并重启服务;客户端连接后立即执行
SET SESSION max_allowed_packet = 67108864;。注意:该值不能动态设为大于服务端全局值,否则会静默截断为服务端值。 MySQL 通信异常真正难定位的,往往是网络路径中某个环节(比如云厂商安全组、容器 CNI 插件、数据库代理)悄悄丢包或重置连接,而错误日志里只显示“connection reset by peer”。这时候得抓包看 TCP 层行为,而不是只盯着 MySQL 日志。
