Connection refused(111)需先确认MySQL服务运行状态及bind_address是否为0.0.0.0或具体IP;Access denied(1045)源于'user'@'host'权限匹配问题,须检查并显式授权;连接池断连需同步调优wait_timeout与连接池空闲配置,并排查防火墙、安全组及SELinux拦截。

Connection refused(111)错误:先确认服务是否真在监听
看到 ERROR 2003 (HY000): Can't connect to MySQL server on 'x.x.x.x' (111),第一反应不是改代码,而是确认 MySQL 进程有没有真正跑起来、端口有没有真正“对外敞开”。systemctl status mysql 或 systemctl status mysqld 看一眼状态,如果是 inactive,直接 sudo systemctl start mysql 启动。
但更隐蔽的问题是:服务起来了,却只绑在 127.0.0.1。查配置文件(通常是 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf),找到 bind_address —— 如果它写着 127.0.0.1,那远程根本连不上,哪怕防火墙全开也没用。改成 0.0.0.0(允许所有 IP)或具体内网 IP,然后 sudo systemctl restart mysql。
重启后别跳过验证:用 ss -tlnp | grep :3306 确认监听地址是不是你期望的。如果还显示 127.0.0.1:3306,说明配置没生效(常见于多配置文件被覆盖、语法错误导致加载失败)。
Access denied for user(1045):权限是'user'@'host'三元组,不是单看用户名
输对密码还报 Access denied for user 'root'@'192.168.1.100'?这不是密码错,是账号不存在——MySQL 把 'root'@'localhost' 和 'root'@'%' 当成两个完全独立的账号。登录本地 MySQL 后,执行 SELECT User, Host FROM mysql.user;,重点看你要连接的那个 Host 值是否存在。
- 如果目标是远程 IP(比如
192.168.1.100),就明确授权:GRANT ALL ON *.* TO 'user'@'192.168.1.100' IDENTIFIED BY 'pwd'; - 如果想通配所有内网,用
'user'@'192.168.%.%'比'user'@'%'更安全 - 执行完务必
FLUSH PRIVILEGES;,否则权限不生效 - 注意:新版本 MySQL(8.0+)创建用户必须分开
CREATE USER和GRANT,不能合并在一条GRANT里
连接池空闲连接断连:wait_timeout 不只是服务端的事
应用跑着跑着突然报 Communications link failure,但 MySQL 本身一切正常?很可能是连接池里的空闲连接被 MySQL 主动踢掉了。MySQL 默认 wait_timeout 是 28800 秒(8 小时),但很多连接池(如 HikariCP、Druid)默认空闲超时更短,且会主动检测并重连;而有些老项目用的 c3p0 或自研池子,可能不会自动重连,一断就卡死。
解决方向有两个:
- 服务端调长:在
[mysqld]段加wait_timeout = 28800和interactive_timeout = 28800,再重启 - 客户端适配:检查连接池配置,确保
connection-test-query(如SELECT 1)开启,且idle-timeout小于 MySQL 的wait_timeout - 别忽略网络设备:中间的 NAT 网关、云厂商 SLB 也可能有连接空闲超时(常为 300–900 秒),这个比 MySQL 层还早断连
防火墙与安全组:两个地方都要放行 3306
Linux 上开了 ufw 或 firewalld,只加了 sudo ufw allow 3306 不够——还要确认规则是否生效:sudo ufw status verbose。CentOS 7+ 用 firewall-cmd 的话,记得加 --permanent 再 reload,否则重启就失效。
更重要的是云环境:阿里云/腾讯云/AWS 的安全组是独立于系统防火墙的。即使服务器内部 iptables 全放行,安全组没开 3306 TCP 入方向,照样连不上。检查点有三个:
- MySQL 所在机器的安全组:入方向允许来源 IP + 3306 端口
- 客户端所在机器(如 CVM、跳板机)的安全组:出方向不限制,但若走代理,代理机也要开对应端口
- 如果跨 VPC 或用了云联网,还得确认对等连接、路由表、ACL 是否放行
最容易被忽略的是 SELinux(RHEL/CentOS):它可能拦截 mysqld 绑定非标准端口或网络访问,临时关掉测试:sudo setenforce 0;确认是它导致的,再按策略启用 mysqld_can_network_connect。


















