MySQL 8.0+ 修改用户密码用 ALTER USER
,不是 SET PASSWORD
MySQL 8.0 开始默认使用
caching_sha2_password插件认证,
SET PASSWORD在多数配置下已失效或被拒绝。直接执行会报错:
ERROR 1064 (42000): You have an error in your SQL syntax或更常见的
ERROR 1396 (HY000): Operation ALTER USER failed(尤其对 root 用户未显式指定主机时)。
正确做法是明确指定用户名和主机,并用
ALTER USER:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
注意点:
'root'@'localhost'中的主机部分不能省略;用
SELECT User, Host FROM mysql.user;查清实际账户的完整用户名+主机组合 密码必须满足当前密码策略(如
validate_password插件启用时要求大小写字母+数字+特殊字符) 改完后需执行
FLUSH PRIVILEGES;(虽然
ALTER USER通常自动刷新,但某些旧版本或权限缓存异常时仍需手动刷)
MySQL 5.7 及更早版本可用 SET PASSWORD
,但要注意语法差异
在 MySQL 5.7 中,
SET PASSWORD仍有效,但格式与旧版不同:必须带
FOR子句,且不能省略主机名。
SET PASSWORD FOR 'admin'@'%' = 'new_pass_123';
常见翻车点:
写成SET PASSWORD = PASSWORD('xxx') —— 这是 MySQL 5.6 及之前语法,5.7+ 已废弃,会报错 ERROR 1372 (HY000)漏掉
@'host',例如只写
SET PASSWORD FOR 'user' = ...→ 报错
ERROR 1396用
UPDATE mysql.user直接改
authentication_string字段 —— 极易因加密方式不匹配导致锁死账户(尤其跨版本升级后)
修改用户认证插件类型要同步重设密码
如果想把
caching_sha2_password改回
mysql_native_password(比如适配老客户端),不能只改插件,必须同时重置密码,否则认证失败。
ALTER USER 'app_user'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'legacy_compat_pwd';
关键逻辑:
认证插件和密码哈希值绑定存储,换插件 ≠ 自动转密码格式mysql_native_password用的是 SHA1 哈希,而
caching_sha2_password是 SHA256 + salt,二者不可互译 若只执行
ALTER USER ... IDENTIFIED WITH mysql_native_password;不带
BY,新密码字段为空,登录时会提示
Access denied for user
忘记 root 密码时绕过认证的实操要点
唯一安全可行的方式是用
--skip-grant-tables启动 mysqld,但必须配合
--skip-networking防止未授权访问。
步骤简述(Linux):
停掉 MySQL:sudo systemctl stop mysql临时启动跳过权限检查:
sudo mysqld --skip-grant-tables --skip-networking &连入后立即重设密码:
UPDATE mysql.user SET authentication_string=PASSWORD('new_root') WHERE User='root'; FLUSH PRIVILEGES;(5.7)或用 ALTER USER(8.0+) 杀掉进程并正常重启:
sudo killall mysqld→
sudo systemctl start mysql
注意:
--skip-grant-tables下所有用户免密可登录,务必确保无网络暴露、操作时间尽量短——这是高危操作,不是日常维护手段。
