必须跳过权限检查重置root密码:修改my.cnf添加skip-grant-tables并重启MySQL;用mysql -u root无密登录后,按版本执行UPDATE或ALTER USER重置密码;删掉skip-grant-tables并重启验证;若phpMyAdmin仍报错#1045,需补全'root'@'localhost'用户及权限。
root 用户被删后 phpmyadmin 直接无法登录,不是界面问题,是 mysql 层面认证失败 —— 必须绕过权限系统重置 root,不能靠 phpmyadmin 界面操作。
MySQL 启动时跳过权限检查(安全模式)
这是唯一能进库的前提。直接改配置文件 my.cnf 或 mysqld.cnf,在 [mysqld] 段末尾加一行:
skip-grant-tables
注意:skip-grant-tables 会完全禁用权限验证,所有用户无需密码就能连接,所以必须配合本地访问限制(如只监听 127.0.0.1)或立即重启后执行修复;不同系统配置路径不同:/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)、/etc/my.cnf(CentOS)、C:\ProgramData\MySQL\MySQL Server X.X\my.ini(Windows)。
改完必须重启 MySQL 服务,不是 reload:
-
sudo systemctl restart mysql(Linux systemd) -
sudo service mysqld restart(CentOS init) - Windows:用服务管理器重启
MySQLXX服务
用 mysql 客户端连上并重置 root 密码
此时用 mysql -u root 就能直连,不需要密码。进库后不能直接 CREATE USER 或 ALTER USER,因为权限表结构可能已损坏或版本不兼容(MySQL 5.7+ 和 8.0+ 的 mysql.user 表字段差异大)。
立即学习“PHP免费学习笔记(深入)”;
按实际 MySQL 版本选操作:
- MySQL 5.7 及更早:
UPDATE mysql.user SET authentication_string=PASSWORD('新密码') WHERE User='root'; FLUSH PRIVILEGES; - MySQL 8.0+:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; FLUSH PRIVILEGES; - 如果提示
User 'root'@'localhost' doesn't exist,说明 root 行真没了,得先INSERT INTO mysql.user ...补全整行(字段数必须严格匹配当前版本的mysql.user表结构,漏字段会导致后续启动失败)
关掉 skip-grant-tables 并验证登录
这步最容易忘 —— 不注释或删掉 skip-grant-tables 就重启,MySQL 会继续无权限运行,phpMyAdmin 还是连不上,且暴露严重安全风险。
操作顺序必须是:
- 退出 mysql 客户端
- 编辑
my.cnf,删掉或注释掉skip-grant-tables行 - 再次重启 MySQL:
sudo systemctl restart mysql - 用新密码测试命令行登录:
mysql -u root -p - 确认能进,再打开 phpMyAdmin 页面尝试登录
如果 phpMyAdmin 仍报 #1045 Cannot log in to the MySQL server,大概率是 root 用户的 host 值不对(比如只有 'root'@'127.0.0.1',但 phpMyAdmin 是通过 localhost 连的),需要补一条:CREATE USER 'root'@'localhost' IDENTIFIED BY '密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
整个过程里最危险的其实是忘记删 skip-grant-tables,其次是 MySQL 8.0+ 强制要求指定 authentication_plugin,用错插件(比如写成 caching_sha2_password)会导致 phpMyAdmin 连接时卡住或报错 Authentication plugin 'caching_sha2_password' cannot be loaded —— 这时候就得回退到 mysql_native_password。


















