MySQL 连接不上怎么排查?

应用或客户端连接 MySQL 报错 Connection refused 或 Access denied,无法正常连接

解决方案

检查 MySQL 服务是否运行 推荐

# 检查 MySQL 服务状态
systemctl status mysql
# 或
service mysql status

# 如果没运行,启动服务
systemctl start mysql

# 检查是否监听端口
ss -tlnp | grep 3306
# 或
netstat -tlnp | grep 3306

# 检查 MySQL 错误日志
tail -50 /var/log/mysql/error.log

连接失败最常见的原因是 MySQL 服务没有运行。先确认服务状态和端口监听情况,再查看错误日志了解具体原因。

适用场景:任何连接失败的第一步排查

检查用户认证和权限 推荐

# Access denied 错误排查
# 1. 用 root 登录检查用户是否存在
mysql -u root -p

# 2. 查看用户列表
SELECT user, host, authentication_string FROM mysql.user;

# 3. 检查用户的 host 是否匹配
-- 'app'@'localhost' 只能本地连接
-- 'app'@'192.168.1.%' 只能从该网段连接
-- 'app'@'%' 允许任何地址连接

# 4. 重置密码(如果忘记)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
FLUSH PRIVILEGES;

# 5. 确认权限
SHOW GRANTS FOR 'app_user'@'%';

Access denied 通常是密码错误或用户的 host 不匹配。MySQL 的用户由 user@host 唯一标识,'app'@'localhost' 和 'app'@'%' 是不同的用户。

适用场景:报错 Access denied for user

检查网络和防火墙

# 1. 检查 MySQL 是否绑定了 127.0.0.1(只允许本地)
grep bind-address /etc/mysql/mysql.conf.d/mysqld.cnf
# 如果是 127.0.0.1,改为 0.0.0.0 允许远程连接
# bind-address = 0.0.0.0

# 2. 修改后重启 MySQL
systemctl restart mysql

# 3. 检查防火墙
# Ubuntu/Debian
ufw status
ufw allow 3306/tcp

# CentOS/RHEL
firewall-cmd --list-ports
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload

# 4. 从客户端测试网络连通性
telnet db-server 3306
# 或
nc -zv db-server 3306

远程连接失败通常是 MySQL 只监听本地地址或防火墙阻止了 3306 端口。需要同时检查 MySQL 配置和系统防火墙。

适用场景:本地能连但远程连不上

检查连接数限制

# 查看最大连接数和当前连接数
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';

# 如果连接数已满
-- 临时增加
SET GLOBAL max_connections = 500;

-- 查看谁占用了连接
SHOW PROCESSLIST;

-- 终止空闲连接
SELECT CONCAT('KILL ', id, ';')
FROM information_schema.PROCESSLIST
WHERE COMMAND = 'Sleep' AND TIME > 300;

-- 永久修改(my.cnf)
-- [mysqld]
-- max_connections = 500
-- wait_timeout = 300

当连接数达到 max_connections 上限时,新连接会被拒绝。需要排查是否有连接泄漏,并适当调整连接数限制。

适用场景:报错 Too many connections

注意事项

不要把 MySQL 3306 端口直接暴露到公网
修改 bind-address 后注意配合防火墙和用户权限控制访问
重置 root 密码后立即修改为强密码

相关命令