ALTER USER 不能直接重置遗忘的 root 密码,因为它需先登录认证;仅当已通过 --skip-grant-tables 等方式免密进入 MySQL 后,才可用 ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码' 修改密码,并须注意认证插件、host 匹配及密码策略要求。

不能直接用 ALTER USER 重置忘记的 root 密码——它必须先登录才能执行。 所以“使用 ALTER USER 语法重置”这个说法,只适用于你还记得旧密码、或已通过其他方式(如跳过权限验证)获得无密码登录能力的场景。
为什么 ALTER USER 本身不能“重置”遗忘的密码
因为 ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; 是一条需要认证后才能执行的 SQL 命令。一旦你连不上 MySQL(报错 ERROR 1045 (28000): Access denied),这条语句根本没机会运行。
网上很多教程把“重置流程”和“修改命令”混为一谈,导致用户卡在第一步:输错密码进不去,又误以为只要敲对 ALTER USER 就能解决。
-
ALTER USER是修改动作,不是绕过机制 - 它依赖当前会话已有足够权限(通常是 root 登录态)
- MySQL 8.0+ 已弃用
SET PASSWORD和UPDATE user直接改表的方式,强制走ALTER USER,但前提是能登录
哪些情况下真能用上 ALTER USER?
只有当你已经以无密码或免认证方式进入 MySQL 后,ALTER USER 才是真正生效的修改手段。此时要注意三点:
- 必须先执行
USE mysql;切换到系统库(否则可能报错找不到user表) - 必须显式指定 host:
'root'@'localhost',不能只写'root';远程访问需同步处理'root'@'%' - MySQL 8.0 默认启用密码策略,新密码要满足:至少 8 位 + 大小写字母 + 数字 + 特殊字符,否则报
ERROR 1819 (HY000)
典型安全操作序列是:
USE mysql; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyP@ssw0rd123';
常见错误:执行 ALTER USER 后仍无法登录
这通常不是语法问题,而是权限未刷新或认证插件不匹配:
- 没执行
FLUSH PRIVILEGES;:虽然ALTER USER一般自动生效,但在--skip-grant-tables模式下启动时,必须手动刷一次 - 认证插件被改成
caching_sha2_password,但客户端不支持(尤其老版 PHP 或某些 GUI 工具):需额外执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 改的是
'root'@'localhost',但你用mysql -h 127.0.0.1 -u root -p连接——这时匹配的是'root'@'127.0.0.1',不是同一个账户行
真正“快速重置”的关键不在 ALTER USER,而在怎么进去
如果你已经停掉服务、加了 --skip-grant-tables(Linux)或 --shared-memory --skip-grant-tables(Windows phpEnv 等免服务部署),那 ALTER USER 就是最后一步,也是最稳的一步。但整个流程里最容易卡住的,其实是启动 mysqld 的那条命令——比如漏掉 --shared-memory 导致 Windows 下直接崩溃,或者配置文件路径写错导致跳过权限失败。
别把注意力全放在 SQL 上;先确认你进得去,再放心用 ALTER USER。











