MySQL root用户认证插件不匹配导致phpMyAdmin报#1045错误,主因是auth_socket插件仅认系统用户身份;需改用mysql_native_password插件,并确保host配置(localhost/127.0.0.1)与MySQL监听地址一致,且权限记录中root@localhost和root@127.0.0.1均正确配置。
MySQL root 用户认证插件不匹配
phpmyadmin 显示 #1045 - access denied for user 'root'@'localhost',但密码正确,大概率是 mysql 5.7+ 默认启用 auth_socket 插件所致。该插件不校验密码,只认 linux 系统用户身份(如 sudo mysql -u root 能进,但 phpmyadmin 以 www-data 运行,无法通过)。
- 验证方式:执行
sudo mysql -u root -e "SELECT User, Host, plugin FROM mysql.user WHERE User='root';",若plugin列为auth_socket,即确认问题 - 修复命令(推荐):
sudo mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;" - 若需保留空密码(仅限开发环境),必须同时设
$cfg['Servers'][$i]['AllowNoPasswordRoot'] = true;,且确保$cfg['Servers'][$i]['password']为空字符串
phpMyAdmin host 配置与 MySQL 监听地址不一致
写 'localhost' 和 '127.0.0.1' 在 phpMyAdmin 中完全不是一回事:前者强制走 Unix socket,后者走 TCP/IP。若 MySQL 只监听 127.0.0.1:3306(常见于默认配置),而 phpMyAdmin 配了 'localhost',就会报 “No such file or directory” 或直接拒绝连接。
- 查 MySQL 实际监听:运行
ss -tlnp | grep :3306,看输出是否含127.0.0.1:3306或*:3306 - 查 MySQL 配置:打开
/etc/mysql/mysql.conf.d/mysqld.cnf,确认[mysqld]段中bind-address = 127.0.0.1(不是localhost,那行无效) - 对应修改 phpMyAdmin:
$cfg['Servers'][$i]['host'] = '127.0.0.1';—— 必须严格匹配,不能用localhost替代
宝塔或 WAMP 环境下端口/服务未就绪
在宝塔面板中访问 http://IP:888/phpmyadmin 报 “Connection refused”,通常不是数据库问题,而是 phpMyAdmin 自身服务没起来或端口被占。
- 先确认 phpMyAdmin 服务状态:宝塔「软件商店」→ 找到 phpMyAdmin → 点「停止」再「启动」
- 检查 888 端口占用:
lsof -i :888,若非nginx进程占着,用kill -9 PID清掉 - WAMP 用户注意:
config.inc.php中的$cfg['Servers'][$i]['host']若设为'localhost',需确保 MySQL 启用了 socket;否则应改为'127.0.0.1'并确认 MySQL 的skip-networking是关闭状态
权限记录中 localhost 与 127.0.0.1 被视为不同用户
MySQL 权限系统把 'root'@'localhost' 和 'root'@'127.0.0.1' 当作两个独立账户。即使你改了 'localhost' 的认证方式,'127.0.0.1' 的权限可能仍是空或禁用的,导致 phpMyAdmin 用 IP 方式连接时失败。
- 检查全部 root 权限记录:
SELECT User, Host, plugin FROM mysql.user WHERE User='root'; - 若缺少
'root'@'127.0.0.1',可复制权限:CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; FLUSH PRIVILEGES; - 注意:不要盲目
DROP 'root'@'localhost',很多本地管理工具依赖它
实际调试时最容易卡在「以为改了密码就万事大吉」,却忽略认证插件、host 解析路径、权限 host 匹配这三重隔离。每一步都得单独验证,不能靠“应该能通”来跳步。
立即学习“PHP免费学习笔记(深入)”;



















