在MySQL数据库的安全管理中,全局ALL权限属于最高级别的权限之一,拥有该权限的用户可以对实例内所有数据库和表执行增删改查、结构修改、权限授予等所有操作。如果这类权限被分配给非必要的用户,很容易引发数据泄露、误删数据等安全问题,因此定期审计拥有全局ALL权限的用户是运维人员的必备工作。而mysql.user表存储了所有MySQL用户的全局权限信息,梳理其中的Priv字段就能快速定位到目标用户。

mysql.user表Priv字段的作用
mysql.user是MySQL系统库中的核心权限表,每一行记录对应一个MySQL用户的全局权限配置。表中的Priv字段(实际是多个以_priv结尾的字段集合,比如Select_priv、Insert_priv等)用来标识该用户是否拥有对应的全局权限,当所有权限字段都为Y时,就代表该用户拥有全局ALL权限。
常见的全局权限字段说明
mysql.user表中和全局权限相关的核心字段如下:
- Select_priv:是否拥有全局查询权限
- Insert_priv:是否拥有全局插入权限
- Update_priv:是否拥有全局更新权限
- Delete_priv:是否拥有全局删除权限
- Create_priv:是否拥有全局创建数据库/表权限
- Drop_priv:是否拥有全局删除数据库/表权限
- Grant_priv:是否拥有全局权限授予权限
- Alter_priv:是否拥有全局修改表结构权限
- Super_priv:是否拥有超级管理权限
审计拥有全局ALL权限用户的查询方法
要定位所有拥有全局ALL权限的用户,只需要查询mysql.user表中所有_priv字段的值都为Y的记录即可。以下是具体的查询实现。
基础查询语句
我们可以通过拼接条件的方式,判断所有权限字段是否都为Y,示例代码如下:
-- 查询所有拥有全局ALL权限的用户 SELECT user, host FROM mysql.user WHERE Select_priv = 'Y' AND Insert_priv = 'Y' AND Update_priv = 'Y' AND Delete_priv = 'Y' AND Create_priv = 'Y' AND Drop_priv = 'Y' AND Grant_priv = 'Y' AND Alter_priv = 'Y' AND Super_priv = 'Y' AND Index_priv = 'Y' AND Create_user_priv = 'Y' AND Create_tablespace_priv = 'Y' AND Create_view_priv = 'Y' AND Show_view_priv = 'Y' AND Trigger_priv = 'Y' AND Event_priv = 'Y' AND Reload_priv = 'Y' AND Shutdown_priv = 'Y' AND Process_priv = 'Y' AND File_priv = 'Y' AND Show_db_priv = 'Y' AND Lock_tables_priv = 'Y' AND References_priv = 'Y';
简化查询方式
如果觉得逐个字段判断比较繁琐,也可以通过查询mysql.user表的完整权限列,手动核对结果,示例代码如下:
-- 查询所有用户的全局权限信息,手动核对所有_priv字段是否为Y
SELECT user, host,
Select_priv, Insert_priv, Update_priv, Delete_priv,
Create_priv, Drop_priv, Grant_priv, Alter_priv, Super_priv,
Index_priv, Create_user_priv, Create_tablespace_priv,
Create_view_priv, Show_view_priv, Trigger_priv, Event_priv,
Reload_priv, Shutdown_priv, Process_priv, File_priv,
Show_db_priv, Lock_tables_priv, References_priv
FROM mysql.user;
查询结果解读与处理建议
执行上述查询后,返回的结果就是当前实例中所有拥有全局ALL权限的用户。对于这类用户,建议按照以下规则处理:
- 如果是数据库管理员账号,确认是否为必要分配,避免多人共用同一个高权限账号
- 如果是业务账号,及时回收全局ALL权限,按照最小权限原则分配仅对应业务库的操作权限
- 如果是废弃账号,直接删除该用户避免权限残留
权限回收示例
如果确认某个用户不需要全局ALL权限,可以通过以下语句回收所有全局权限,再重新分配必要权限:
-- 回收用户test_user@'%'的所有全局权限 REVOKE ALL PRIVILEGES ON *.* FROM 'test_user'@'%'; -- 刷新权限使配置生效 FLUSH PRIVILEGES; -- 给该用户分配仅对test_db库的查询权限 GRANT SELECT ON test_db.* TO 'test_user'@'%'; FLUSH PRIVILEGES;
注意事项
执行权限查询和修改操作需要当前登录用户拥有mysql.user表的查询权限以及GRANT OPTION权限,普通业务账号无法执行相关操作。另外,修改权限后一定要执行FLUSH PRIVILEGES;语句,否则权限修改不会立即生效。定期(比如每月一次)执行上述审计操作,可以有效降低高权限账号带来的安全风险。