MySQL 8.0 必须用 ALTER USER 'root'@'localhost' IDENTIFIED BY 修改密码,因其唯一能正确触发 caching_sha2_password 插件加密、同步更新 password_last_changed 等字段;旧方式会导致哈希不匹配而登录失败。

ALTER USER 'root'@'localhost' IDENTIFIED BY 语句为什么在 MySQL 8.0 中必须用
MySQL 8.0 默认启用 caching_sha2_password 插件,而旧版的 SET PASSWORD 或直接 UPDATE mysql.user 会绕过插件逻辑,导致密码哈希格式不匹配、后续无法登录。只有 ALTER USER 能正确触发插件的密码加密流程,并同步更新 password_last_changed 和 password_lifetime 字段。
常见错误现象:mysql -u root -p 输入新密码后报错 Access denied for user 'root'@'localhost',但确认密码没错——大概率是用了过时方式改密,导致认证插件拒绝解密。
- 必须指定主机范围,比如
'root'@'localhost',不能只写'root',否则可能只改了某一条记录(SELECT user, host FROM mysql.user可查) - 如果存在
'root'@'%'这类通配主机账户,也要单独执行一次ALTER USER 'root'@'%',否则远程连接仍用旧凭据 - 密码中含特殊字符(如
$、!、空格)时,shell 命令行需用单引号包裹整个密码,避免被 shell 解析或截断
强密码设置时必须检查的三个系统变量
仅设一个复杂字符串还不够。MySQL 8.0 引入了密码策略组件,若未启用,ALTER USER 不会校验强度;若启用却配置不当,反而导致命令失败。
执行前先确认:
-
SELECT @@validate_password.policy:值为LOW/MEDIUM/STRONG。生产环境建议设为MEDIUM(要求至少 8 位 + 大小写字母 + 数字 + 特殊字符) -
SELECT @@default_password_lifetime:默认为0(永不过期)。如需强制定期更换,可设为非零值(如90表示 90 天) -
SHOW VARIABLES LIKE 'validate_password%':重点看validate_password.length、validate_password.mixed_case_count等,避免自定义策略过于宽松
若策略已启用但密码不达标,ALTER USER 会报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
改完密码后 root 仍无法远程登录?别漏掉 host 和权限
ALTER USER 只改密码,不改访问权限。MySQL 的 root 默认只允许 'root'@'localhost',即使你设了强密码,mysql -h 192.168.1.100 -u root -p 依然拒绝。
要支持远程,分两步:
- 先确保存在对应 host 的用户记录:
CREATE USER 'root'@'%' IDENTIFIED BY '强密码';(注意:不是UPDATE已有记录,而是新建) - 再赋权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - 最后刷新:
FLUSH PRIVILEGES;
⚠️ 风险提示:开放 'root'@'%' 是高危操作。更安全的做法是创建专用管理账号(如 'dba'@'192.168.1.%'),仅授予必要权限。
忘记密码时跳过权限验证的临时方案,务必清理干净
当完全无法登录时,唯一可行路径是启动 mysqld 时加 --skip-grant-tables。但这只是应急手段,且极易留下安全隐患。
操作后必须检查并还原以下三项:
- 确认
/etc/my.cnf(Linux)或my.ini(Windows)中[mysqld]段已删除skip-grant-tables行 - 重启 mysqld 服务后,立即验证
mysql -u root -p是否恢复凭据校验(而非免密直入) - 运行
SELECT plugin FROM mysql.user WHERE user = 'root';,确保所有 root 记录的plugin是caching_sha2_password,不是auth_socket或空值
没清掉 skip-grant-tables 的配置,等于数据库大门常年敞开——这点比密码弱更致命。


















