这不是phpmyadmin的问题,而是mysql权限表损坏或未初始化导致认证失败;需通过--skip-grant-tables安全模式启动mysql,执行flush privileges和alter user切回mysql_native_password插件,并同步修正config.inc.php中的host、socket及auth_type配置。
phpmyadmin 提示 “#1045 - access denied” 但 mysql 账号密码正确
这大概率不是 phpmyadmin 的问题,而是 mysql 的权限表(mysql.user、mysql.db 等)损坏或未初始化。phpmyadmin 只是前端,它连接 mysql 失败时,实际是 mysqli_connect() 或 pdo 底层抛出认证失败——根源在服务端权限系统。
常见诱因包括:直接用 TRUNCATE 或 DROP 操作了 mysql 库、MySQL 升级后未运行 mysql_upgrade、或使用非标准方式初始化数据目录(如复制 datadir 而没重置权限表)。
- 先确认是否真能连 MySQL:终端执行
mysql -u root -p,如果也报#1045,说明是 MySQL 层面权限失效 - 不要尝试在 phpMyAdmin 里“修复权限”,它没有底层权限表写入能力
- 必须用 MySQL 的安全模式(
--skip-grant-tables)启动,绕过权限验证后再手动修复
如何安全启动 MySQL 并重载权限表
跳过权限验证不是“绕过安全”,而是临时让 MySQL 启动时不加载 mysql.user 表,给你一个可写入的入口。操作前务必停止 MySQL 服务:
- Linux 下执行:
sudo systemctl stop mysql(或mysqld,取决于发行版) - 编辑 MySQL 配置文件(通常是
/etc/mysql/my.cnf或/etc/my.cnf),在[mysqld]段落下添加:skip-grant-tables和skip-networking(后者防远程未授权访问) - 启动 MySQL:
sudo systemctl start mysql - 此时可无密码登录:
mysql -u root(不加-p) - 立即执行:
FLUSH PRIVILEGES;→ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';(MySQL 8.0+ 必须指定插件) - 删掉配置里的
skip-grant-tables和skip-networking,再重启 MySQL
MySQL 8.0+ 特别注意:user 表结构变更导致旧修复脚本失效
MySQL 8.0 把认证插件字段从 Password 拆成 plugin 和 authentication_string,且默认禁用 mysql_native_password。直接 UPDATE mysql.user SET Password=PASSWORD('xxx') 会报错或无效。
- 检查当前 root 用户插件:
SELECT User, Host, plugin FROM mysql.user WHERE User='root'; - 若 plugin 是
caching_sha2_password,而客户端(如 phpMyAdmin)不支持,就需切回:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; - phpMyAdmin 默认用 mysqli 扩展,它在 PHP 7.4+ 才原生支持
caching_sha2_password;老版本 PHP 必须切插件,否则始终连不上 - 修复完别忘了运行:
FLUSH PRIVILEGES;—— 这步漏掉,修改不会生效
修复后 phpMyAdmin 仍报错:检查 config.inc.php 中的 auth_type 和 socket
权限表修好了,但 phpMyAdmin 自己的连接配置可能还卡在旧状态。重点看三处:
-
$cfg['Servers'][$i]['auth_type']:如果设为cookie或http,它会走自己的登录页,但底层仍依赖 MySQL 账号可用;确保你填的用户名密码能直连 MySQL -
$cfg['Servers'][$i]['host']:别写127.0.0.1(走 TCP)而应写localhost(走 Unix socket),尤其当 MySQL 配置了bind-address = 127.0.0.1但没开skip-networking时,socket 更可靠 -
$cfg['Servers'][$i]['socket']:如果 MySQL 用了自定义 socket 路径(如/var/run/mysqld/mysqld.sock),这里必须显式填写,否则 phpMyAdmin 会找错位置
权限表损坏本身不难修,难的是修完忘了配对插件、忘了删 skip-grant-tables、或者 phpMyAdmin 还在用旧 socket 路径连——三个环节断一个,就又回到 #1045。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











