phpEnv启动MySQL报错ERROR 1045的根源是root用户使用auth_socket插件认证,需以--skip-grant-tables启动后执行UPDATE user SET plugin='mysql_native_password' WHERE User='root';并FLUSH PRIVILEGES;,再同步修正php.ini中mysqli.default_socket路径。

phpEnv 启动 MySQL 报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost'
这是 phpEnv 中 MySQL 服务启动后,用命令行或 PHP 连接时最常见的权限失效问题。根本原因不是密码输错,而是 phpEnv 默认安装的 MySQL(尤其 5.7+ 版本)启用了 auth_socket 插件认证,导致即使输入了正确的 root 密码,mysql -u root -p 也会被拒绝。
- 检查当前认证方式:
SELECT User,Host,plugin FROM mysql.user WHERE User='root';—— 若plugin列显示auth_socket,就是它在作祟 - phpEnv 的 MySQL 数据目录通常在
phpEnvMySQLdata,配置文件为my.ini,但直接改配置不解决已存在的用户认证状态 - 不能靠重置密码脚本(如
mysqladmin -u root password xxx)修复,该命令对auth_socket用户无效
强制切换 root 用户为 mysql_native_password 认证
必须进入 MySQL 安全模式(跳过权限表)后手动更新用户插件。phpEnv 的 MySQL 服务默认无 root 密码,所以可直接用 --skip-grant-tables 启动临时实例:
- 关闭 phpEnv 中所有服务,右键托盘图标 →「停止 MySQL」
- 以管理员身份打开命令行,进入
phpEnvMySQLin目录 - 执行:
mysqld --defaults-file=..my.ini --skip-grant-tables --shared-memory(保持该窗口运行) - 另开一个命令行,执行:
mysql -u root mysql(此时无需密码) - 在 MySQL 提示符下运行:
UPDATE user SET plugin='mysql_native_password' WHERE User='root'; FLUSH PRIVILEGES; - 退出并重启 phpEnv 的 MySQL 服务(不是手动启 mysqld)
phpEnv 中 PHP 连接 MySQL 仍失败?检查 mysqli.default_socket 路径
即使认证修复,PHP 的 mysqli 或 PDO 扩展可能因 socket 路径不匹配而报错 Connection refused。phpEnv 的 MySQL 并未使用系统默认 socket(如 /tmp/mysql.sock),而是走 Windows 命名管道或自定义 socket 文件。
- 查看 phpEnv 实际使用的 socket:打开
phpEnvMySQLmy.ini,找socket或shared-memory-base-name配置项;常见值为.\mysql(Windows 管道)或phpEnvMySQLdatamysql.sock - 在
php.ini中显式指定:mysqli.default_socket = "D:/phpEnv/MySQL/data/mysql.sock"(路径按你实际安装位置调整) - 若用 PDO,连接 DSN 中不要写
host=localhost,改用host=127.0.0.1强制走 TCP,避开 socket 解析失败 -
phpinfo()页面里搜索mysqli.default_socket和pdo_mysql.default_socket,确认值是否生效
密码设为空后仍连不上?phpEnv 的 MySQL 服务可能未加载新权限
phpEnv 的「重启 MySQL」按钮有时只杀进程再拉起 mysqld.exe,但不会重新读取权限表缓存。尤其在你手动改过 mysql.user 表后,容易卡在旧状态。
立即学习“PHP免费学习笔记(深入)”;
- 务必在 MySQL 命令行中执行
FLUSH PRIVILEGES;,不只是UPDATE - 检查
phpEnvMySQLdata下是否有ibdata1损坏(表现为服务启动几秒后自动退出),可尝试删掉data目录下除mysql、performance_schema外的所有库文件夹,再重启初始化 - 如果用 phpEnv 自带的「MySQL 管理器」工具连接,它内部可能缓存了旧连接参数 —— 关闭再重开,或换用
HeidiSQL或命令行验证
plugin 不执行 FLUSH PRIVILEGES,以及改完 my.ini 后没同步更新 php.ini 的 socket 路径。这两个点漏掉任何一个,都会让前面所有操作看起来“没用”。



















