root用户被删后phpMyAdmin报#1045,必须通过skip-grant-tables绕过权限检查进库补全mysql.user表中root@localhost完整记录(含authentication_string、plugin、account_locked、password_last_changed等字段),执行FLUSH PRIVILEGES后重启MySQL服务,并确认phpMyAdmin auth_type配置与实际登录方式匹配。
root用户被删后phpMyAdmin直接报#1045,必须跳过权限系统重置
phpmyadmin页面显示“#1045 - access denied for user 'root'@'localhost'”,且连登录框都不出现,说明mysql里root账号已不存在——不是密码错,是整行记录没了。此时任何phpmyadmin界面操作都无效,必须用skip-grant-tables绕过权限检查进库补数据。
操作要点:
- 停MySQL服务:
sudo systemctl stop mysql(Linux)或通过服务管理器停止Windows上的MySQL服务 - 编辑配置文件,在
[mysqld]段末尾加一行:skip-grant-tables(路径:Ubuntu为/etc/mysql/mysql.conf.d/mysqld.cnf,Windows为C:\ProgramData\MySQL\MySQL Server X.X\my.ini) - 重启MySQL:
sudo systemctl start mysql,此时mysql -u root可无密直连 - 进库后先查表结构:
DESCRIBE mysql.user;,确认字段数(MySQL 8.0+比5.7多account_locked等字段),再INSERT完整行,不能只填User和Host
ALTER USER失败提示“User 'root'@'localhost' doesn't exist”时怎么补全
执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd';报错,说明mysql.user里真没这行。不能只INSERT几个字段,否则MySQL启动会失败。
正确做法:
- 先查当前版本字段:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='mysql' AND TABLE_NAME='user' ORDER BY ORDINAL_POSITION; - 按实际字段顺序构造INSERT语句,例如MySQL 8.0+需包含
authentication_string、plugin、account_locked、password_last_changed等,缺一不可 - 关键字段值示例:
plugin = 'mysql_native_password',account_locked = 'N',password_last_changed = NOW() - 插入后必须立刻执行:
FLUSH PRIVILEGES;,否则新用户不生效
改完认证插件后phpMyAdmin仍报错,漏了哪步?
执行了ALTER USER和FLUSH PRIVILEGES,但phpMyAdmin还是#1045,大概率是没重启MySQL服务,或者auth_type配置与实际不符。
立即学习“PHP免费学习笔记(深入)”;
排查顺序:
- 确认MySQL已重启:
sudo systemctl status mysql,看启动时间是否晚于你改配置的时间 - 查phpMyAdmin当前认证模式:
grep "auth_type" /path/to/phpmyadmin/config.inc.php,若为'config',则它读$cfg['Servers'][$i]['password'];若为'cookie'或'http',则密码字段被忽略,你输的才是关键 - 验证
root账号是否真能连:mysql -u root -p输刚设的密码,能进才说明MySQL层修复完成 - 检查Host匹配:
SELECT User,Host FROM mysql.user WHERE User='root';,必须有'root'@'localhost','root'@'127.0.0.1'无效
phpMyAdmin 4.x老版本里找不到Privileges入口怎么办
登录后顶部菜单没有「Users」或「Privileges」,不是权限不够,是phpMyAdmin 4.0–4.2把入口藏在右上角用户名下拉菜单里。
实操路径:
- 点右上角当前用户名 → 出现下拉列表 → 找「Privileges」(不是「User accounts」,也不是中文「账户」)
- 若没这个选项,说明当前登录账号没
SELECT权限查mysql.user表,换root或带GRANT OPTION的账号重登 - 进入用户列表后,滚动到页面最底部,找到「Add privileges on the following databases」下拉框,选
All databases才能勾全局权限 - 勾完权限后别点「Go」就完事,必须额外点右上角的「Reload privilege tables」按钮,否则
FLUSH PRIVILEGES不会执行
补全root账号最易卡在字段遗漏或FLUSH PRIVILEGES漏执行;改认证插件后不重启MySQL,或auth_type配错,都会让前面所有操作白费。每一步都得验证结果,而不是只跑命令。



















