不能直接查出所有用户完整权限;MySQL 8.0+权限分层存储,mysql.user仅含全局权限(如Select_priv为'Y'/'N'字符串),库级权限在mysql.db,角色权限需查mysql.role_edges,SHOW GRANTS FOR 'u'@'h'才是真实生效权限。

直接用 mysql 命令行工具配合 Python 脚本就能完成,不需要额外 ORM 或复杂框架;关键在于准确查询 mysql.user 和 mysql.db 表,并规避权限视图不可见、账号过期、密码强度策略等隐性陷阱。
怎么查出所有用户及其全局权限?
MySQL 8.0+ 的权限存储在 mysql.user 表中,但字段名和语义与旧版本差异大(比如 plugin、account_locked、password_expired 都是关键字段),不能只看 Select_priv 这类布尔列——它们是字符串 'Y' 或 'N',不是布尔值。
- 执行
SELECT User, Host, plugin, account_locked, password_expired, password_last_changed FROM mysql.user获取基础状态 - 用
SHOW GRANTS FOR 'user'@'host'动态获取实际生效权限(比解析mysql.user更可靠,尤其涉及角色时) - 注意:非 super 用户执行
SHOW GRANTS只能看到自己的权限,巡检脚本必须用高权限账号连接 - Python 中用
mysql-connector-python或pymysql,避免用已弃用的MySQLdb
如何识别高危权限组合?
巡检不是罗列权限,而是定位风险点。比如 GRANT OPTION + CREATE USER 意味着该用户能创建并授权其他账号;SUPER 权限在 MySQL 8.0.12+ 已被细粒度权限替代,但仍有残留。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 检查
SHOW GRANTS结果中是否含GRANT OPTION、INSERT或UPDATE对mysql.*表的权限 -
SELECT权限若覆盖mysql.user,可能泄露密码哈希(即使只是SELECT,也属敏感) - 用正则匹配
r"ON\s+`?mysql`?\.`?user`?"判断是否直连系统表 - 对
Host字段为'%'的账号重点标红——除非业务强依赖,否则应限制为具体 IP 段
为什么查不到某些用户的库级权限?
因为库级权限(如 SELECT on db1.*)存在 mysql.db 表,且受 Host + Db + User 三元组联合控制;更麻烦的是,MySQL 8.0 默认启用 check_proxy_users,而 mysql.db 不记录 proxy 权限,得查 mysql.proxies_priv。
立即学习“Python免费学习笔记(深入)”;
- 必须联合查询:
SELECT User, Host, Db, Select_priv, Insert_priv FROM mysql.db WHERE User != '' - 注意
Db字段支持通配符(如test%),需用LIKE而非=匹配 - 若启用了角色(MySQL 8.0+),权限可能来自角色继承,此时
SHOW GRANTS会返回WITH ADMIN OPTION,需递归查mysql.role_edges - Python 脚本里别用字符串拼接 SQL 查询
User,防止空格或特殊字符导致漏查(例如'admin '末尾有空格)
真正难的不是查权限,而是判断“这个权限在此场景下是否合理”——比如一个应用账号拥有 DROP 权限,在上线前是 bug,但在 DBA 维护脚本里可能是 feature。巡检结果必须带上下文注释,而不是只抛个 SELECT_priv: Y。

















