Debian 上 MySQL 连接失败的原因很多,常见集中在 服务未启动、权限/用户配置、网络/端口、配置错误、升级变化 等方面。下面按最常见 → 较少见逐一排查,并结合 Debian 的特点说明。
systemctl status mysql
或(某些系统):
systemctl status mariadb
✅ 正常应看到 active (running)
❌ 如果没启动:
sudo systemctl start mysql
sudo systemctl enable mysql
查看启动失败原因:
journalctl -u mysql -n 50
MySQL 默认端口是 3306
ss -lntp | grep 3306
# 或
netstat -lntp | grep 3306
| 现象 | 原因 |
|---|---|
| 没有监听 3306 | MySQL 没启动 |
| 只监听 127.0.0.1 | 只能本地连接 |
| 监听 0.0.0.0 | 可远程连接(需权限) |
ERROR 2002 (HY000): Can't connect to local MySQL servermysql -u root -p
原因:
检查 socket:
ls /var/run/mysqld/mysqld.sock
如果不存在:
sudo mkdir -p /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld
sudo systemctl restart mysql
ERROR 1045 (28000): Access denied for user✅ 用户名 / 密码错误
✅ 用户没有对应 host 权限
查看用户权限:
SELECT user, host FROM mysql.user;
Debian 常见情况:
| 用户 | host | 说明 |
|---|---|---|
| root | localhost | 只能本地 |
| root | 127.0.0.1 | TCP 连接 |
| root | % | 任意远程 |
如果你想远程连接:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码';
FLUSH PRIVILEGES;
⚠️ Debian 默认禁止 root 远程登录,这是安全设计
ERROR 1130: Host 'xxx' is not allowed说明:
解决:
CREATE USER 'user'@'客户端IP' IDENTIFIED BY '密码';
GRANT ALL ON db.* TO 'user'@'客户端IP';
Debian 默认安装的是 MariaDB,不是 Oracle MySQL:
mysql --version
配置路径不同:
| 项目 | 路径 |
|---|---|
| 配置文件 | /etc/mysql/mariadb.conf.d/50-server.cnf |
| 数据目录 | /var/lib/mysql |
| socket | /var/run/mysqld/mysqld.sock |
grep bind-address /etc/mysql/mariadb.conf.d/50-server.cnf
常见值:
bind-address = 127.0.0.1 ❌ 不能远程bind-address = 0.0.0.0 ✅ 可远程修改后:
sudo systemctl restart mysql
如果日志中看到权限错误:
sudo aa-status
临时验证:
sudo systemctl stop apparmor
sudo systemctl restart mysql
如能连接,说明是 AppArmor 问题。
auth_socket 插件检查:
SELECT user, plugin FROM mysql.user WHERE user='root';
如果是 auth_socket,本地连接必须:
sudo mysql
而不是:
mysql -u root -p
改为密码登录:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
FLUSH PRIVILEGES;
sudo ufw status
开放端口:
sudo ufw allow 3306
⚠️ 生产环境建议 限制 IP
systemctl status mysql
ss -lntp | grep 3306
mysql -u root -p
sudo mysql
grep bind-address /etc/mysql/**/*.cnf
请贴出以下信息(任意一项都行):
systemctl status mysql 输出cat /etc/debian_version)mysql --version我可以 精确判断是哪一类问题,并给你一条可执行的解决方案。