必须用--skip-grant-tables启动mysqld才能重置密码,因MySQL 8.0认证失败后无法执行任何SQL;Windows下还需加--shared-memory;改密码前须清空authentication_string字段,并严格按USE mysql; UPDATE user; ALTER USER; FLUSH PRIVILEGES顺序操作;完成后必须终止进程、清理配置、正常重启服务。

必须用 --skip-grant-tables 启动 mysqld 才能重置,其他任何方式(比如改配置文件不重启、用图形工具连上再操作)都无效。
为什么不能直接登录后改密码?
MySQL 8.0 一旦无法通过认证,就进不了数据库执行任何 SQL —— 连 USE mysql 都会被拦在门外。所谓“跳过权限表”,本质是让 mysqld 完全不读取 mysql.user 表,也就绕开了密码校验逻辑。这不是漏洞,是官方预留的紧急恢复入口,但仅限本地管理员使用。
Windows 下必须加 --shared-memory
Windows 系统下单独运行 mysqld --skip-grant-tables 会报错:TCP/IP, --shared-memory, or --named-pipe should be configured on NT OS。这是因为 MySQL 8.0 在 Windows 上默认禁用所有通信协议,除非显式指定。
- 正确启动命令(管理员 CMD,cd 到
bin目录后执行):mysqld --console --skip-grant-tables --shared-memory - 该窗口会卡住,属正常现象 —— 不要关它,这是 mysqld 进程本身
- 别用
net start mysql启动,那是服务模式;这里要的是进程直启
改密码前先清空 authentication_string
MySQL 8.0+ 的 root 用户密码存在 authentication_string 字段,且默认认证插件是 caching_sha2_password。如果旧密码字段非空,直接 ALTER USER 可能静默失败或报错。
- 新开一个管理员 CMD,同样 cd 到
bin目录,执行:mysql -u root(不加-p) - 进库后立刻执行三步(顺序不能错):
USE mysql;<br>UPDATE user SET authentication_string = '' WHERE user = 'root';<br>ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123';<br>FLUSH PRIVILEGES;
- 注意:只改了
'root'@'localhost',不代表'root'@'127.0.0.1'或'root'@'%'也生效,后续登录时 host 必须匹配
退出后千万别漏掉清理步骤
改完密码只是第一步,真正容易出事的是后续:
- 回到第一个卡住的 CMD 窗口,按
Ctrl+C终止mysqld进程 - 如果之前修改过
my.ini添加了skip_grant_tables=1,现在必须删掉或注释掉这一行 - 用正常方式启动服务:
net start mysql80(服务名以你实际为准) - 验证:
mysql -u root -p,输新密码 —— 如果没提示输密码就进去了,说明skip-grant-tables还在生效,得回去检查
最常被忽略的点:以为改完 SQL 就万事大吉,结果忘了终止临时进程、忘了删配置、忘了重启服务。只要 --skip-grant-tables 还在运行,你的数据库就是裸奔状态。











