必须用mysqld --shared-memory --skip-grant-tables --console启动,因windows强制要求本地通信方式;登录后须先update user set authentication_string = ''再alter user设新密码,否则报错。

MySQL 8.0 忘记 root 密码时,不能直接用 mysql_secure_installation 或图形工具重置,必须手动绕过权限验证。关键在于:跳过认证不是靠改配置文件,而是靠带特定参数启动 mysqld 进程;且必须清空 authentication_string 字段,否则 ALTER USER 会失败。
为什么 mysqld --skip-grant-tables 直接报错?
在 Windows(尤其是 phpEnv、免安装版或某些服务注册异常的 MySQL)上,单独加 --skip-grant-tables 启动会报类似错误:
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded
或更常见的:
TCP/IP, --shared-memory, or --named-pipe should be configured on NT OS
这是因为 MySQL 8.0+ 在 Windows 上强制要求启用至少一种本地通信方式(默认 TCP 被禁用),而 --skip-grant-tables 模式下它不会自动 fallback。解决方法是显式加上 --shared-memory(最轻量、无需端口/管道配置)。
- 必须先彻底结束所有
mysqld.exe进程(任务管理器里查杀干净,不止一个) - 不能依赖系统服务名(如
net stop mysql80),phpEnv 等环境往往没注册服务 -
--console参数很重要:让错误日志直接输出到窗口,方便判断是否启动成功
如何用 --shared-memory --skip-grant-tables 启动 mysqld?
以管理员身份打开命令提示符,cd 到 MySQL 的 bin 目录(例如 phpEnv\Extensions\MySQL80\bin 或 D:\Program Files\MySQL\MySQL Server 8.0\bin),执行:
mysqld --shared-memory --skip-grant-tables --console
这个窗口会卡住(阻塞运行),说明 mysqld 已以无权限校验模式启动 —— 别关它,这是正常行为。
- 若提示“找不到 my.ini”,不用管:phpEnv 等精简版压根不读配置文件,参数全靠命令行传入
- 不要加
--skip-networking:它在 Windows 下可能引发兼容问题,--shared-memory本身已确保只允许本地连接 - 路径中含空格时,必须用英文双引号包裹整个路径,但
mysqld命令本身不用引号
登录后必须按顺序执行这三步(缺一不可)
另开一个管理员命令提示符,同样 cd 到 bin 目录,执行:
mysql -u root
进入后立即执行:
USE mysql;<br>UPDATE user SET authentication_string = '' WHERE user = 'root';<br>ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';<br>FLUSH PRIVILEGES;
注意:
-
UPDATE必须在ALTER USER之前 —— MySQL 8.0+ 不再接受空密码字段直接设新密码,会报ERROR 1396 (HY000) -
'root'@'localhost'是默认账户,如果你曾创建过'root'@'%',也要单独更新对应行 -
FLUSH PRIVILEGES在ALTER USER后虽非强制,但能避免缓存导致新密码暂时不生效
重启 MySQL 时别漏掉这一步
回到第一个卡住的命令行窗口,按 Ctrl+C 终止 mysqld 进程;然后通过 phpEnv 控制面板或系统服务(net start mysql80)正常启动 MySQL —— 它会加载原始配置(比如绑定地址、插件等),此时新密码已写入磁盘并生效。
验证命令:mysql -u root -p,输入新密码应直接进入。最容易被忽略的是:很多人重启后仍用旧命令行窗口连,却忘了那个窗口里的 mysqld 进程其实还挂着,导致误判“重置失败”。











