能正常登录 mysql 5.7 时,唯一推荐方式是直接执行 alter user 'root'@'localhost' identified by '新密码',它自动适配认证插件并立即生效;update 修改 authentication_string 或 password 字段均无效,且会因插件不兼容导致登录失败。

能正常登录 MySQL 5.7,就别绕开权限系统——直接用 ALTER USER 修改,这是唯一推荐的生产级方式。其他方法(比如改表、--skip-grant-tables)只该用于密码彻底丢失的紧急恢复场景。
用 ALTER USER 'root'@'localhost' IDENTIFIED BY 修改密码
MySQL 5.7 默认生成一个临时 root 密码,记录在 /var/log/mysqld.log(RPM 安装)或初始化时的 .err 文件里。拿到它后,必须立刻执行 ALTER USER,否则后续任何操作都会报错 ERROR 1820 (HY000)。
- 登录后第一件事就是改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyN3wP@ss!'; - 注意主机名要写全:
'root'@'localhost'和'root'@'%'是两个独立账户,改错一个没用 - 密码必须满足策略要求;若报
ERROR 1819,先临时调低强度:SET GLOBAL validate_password_policy = LOW; -
FLUSH PRIVILEGES;不是必须的——ALTER USER本身已持久化并生效
为什么不能用 UPDATE mysql.user SET password = ...
MySQL 5.7 的 user 表里已经没有 password 字段了,只有 authentication_string。硬写 UPDATE 会失败,或者写进去了也无效,因为认证逻辑不再读取那个字段。
- 错误写法:
UPDATE user SET password = PASSWORD('xxx') WHERE user = 'root';→ 字段不存在,报错 - 过时写法:
UPDATE user SET authentication_string = PASSWORD('xxx') WHERE user = 'root';→ 虽不报错,但 5.7+ 实际使用的是 caching_sha2_password 插件,PASSWORD()返回的是旧式 hash,登录会失败 - 正确路径只有
ALTER USER,它会自动适配当前默认认证插件
修改后必须检查的三个地方
改完密码不是终点,漏掉任一环节都可能导致服务中断或权限异常。
- 确认 host 匹配:
SELECT User, Host FROM mysql.user WHERE User = 'root';—— 如果看到'root'@'%',而你只改了'localhost',远程连接仍用旧密码 - 验证新密码能否登录:
mysql -u root -p -h 127.0.0.1(强制走 TCP)和mysql -u root -p(走 socket)都要试 - 检查应用连接串:Spring Boot 的
spring.datasource.password、PHP 的mysqli_connect()参数等,必须同步更新,否则服务启动失败
最常被忽略的是 host 粒度和认证插件兼容性——'root'@'localhost' 和 'root'@'127.0.0.1' 在 MySQL 看来是两个用户,且 5.7.23+ 默认用 caching_sha2_password,老客户端(如 MySQL 5.6 客户端、某些 JDBC 驱动)连不上,得显式指定 default-authentication-plugin=mysql_native_password 或降级插件。











