MySQL登录失败提示Access denied时,如何核实root用户密码及权限配置?
- 内容介绍
- 文章标签
- 相关推荐
本文共计644个文字,预计阅读时间需要3分钟。
直接说结论:
为什么 mysql -u root -p 失败,但 mysql -u root -p -h 127.0.0.1 能成功
MySQL 把 localhost 和 127.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';
如果看到 plugin 是 caching_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 -u root -p 失败,但 mysql -u root -p -h 127.0.0.1 能成功
MySQL 把 localhost 和 127.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';
如果看到 plugin 是 caching_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。

