必须用--skip-grant-tables启动mysqld才能重置密码,因mysql 8.0认证失败后完全无法登录执行alter user;需配合--skip-networking、显式指定authentication plugin并配置default_authentication_plugin=mysql_native_password方可生效。

直接告诉你结论:必须用 --skip-grant-tables 启动 mysqld 才能重置,其他任何“连上再改”的方式都无效——因为连不进去。
为什么 mysql -u root -p 死活进不去?
MySQL 8.0 认证失败后,连 USE mysql 都被拦在门外,更别说执行 ALTER USER。这不是权限问题,是认证链彻底断开。所谓“跳过权限表”,本质是让 mysqld 完全不读 mysql.user 表,绕过所有密码校验逻辑。
- 错误日志里没找到临时密码?查
/var/log/mysqld.log(Linux)、C:\ProgramData\MySQL\MySQL Server 8.0\Data\*.err(Windows)或/usr/local/var/mysql/*.err(macOS),搜temporary password - 日志丢了或没生成?别重装,直接走
--skip-grant-tables流程 - 千万别试
UPDATE user SET authentication_string=...—— MySQL 8.0+ 已移除PASSWORD()函数,且该字段受强校验约束
Linux 下启动 mysqld --skip-grant-tables 总连不上?
常见原因是端口冲突或网络干扰,不是命令写错了。
- 先确保服务已停:
sudo systemctl stop mysqld(不能只kill -9,systemd 还会拉起) - 启动时必须加
--skip-networking:sudo mysqld --user=mysql --skip-grant-tables --skip-networking & - 检查是否真监听了:
ss -tlnp | grep :3306,确认 PID 是你刚启的进程 - 不用
mysqld_safe—— MySQL 8.0 默认不带它,行为不可靠
连进去了但 ALTER USER 报错 “Operation not allowed”?
不是语法错,是状态没就绪。8.0 在 --skip-grant-tables 模式下仍部分校验用户元数据,必须按顺序触发加载。
- 先执行:
FLUSH PRIVILEGES;(强制重载权限表) - 再执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass123';(必须显式指定插件,否则默认用caching_sha2_password,老客户端不认) - 别写
UPDATE user或漏掉@'localhost'——'root'@'127.0.0.1'和'root'@'%'是不同账户,改了这个不代表能用那个连 - 新密码要满足策略:至少 8 位 + 大小写字母 + 数字 + 特殊字符,否则报
ERROR 1819 (HY000)
重启后还是报 “Client does not support authentication protocol”?
这是最隐蔽的坑:密码改了,但认证插件没锁死,服务一重启又切回 caching_sha2_password。
- 登录后立刻查:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,确认值是mysql_native_password - 编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段加:default_authentication_plugin=mysql_native_password - 重启前务必删掉配置文件里残留的
skip-grant-tables或注释掉,否则下次启动还是免密模式
整个流程里最容易被忽略的是 --skip-networking 和 default_authentication_plugin 这两处,漏一个,就卡在最后一步。











