mysql 8.0首次登录报error 1820,因初始密码仅限一次登录且强制要求用alter user改密;set password语法已被硬性废弃,必须用alter user 'root'@'localhost' identified by '新密码',且新密码需满足validate_password策略(8位+大小写字母+数字+特殊字符)。

MySQL 8.0 安装后首次登录报 ERROR 1820,说明必须用 ALTER USER 强制改密,不能跳过或绕开。
为什么 SET PASSWORD 不再可用
MySQL 8.0 彻底移除了 SET PASSWORD = PASSWORD('xxx') 语法,执行会直接报错 ERROR 1064。这不是兼容性开关问题,而是语法被硬性废弃。即使你从 5.7 升级上来,旧脚本也会崩。
-
ALTER USER CURRENT_USER() IDENTIFIED BY '新密码';是唯一推荐的当前用户改密方式 - 对 root 用户,必须显式指定 host:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; - 如果只写
ALTER USER 'root' IDENTIFIED BY ...,MySQL 会默认匹配'root'@'%'(远程通配),而实际安装生成的是'root'@'localhost',导致“找不到用户”错误
初始密码在哪?怎么拿到它
mysqld 初始化时(mysqld --initialize)会生成一个临时密码,不是空密码,也不是 root。不找出来就根本连不进 MySQL。
- 查日志路径:
/var/log/mysqld.log(RHEL/CentOS)或/usr/local/mysql/data/*.err(macOS/Linux 自编译)或 Windows 下的data/主机名.err - 搜索关键词:
A temporary password is generated,复制冒号后那一串(注意末尾可能有空格或换行符) - 登录命令:
mysql -u root -p,粘贴临时密码(回车后若失败,先检查是否多复制了空格)
改密前必须处理 validate_password 插件
MySQL 8.0 默认启用 validate_password,要求密码至少 8 位、含大小写字母+数字+特殊字符。直接设 '123456' 会报 ERROR 1819。
- 先确认插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'validate%'; - 开发环境可临时调低策略:
SET GLOBAL validate_password.policy = LOW;(重启失效) - 或者禁用插件(8.0.29+):
UNINSTALL COMPONENT 'file://component_validate_password';;老版本用:UNINSTALL PLUGIN validate_password; - 改密后再执行:
FLUSH PRIVILEGES;(虽然 8.0 多数情况不需要,但保险起见)
ALTER USER 执行后仍无法登录?检查 host 匹配
常见现象:执行了 ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx';,但下次 mysql -u root -p 还是报 Access denied。
- 查实际存在的 root 账户:
SELECT User, Host FROM mysql.user WHERE User = 'root'; - Windows 上有时会同时存在
'root'@'localhost'和'root'@'127.0.0.1',客户端解析 localhost 可能走 socket 或 TCP,行为不一致 - 稳妥做法:对两个 host 都改密:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx';和ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY 'xxx'; - 别碰
'root'@'%'—— 生产环境开放它等于裸奔
最易忽略的一点:临时密码只允许登录一次,且几乎所有命令都会触发强制改密提示。一旦登录成功,第一件事不是查库,而是立刻执行 ALTER USER。卡在这一步的人,90% 是因为没意识到这个“一次性通行证”的机制。











