应将 phpMyAdmin 所用 MySQL 用户的认证插件改为 mysql_native_password,执行 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; 并 FLUSH PRIVILEGES,最后重启 MySQL 服务。
phpMyAdmin 连 MySQL 8.0 报错 #2054 怎么办
直接原因是 mysql 8.0 默认用 caching_sha2_password 插件,而旧版 phpmyadmin(或底层 php 的 mysqlnd 扩展)不识别它。报错信息通常是:the server requested authentication method unknown to the client 或 (hy000/2054)。这不是密码错了,是认证协议根本对不上。
改用户认证插件比改全局配置更安全
优先针对 phpMyAdmin 实际使用的用户(比如 'root'@'localhost')单独改认证方式,避免影响其他服务。执行前先确认当前插件:
SELECT plugin FROM mysql.user WHERE user = 'root' AND host = 'localhost';
如果返回 caching_sha2_password,就运行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';-
FLUSH PRIVILEGES;—— 这句不能省,否则不生效
若用户是 'root'@'127.0.0.1' 或 'pma'@'%',把 WHERE 条件和 ALTER 语句里的 host 对应改掉。
为什么改了插件还连不上
常见漏点:
- 没重启 MySQL 服务:改完必须
sudo systemctl restart mysql(或mysqld),Docker 容器要docker restart - phpMyAdmin 配置里
$cfg['Servers'][$i]['auth_type']设成了config,但你改的是cookie模式下输的密码——查配置用grep auth_type /path/to/config.inc.php - MySQL 绑定地址没开 TCP:如果只留
bind-address = 127.0.0.1,localhost走 socket,127.0.0.1才走 TCP;确保ss -tlnp | grep :3306有输出
docker 环境下特别容易踩的坑
容器里跑 phpMyAdmin 连宿主机 MySQL,填 localhost 是连自己容器里的 mysqld(通常不存在);填 127.0.0.1 也连不到宿主机(网络隔离)。正确做法:
- Linux 宿主机:用宿主机真实内网 IP(如
192.168.1.100),并确保 MySQL 允许该 IP 连接(GRANT+FLUSH PRIVILEGES) - Docker Desktop(macOS/Windows):可用
host.docker.internal,但 Linux 默认不支持,别硬套 - 最稳方案:把 MySQL 也放进 Docker,用自定义 bridge 网络,用容器名当 host
认证插件问题在容器里更隐蔽——有些 MySQL 镜像启动时没指定 --default-authentication-plugin=mysql_native_password,哪怕你改了用户插件,新创建的用户仍会继承默认值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











