> 技术文档 > 【MySql】ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方案_error1045(28000):access denied

【MySql】ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方案_error1045(28000):access denied


一、错误信息

连接MySQL时候报错如下

[root@lzh-2024 ~]# mysql -uroot -pEnter password: ERROR 1045 (28000): Access denied for user \'root\'@\'localhost\' (using password: YES)[root@lzh-2024 ~]# 

【MySql】ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方案_error1045(28000):access denied

二、出现Access denied原因排查

1、确认密码是否正确

确保输入的密码与 root 用户的密码一致。
如果忘记密码,可以尝试重置 root 密码(见下文)。

2. 检查 root 用户的权限(重要)

登录 MySQL 服务器(例如从本地登录),检查 root 用户的权限:

-- 如果在终端连接mysql时需要mysql -u root -p -- 查看用户权限SELECT user, host FROM mysql.user WHERE user = \'root\';

【MySql】ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方案_error1045(28000):access denied
如果 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 地址
【MySql】ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方案_error1045(28000):access denied

2、重新授权 root 用户,如果权限不正确,可以重新授权 root 用户
GRANT ALL PRIVILEGES ON *.* TO \'root\'@\'%\' IDENTIFIED BY \'your_password\' WITH GRANT OPTION;
FLUSH PRIVILEGES;