mysql 8.0+ 修改用户密码必须用 alter user,如 alter user 'root'@'localhost' identified by 'new_secure_password';set password 已失效,直接使用会报错;需指定完整用户名+主机、满足密码策略,并建议执行 flush privileges。

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';
常见翻车点:
51shop 由 PHP 语言开发, 使用快速的 MySQL 数据库保存数据 ,为中小型网站实现网上电子商务提供一个完美的解决方案.一、用户模块1. 用户注册:用户信息包括:用户ID、用户名、用户密码、性别、邮箱、省份、城市、 联系电话等信息,用户注册后不能立即使用,需由管理员激活账号,才可使用(此功能管理员可设置)2. 登录功能3. 资料修改:用户可修改除账号以后的所有资料4. 忘记密码:要求用
- 写成
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 下所有用户免密可登录,务必确保无网络暴露、操作时间尽量短——这是高危操作,不是日常维护手段。









