先执行SELECT VERSION()确认版本:≥8.0.16则SUPER已废弃,须用SYSTEM_VARIABLES_ADMIN等细粒度权限替代;≤5.7可UPDATE mysql.user设Super_priv='Y'并FLUSH PRIVILEGES;完全失权时需--skip-grant-tables模式修复。

确认当前MySQL版本是否已废弃SUPER权限
先执行 SELECT VERSION();,如果返回值 ≥ 8.0.16,那 SUPER 权限已被彻底移除,任何 GRANT SUPER 或 REVOKE SUPER 都会报错 ERROR 3715 (HY000): The SUPER privilege is obsolete。此时不能“重置SUPER”,而必须用细粒度权限替代:比如 SYSTEM_VARIABLES_ADMIN(对应 SET GLOBAL)、CONNECTION_ADMIN(对应 KILL)、SHUTDOWN(对应关实例)等。跳过这步直接操作,大概率卡在语法报错上。
MySQL 5.7或更低版本:直接更新user表恢复SUPER
若版本 ≤ 5.7 且用户仍可登录(哪怕只剩基本查询权限),可用高权限账户执行:
UPDATE mysql.user SET Super_priv='Y', Grant_priv='Y' WHERE User='root' AND Host='localhost';FLUSH PRIVILEGES;
注意:Super_priv 字段值必须是大写 'Y',小写 'y' 或空字符串均无效;Host 必须精确匹配(如 '%' 和 'localhost' 是两个不同账户);执行后需 FLUSH PRIVILEGES 才生效——这点在5.7及以前是必需的。
所有版本通用:用 --skip-grant-tables 模式强制修复
当用户完全无法登录、或 mysql.user 表权限字段被清空(如全为 'N'),必须停服并绕过权限验证:
- 停止服务:
sudo systemctl stop mysql(Linux)或任务管理器结束mysqld.exe(Windows) - 启动免验证模式:
sudo mysqld --skip-grant-tables --skip-networking &(加--skip-networking防未授权远程访问) - 无密码登录:
mysql -u root - 修复权限:
UPDATE mysql.user SET Super_priv='Y', Grant_priv='Y', Reload_priv='Y' WHERE User='root' AND Host='localhost'; - 刷新:
FLUSH PRIVILEGES; - 退出并正常重启服务
关键点:在 --skip-grant-tables 模式下,GRANT/SET PASSWORD 语句会被拒绝,只能靠 UPDATE 直接改表;MariaDB 同理,但字段名可能是 super_priv(小写),需先 DESCRIBE mysql.user; 确认。
别忘了清理残留连接和角色继承
即使权限字段已更新,旧连接仍持有历史权限:
- 查活跃会话:
SELECT ID, USER, HOST, COMMAND, TIME FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root'; - 逐个终止:
KILL CONNECTION [ID];(MySQL 5.7+ 推荐用带CONNECTION的语法) - 检查是否通过角色获得权限:
SELECT * FROM mysql.role_edges WHERE TO_USER = 'root';,若有,需从角色撤销或剥离角色
最易忽略的是角色间接授权——你修好了 root 的 Super_priv,但如果它还属于一个已拥有 SYSTEM_VARIABLES_ADMIN 的角色,那实际能力可能比预期更强,也更难审计。


















