ALTER USER执行后仍无法登录,大概率是host不匹配或认证插件不兼容:MySQL 8.0默认仅创建'root'@'localhost',而mysql -h 127.0.0.1匹配'root'@'127.0.0.1'(需单独修改);若plugin为caching_sha2_password且客户端不支持,应改用mysql_native_password插件。

ALTER USER执行后仍无法登录,大概率是host不匹配
MySQL 8.0 的 root 用户默认只建了 'root'@'localhost' 这一条记录,不是 'root'@'%',也不是 'root'@'127.0.0.1'。你用 mysql -u root -p 能连上,但用 mysql -h 127.0.0.1 -u root -p 就失败,就是因为后者匹配的是 'root'@'127.0.0.1' —— 它根本不存在。
查清楚当前有哪些 root 账户:
SELECT User, Host FROM mysql.user WHERE User = 'root';
- 如果只看到
'root'@'localhost',而你常用-h 127.0.0.1连接,就得额外执行:ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY '新密码'; - 远程访问需同步处理:
ALTER USER 'root'@'%' IDENTIFIED BY '新密码';(前提是该账户已存在) - 不要写
ALTER USER 'root' IDENTIFIED BY ...—— MySQL 会默认找'root'@'%',若不存在就报错“User not found”
caching_sha2_password导致ERROR 1045,改插件比换客户端更实际
MySQL 8.0 默认用 caching_sha2_password 插件,但 Navicat 12 以下、PHP 7.4 之前、旧版 MySQL Workbench 等工具不支持它,连接时直接报 ERROR 1045 (28000): Access denied,和密码对错无关。
确认当前插件:
SELECT host, user, plugin FROM mysql.user WHERE user = 'root';
- 若
plugin是caching_sha2_password,且你不想升级客户端,就直接切回兼容插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; - 注意:必须显式写
IDENTIFIED WITH,不能只写IDENTIFIED BY,否则插件不会变 - Windows 下若用
mysql -h 127.0.0.1连不上,很可能是因为匹配到'root'@'127.0.0.1'仍用着caching_sha2_password,得单独改它
validate_password策略拦住简单密码,绕过或调低策略再改
MySQL 8.0 默认启用密码强度校验,设 '123456' 或 'password' 会立刻报 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
先看策略是否启用:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
- 开发环境可临时放宽:
SET GLOBAL validate_password.policy = LOW;(重启后失效) - 或彻底禁用(8.0.29+):
UNINSTALL COMPONENT 'file://component_validate_password'; - 老版本用:
UNINSTALL PLUGIN validate_password; - 新密码至少要 8 位,含大小写字母、数字、特殊字符,比如:
MyP@ssw0rd123
忘记密码时不能直接用ALTER USER,它不是免登录命令
ALTER USER 是一条 SQL 命令,必须先成功登录才能执行。网上很多教程把“重置流程”和“修改语法”混在一起,导致用户卡在第一步:输错密码进不去,又以为敲对 ALTER USER 就能解决。
- 真正重置密码前,必须先停服务、用
mysqld --skip-grant-tables启动(Linux/macOS)或mysqld --skip-grant-tables --shared-memory(Windows) - 启动后新开终端执行:
mysql -u root(无密码),再进mysql执行ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 注意:此时必须手动执行
FLUSH PRIVILEGES;,因为--skip-grant-tables模式下权限不会自动刷新 -
SET PASSWORD在 8.0 已被硬性废弃,执行即报ERROR 1064,别试
'root'@'localhost' 和 'root'@'127.0.0.1' 是两个用户,也没想到客户端根本不支持默认认证插件。


















