跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

MySQL数据库无法连接怎么解决_检查连接池配置与防火墙策略

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 或自研池子,可能不会自动重连,一断就卡死。 MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载 解决方向有两个: 服务端调长:在
[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):它可能拦截 mysql d 绑定非标准端口或网络访问,临时关掉测试:
sudo setenforce 0
;确认是它导致的,再按策略启用
mysqld_can_network_connect
。

相关文章