MySQL登录失败提示Access denied时,如何核实root用户密码及权限配置?

2026-05-20 13:291阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计644个文字,预计阅读时间需要3分钟。

MySQL登录失败提示Access denied时,如何核实root用户密码及权限配置?

直接说结论:

为什么 mysql -u root -p 失败,但 mysql -u root -p -h 127.0.0.1 能成功

MySQL 把 localhost127.0.0.1 当作两个完全不同的 host:
localhost 走 UNIX socket,匹配的是 user 表中 host = 'localhost' 的记录;
127.0.0.1 走 TCP/IP,匹配的是 host = '127.0.0.1'host = '%' 的记录。
常见现象就是查 SELECT user, host FROM mysql.user WHERE user = 'root';,发现只有 'root'@'127.0.0.1''root'@'%',唯独没有 'root'@'localhost'

解决办法很简单:

  • 用其他能登录的账号(比如 root@127.0.0.1)进 MySQL
  • 执行:

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '你的密码' WITH GRANT OPTION;

  • 再执行:

    FLUSH PRIVILEGES;

MySQL 8.0+ 报错但密码确认正确?检查 plugin 字段

MySQL 8.0 默认用 caching_sha2_password 插件,老客户端(如某些 PHP 版本、旧版 MySQL Workbench)不支持,就会报错,哪怕密码对也登不上。

先查当前配置:

SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

如果看到 plugincaching_sha2_password,且你无法升级客户端,就切回兼容模式:

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

  • FLUSH PRIVILEGES;

注意:这条语句只改 'root'@'localhost',不影响其他 host 的认证方式。

重置密码后仍报错?别漏掉 FLUSH PRIVILEGES

很多操作卡在这一步:改了 authentication_string 或用了 ALTER USER,但没刷新权限缓存,MySQL 还在用旧缓存校验。

必须显式执行:

FLUSH PRIVILEGES;

另外注意命令写法差异:

  • MySQL 5.7 及以前:UPDATE mysql.user SET password = PASSWORD('新密码') WHERE user = 'root' AND host = 'localhost';
  • MySQL 5.7.6+(含 8.0):ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; —— 不要再用 PASSWORD() 函数,它已废弃

最常被忽略的一点:改完权限或密码后,一定要确认你连接时用的 host 精确匹配 mysql.user 表里的 host 值——空格、大小写、通配符 % 都算数。localhost 就是 localhost,不是 127.0.0.1,也不是本机 hostname。

本文共计644个文字,预计阅读时间需要3分钟。

MySQL登录失败提示Access denied时,如何核实root用户密码及权限配置?

直接说结论:

为什么 mysql -u root -p 失败,但 mysql -u root -p -h 127.0.0.1 能成功

MySQL 把 localhost127.0.0.1 当作两个完全不同的 host:
localhost 走 UNIX socket,匹配的是 user 表中 host = 'localhost' 的记录;
127.0.0.1 走 TCP/IP,匹配的是 host = '127.0.0.1'host = '%' 的记录。
常见现象就是查 SELECT user, host FROM mysql.user WHERE user = 'root';,发现只有 'root'@'127.0.0.1''root'@'%',唯独没有 'root'@'localhost'

解决办法很简单:

  • 用其他能登录的账号(比如 root@127.0.0.1)进 MySQL
  • 执行:

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '你的密码' WITH GRANT OPTION;

  • 再执行:

    FLUSH PRIVILEGES;

MySQL 8.0+ 报错但密码确认正确?检查 plugin 字段

MySQL 8.0 默认用 caching_sha2_password 插件,老客户端(如某些 PHP 版本、旧版 MySQL Workbench)不支持,就会报错,哪怕密码对也登不上。

先查当前配置:

SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

如果看到 plugincaching_sha2_password,且你无法升级客户端,就切回兼容模式:

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

  • FLUSH PRIVILEGES;

注意:这条语句只改 'root'@'localhost',不影响其他 host 的认证方式。

重置密码后仍报错?别漏掉 FLUSH PRIVILEGES

很多操作卡在这一步:改了 authentication_string 或用了 ALTER USER,但没刷新权限缓存,MySQL 还在用旧缓存校验。

必须显式执行:

FLUSH PRIVILEGES;

另外注意命令写法差异:

  • MySQL 5.7 及以前:UPDATE mysql.user SET password = PASSWORD('新密码') WHERE user = 'root' AND host = 'localhost';
  • MySQL 5.7.6+(含 8.0):ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; —— 不要再用 PASSWORD() 函数,它已废弃

最常被忽略的一点:改完权限或密码后,一定要确认你连接时用的 host 精确匹配 mysql.user 表里的 host 值——空格、大小写、通配符 % 都算数。localhost 就是 localhost,不是 127.0.0.1,也不是本机 hostname。