一、错误信息
连接MySQL时候报错如下
[root@lzh-2024 ~]# mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
[root@lzh-2024 ~]#
二、出现Access denied原因排查
1、确认密码是否正确
确保输入的密码与 root 用户的密码一致。
如果忘记密码,可以尝试重置 root 密码(见下文)。
2. 检查 root 用户的权限(重要)
登录 MySQL 服务器(例如从本地登录),检查 root 用户的权限:
-- 如果在终端连接mysql时需要
mysql -u root -p
-- 查看用户权限
SELECT user, host FROM mysql.user WHERE user = 'root';
如果 host 列中没有 localhost 或 %,说明 root 用户没有从该 IP 地址登录的权限。
如果需要允许从localhost 登录(如果允许所有机器那么用%),可以执行如下语句添加权限
CREATE USER 'root'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
3、重置root 密码
如果忘记 root 密码,可以通过以下步骤重置
(1)停止 MySQL 服务
sudo systemctl stop mysql
(2)以安全模式启动 MySQL
sudo mysqld_safe --skip-grant-tables &
(3)登录 MySQL(无需密码)
mysql -u root
(4)重置 root 密码
USE mysql;
UPDATE user SET authentication_string=PASSWORD('new_password') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
(5)重启 MySQL 服务
sudo systemctl restart mysql
root 用户已经允许从任意主机(%)和本地(localhost)登录,但仍然无法远程连接,请参考4、5、6
4、MySQL 配置问题
- 检查 bind-address 配置
1、MySQL 默认只监听本地地址(127.0.0.1),需要修改配置以允许远程连接。
2、打开 MySQL 配置文件(通常是 /etc/my.cnf 或 /etc/mysql/my.cnf)。
找到 bind-address 配置项,将其改为 0.0.0.0(监听所有网络接口)或服务器的公网 IP 地址
[mysqld]
bind-address = 0.0.0.0
3、保存文件并重启 MySQL 服务
sudo systemctl restart mysql
- 检查 skip-networking 配置
确保 MySQL 配置文件中没有启用 skip-networking。如果存在该配置项,将其注释或删除
# skip-networking
5、防火墙配置
- 检查服务器防火墙
确保服务器的防火墙允许 MySQL 端口(默认是 3306)的入站连接。例如
如果使用 ufw(Ubuntu):
sudo ufw allow 3306/tcp
如果使用 firewalld(CentOS):
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
- 检查云服务器安全组
如果使用云服务器(如 AWS、阿里云等),确保安全组规则允许从远程 IP 地址访问 MySQL 端口(3306)
6、用户权限问题
1、确认 root 用户的权限,检查 root 用户的权限是否正确
SELECT user, host FROM mysql.user WHERE user = 'root';
确保 host 列包含 %(允许任意主机)或远程主机的 IP 地址
2、重新授权 root 用户,如果权限不正确,可以重新授权 root 用户
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
FLUSH PRIVILEGES;