windows下必须加--shared-memory,因mysql 8.0+在nt系统强制启用本地通信协议,否则启动报错;登录后须先清空authentication_string字段再alter user设新密码,且需精确匹配host(如'localhost'或'127.0.0.1')及认证插件。

直接重置 MySQL 8.0 的 root 密码,不能靠改配置文件或客户端连上去操作——根本连不进去。必须绕过认证,但绕得不对会启动失败、改完仍登不上、甚至密码策略报错。
为什么 mysqld --skip-grant-tables 在 Windows 上必加 --shared-memory
Windows 下单独执行 mysqld --skip-grant-tables 几乎必然失败,错误类似:ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded 或更底层的 TCP/IP, --shared-memory, or --named-pipe should be configured。这是因为 MySQL 8.0+ 在 NT 系统强制要求启用至少一种本地通信协议,而 --skip-grant-tables 模式下它不会自动 fallback。
- 必须显式加
--shared-memory(最轻量,无需端口/管道配置)或--named-pipe - 要以管理员身份运行命令行,否则无法绑定共享内存
- 启动前务必在任务管理器中结束所有
mysqld.exe进程(不止一个) - 加上
--console能让错误日志直接输出到窗口,方便判断是否真启动成功
登录后 ALTER USER 失败?先清空 authentication_string
MySQL 8.0 默认用 caching_sha2_password 插件,authentication_string 字段存的是强哈希值。直接 ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx' 会报 ERROR 1396 (HY000): Operation ALTER USER failed,因为旧认证数据残留冲突。
- 必须先执行:
USE mysql;,否则后续语句找不到表 - 再执行:
UPDATE user SET authentication_string = '' WHERE user = 'root';(注意是空字符串'',不是NULL) - 然后才能执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyP@ssw0rd123'; - 最后必须执行:
FLUSH PRIVILEGES;——虽然 8.0+ 多数情况自动刷新,但此处显式执行更保险
改完密码还是连不上?检查 host 和认证插件是否匹配
MySQL 的账号是 'user'@'host' 组合,'root'@'localhost' 和 'root'@'127.0.0.1' 是两个独立账号。你改了前者,但客户端走的是后者,就会继续报 Access denied。
- 用
mysql -u root登录时,默认匹配'root'@'localhost';用mysql -h 127.0.0.1 -u root -p则匹配'root'@'127.0.0.1' - 如果需要支持两种方式,得分别执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx';和ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY 'xxx'; - 老客户端(如旧版 Navicat、phpMyAdmin)可能不支持
caching_sha2_password,可强制指定插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 新密码必须满足默认策略:至少 8 位 + 大小写字母 + 数字 + 特殊字符,否则报
ERROR 1819 (HY000)
整个流程里最容易被忽略的是三件事:Windows 必须加 --shared-memory、authentication_string 必须清空再设新密码、host 匹配必须精确到连接方式。漏掉任一环,都会卡在“以为改完了却登不进”的状态。











