flush privileges 在 phpenv 中通常无效,因其不解决根本问题:mysql 5.7+ 默认禁用 password()、8.0+ 强制 caching_sha2_password 插件,且 localhost 与 127.0.0.1 认证路径不同;正确做法是用 alter user 切换认证插件并重置密码。

phpEnv 中执行 FLUSH PRIVILEGES 通常无效,因为权限不生效的根本原因不是缓存没刷新,而是 MySQL 用户认证方式或 host 匹配失败。
为什么 FLUSH PRIVILEGES 在 phpEnv 里不起作用
phpEnv 是 Windows 下的集成环境(类似 XAMPP),默认使用 MySQL 5.7+ 或 8.0+。从 MySQL 5.7.6 起,UPDATE user 直接改 authentication_string 字段的方式已不可靠;MySQL 8.0 更是彻底弃用 PASSWORD() 函数,且默认启用 caching_sha2_password 插件。
常见表现:
- 执行
UPDATE user SET authentication_string=PASSWORD('123') WHERE user='root'后再FLUSH PRIVILEGES,仍无法用新密码登录 - Navicat 或 PHP 连接报错:
Access denied for user 'root'@'localhost'或Client does not support authentication protocol requested by server -
FLUSH PRIVILEGES本身成功(无报错),但权限/密码没变
正确重置 phpEnv 中 MySQL root 密码的步骤
绕过旧式 SQL 更新,改用 ALTER USER —— 这才是 MySQL 5.7+ 的标准做法,且不依赖 FLUSH PRIVILEGES:
- 用管理员权限打开命令行,进入 phpEnv 的 MySQL
bin目录(如D:\phpEnv\MySQL57\bin) - 停掉 MySQL 服务:
net stop mysql57(服务名以你实际安装为准) - 跳过权限验证启动:
mysqld --skip-grant-tables --shared-memory - 新开一个命令行窗口,直接连接:
mysql -u root(此时无需密码) - 执行(注意:MySQL 8.0 必须指定插件):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123';
- 如果还存在
'root'@'127.0.0.1'或'root'@'%',也需分别执行对应ALTER USER - 退出并重启 MySQL 服务:
net start mysql57
phpEnv 下哪些情况真需要 FLUSH PRIVILEGES
它只在极少数手动修改系统表后才需调用,比如:
- 用
INSERT INTO user或UPDATE user直接写入用户记录(不推荐) - 修改了
db、tables_priv等授权表(非常规运维) - 你确认自己没用
CREATE USER或GRANT,而是纯 SQL 改表
但即使这时,也要先确认 MySQL 是否运行在严格模式、是否启用了 read_only,否则 FLUSH PRIVILEGES 会静默失败。
Navicat 连不上?检查 host 和插件双重匹配
phpEnv 默认配置中,MySQL 的 bind-address 通常是 127.0.0.1,而 Navicat 默认尝试 localhost —— 这俩在 Windows 下不等价:
-
localhost触发 socket 连接,走mysql_native_password插件 -
127.0.0.1触发 TCP 连接,可能匹配到caching_sha2_password,而 Navicat 旧版不支持 - 解决方法:Navicat 连接时 Host 填
127.0.0.1,并确保该用户的认证插件是mysql_native_password
验证命令:
SELECT user,host,plugin FROM mysql.user WHERE user='root';
如果 plugin 是 caching_sha2_password,必须用 ALTER USER ... IDENTIFIED WITH mysql_native_password 切换,FLUSH PRIVILEGES 不能改变这个设置。
真正卡住的地方,从来不是 FLUSH PRIVILEGES 没执行,而是你改的那条记录压根没被 MySQL 认作有效凭证 —— host 不对、plugin 不兼容、密码加密方式错,三者占其一,刷一百次权限也没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











