mysql用户密码如何修改_mysql用户认证设置

2次阅读

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

mysql用户密码如何修改_mysql用户认证设置

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 mysqldsudo systemctl start mysql

注意:--skip-grant-tables 下所有用户免密可登录,务必确保无网络暴露、操作时间尽量短——这是高危操作,不是日常维护手段。

text=ZqhQzanResources