phpenv修改MySQL密码须先停止服务,再以--skip-grant-tables --shared-memory启动,登录后执行ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; FLUSH PRIVILEGES;,最后清理my.ini中skip-grant-tables并同步PHP项目配置。

phpenv 修改 MySQL 密码前必须停掉服务
phpenv 启动的 MySQL 是独立进程,不关服务直接改配置或执行 SQL 会失败。你看到 mysql -u root -p 连不上、提示 Access denied 或卡在连接阶段,大概率是 MySQL 正在跑着,而你试图用 --skip-grant-tables 启动第二个实例——系统会报端口占用或拒绝绑定。
正确做法是先在 phpenv 主界面点「MySQL」右侧的「停止」按钮;若按钮无响应,打开任务管理器,结束所有 mysqld.exe 进程(注意区分 phpStudy、XAMPP 等其他环境的同名进程)。
- phpenv 默认 MySQL 数据目录通常在
F:\phpEnv\MySQL\data(盘符依安装路径而定) - bin 目录一般为
F:\phpEnv\MySQL\bin,后续命令都要进这个目录执行 - 别跳过「停止服务」这步——强行覆盖权限表或并发启动会导致数据字典损坏
用 --skip-grant-tables 启动 MySQL 并改 root 密码
这一步绕过密码验证,让你能连上空密码的 root。但要注意:phpenv 的 MySQL 启动常依赖 --shared-memory,漏掉它可能连不上本地 socket。
保持第一个命令行窗口不关闭,执行:
立即学习“PHP免费学习笔记(深入)”;
mysqld --skip-grant-tables --shared-memory
再新开一个窗口,同样进入 F:\phpEnv\MySQL\bin,运行:
mysql -u root
登录后立即执行(MySQL 5.7+ 和 8.0+ 均适用):
USE mysql;<br>ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';<br>FLUSH PRIVILEGES;
- 不要用
UPDATE user SET authentication_string=PASSWORD(...)——PASSWORD()函数在 MySQL 8.0.30+ 已废弃,会报错 - 如果执行
ALTER USER报错ERROR 1396 (HY000),说明用户不存在,先查:SELECT User,Host FROM user; - 改完必须
FLUSH PRIVILEGES;,否则新密码不生效
改完密码后务必清理 skip-grant-tables 配置
phpenv 不通过 my.ini 自动加 skip-grant-tables,但有些用户手动编辑过配置文件(比如 F:\phpEnv\MySQL\my.ini),加了这一行却忘了删。结果重启后 MySQL 一直跳过权限检查,任何账号都能免密登录——这是严重安全漏洞。
检查并编辑 my.ini,确认 [mysqld] 段里没有这行:
skip-grant-tables
- 如果有,删掉或用
#注释掉 - 保存后关闭所有命令行窗口
- 回到 phpenv 界面,点 MySQL 「启动」——此时应要求输入密码才能连上
- 验证:命令行执行
mysql -u root -p,输入新密码,能进mysql>提示符即成功
phpenv 下 PHP 项目连不上数据库?不是密码问题,是配置没同步
改了 MySQL 的 root 密码,不代表你的 Laravel、ThinkPHP 或 WordPress 就自动更新了连接凭据。phpenv 只管 MySQL 服务本身,不管 PHP 应用里的 .env、config/database.php 或 wp-config.php。
典型表现:网站白屏、500 Internal Server Error、错误日志里出现 mysqli_connect(): (HY000/1045): Access denied for user。
- Laravel 项目:改
.env中的DB_PASSWORD=xxx - WordPress:改
wp-config.php中的define('DB_PASSWORD', 'xxx'); - 通用排查:用
grep -r "DB_PASSWORD\|define.*DB_PASS" /F/phpEnv/www/(Windows 下可用 PowerShell 的Select-String)快速定位配置文件 - 改完记得检查文件权限——phpenv 文件管理器有时会把
.env权限锁成只读,导致 PHP 读不到内容
skip-grant-tables 残留、应用配置不同步、以及版本差异导致的 SQL 语法误用。尤其是 PASSWORD() 函数和 authentication_string 字段的混用,在 MySQL 8.0.30+ 上基本等于必挂。



















