ERROR 1044 根本原因是 root@localhost 或 root@% 的 Grant_priv 被设为 'N';需通过 skip-grant-tables 免密登录,执行 UPDATE mysql.user 设置 Grant_priv='Y' 并 FLUSH PRIVILEGES,最后关闭 skip-grant-tables 重启验证。

phpEnv 环境下 MySQL 报 ERROR 1044,基本可以确定是 root@localhost 或 root@% 的 Grant_priv 字段被设为 'N',不是密码错、没启动,也不是 phpEnv 配置问题——是权限表本身坏了。
为什么 phpEnv 启动后突然 1044?
phpEnv 自带的 MySQL(通常是 5.7 或 8.0)在初始化或重装时,有时会漏掉给 root@localhost 设置 Grant_priv = 'Y';更常见的是用户手动执行过 DROP USER 'root'@'%' 或误更新 mysql.user 表,导致权限字段清空。phpEnv 控制面板里点“重启 MySQL”不修复权限,只会重启进程。
- 现象:能连上 MySQL(
mysql -u root -p成功),但一执行GRANT、USE mysql、甚至SHOW DATABASES就报ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql' - 关键判断:用 phpEnv 自带的 MySQL 客户端或命令行登录后,直接运行
SELECT Host, User, Grant_priv, Super_priv FROM mysql.user WHERE User = 'root';,如果看到Grant_priv是'N',就坐实了 - 注意:phpEnv 默认可能启用
skip-grant-tables(尤其旧版本),但一旦关闭该配置又没补权限,就会立刻暴露问题
绕过登录限制,进库修权限
phpEnv 的 MySQL 配置文件通常在 phpenv\mysql\my.ini(Windows)或 phpenv/mysql/my.cnf(Linux/macOS)。必须先让它免密进库,才能更新权限表:
- 用文本编辑器打开
my.ini,在[mysqld]段落下新增一行:skip-grant-tables - 保存后,在 phpEnv 控制面板中「停止 MySQL」→「启动 MySQL」(或手动执行
phpenv\mysql\bin\mysqld --defaults-file=phpenv\mysql\my.ini) - 此时命令行直接运行
mysql -u root(不加-p)即可进入,无需密码 - 进库后立即执行:
UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root' AND Host IN ('localhost', '%'); - 再执行:
FLUSH PRIVILEGES;—— 这步不能省,否则改了白改
修完权限后必须关掉 skip-grant-tables
留着 skip-grant-tables 相当于把数据库大门敞开:任何本地进程都能以任意用户名连入并读写所有数据,phpEnv 下其他服务(如 phpMyAdmin)也可能被恶意利用。
立即学习“PHP免费学习笔记(深入)”;
- 再次编辑
my.ini,删掉或注释掉skip-grant-tables这一行(加#开头) - 重启 MySQL(phpEnv 面板点「重启」或手动 stop/start)
- 验证是否生效:重新用
mysql -u root -p登录,再执行GRANT SELECT ON test.* TO 'testuser'@'localhost';,不报 1044 即成功 - 如果仍报错,检查
Host是否严格匹配——root@localhost和root@127.0.0.1是两个不同账号,得分别 update
真正麻烦的不是修权限这三步,而是 phpEnv 环境里多个 MySQL 实例共存时,你改的可能是 A 实例的配置,却去连了 B 实例的 socket;务必确认 my.ini 路径和当前 phpEnv 切换的 MySQL 版本完全对应。



















