phpEnv中MySQL root权限丢失或密码遗忘时,须用--skip-grant-tables模式绕过校验:先彻底终止mysqld.exe进程,再从phpEnv的bin目录启动mysqld --skip-grant-tables --shared-memory,然后mysql -u root连接并更新authentication_string字段(或password字段)及刷新权限,最后关闭该实例并重启phpEnv MySQL服务验证。

phpEnv 中 MySQL 的 root 权限丢失或密码遗忘,不能靠图形界面重置——必须进命令行,用 --skip-grant-tables 模式绕过权限校验,再手动更新 user 表。phpEnv 是绿色免安装版,没有服务注册、不走系统 service 管理,所以操作路径和参数都得对准它的 bin 目录和配置逻辑。
确认 phpEnv 的 MySQL 进程已彻底停止
绿色版不会自动注册 Windows 服务,但可能残留 mysqld.exe 进程,直接 kill 才算真正停掉:
- 打开任务管理器 → “详细信息”页 → 查找所有
mysqld.exe,全部结束 - 不要只依赖 phpEnv 界面的“停止”按钮,它有时只发信号不阻塞,进程仍在后台跑
- 如果不确定是否干净,执行
tasklist /fi "imagename eq mysqld.exe",输出为空才安全
在 phpEnv 的 MySQL bin 目录下启动跳过权限模式
phpEnv 的 MySQL 是便携部署,mysqld 必须从其自身 bin 目录运行,否则会读错 my.ini 或找不到 data 目录:
- 进入类似
D:\phpEnv\mysql-5.6.20\bin的路径(具体以你解压位置为准) - 执行:
mysqld --skip-grant-tables --shared-memory - 这个窗口必须保持打开——它就是你的 MySQL 实例,关了就断连
- 注意:不要加
--console,否则窗口关闭即退出;也不要加--defaults-file,除非你明确指定了 phpEnv 的my.ini路径
连接并更新 root 用户的 authentication_string 字段
MySQL 5.6+ 使用 authentication_string 字段存密码哈希,不是旧版的 password 字段;直接改错字段会导致登录仍失败:
立即学习“PHP免费学习笔记(深入)”;
- 新开一个 CMD 窗口,同样 cd 到
bin目录,执行:mysql -u root(不加-p,此时无密码) - 输入:
USE mysql; - 执行更新语句(注意区分 MySQL 版本):
UPDATE user SET authentication_string=PASSWORD('新密码') WHERE User='root' AND Host='localhost';
如果是 MySQL 5.7.6+ 或 MariaDB 10.2+,改用:ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
- 必须执行:
FLUSH PRIVILEGES;,否则内存权限缓存不刷新 - 如果提示
ERROR 1054 (42S22)找不到authentication_string字段,说明版本太老(如 5.5),换用password字段 +PASSWORD()函数
重启 phpEnv 的 MySQL 并验证 root 登录权限
phpEnv 不依赖系统服务,重启靠界面按钮或手动启停,但前提是前一步的 mysqld 进程已关闭:
- 回到第一个 CMD 窗口(运行
mysqld --skip-grant-tables的那个),按Ctrl+C终止它 - 在 phpEnv 主界面点击“启动”MySQL,或手动执行:
net start mysql(仅当用mysqld -install注册过服务) - 验证:
mysql -u root -p,输入新密码,能进mysql>提示符即成功 - 若仍报
Access denied for user 'root'@'localhost',大概率是Host值不对——查一下:SELECT Host,User FROM mysql.user WHERE User='root';,常见值有'127.0.0.1'、'::1'、'%',得对应更新
最易被忽略的是:phpEnv 的 MySQL 默认只允许 localhost 连接,而 Windows 下 localhost 和 127.0.0.1 在权限表里是两条记录,改完一个不等于另一个也生效。



















