直接查 mysql.user 表最可靠,SELECT User, Host FROM mysql.user 可获当前生效用户列表;注意权限、Host 匹配规则及版本字段差异,权限详情需结合 SHOW GRANTS 或其他权限表。

直接查 mysql.user 表是最可靠的方式
MySQL 所有用户信息都固化在系统库 mysql 的 user 表里,不依赖缓存或会话状态,执行一次 SELECT 就能拿到当前生效的完整用户列表。注意:必须用有 SELECT 权限的账号(通常是 root 或具备 SELECT ON mysql.user 的管理员)登录后执行,否则会报错 Access denied。
SELECT User, Host FROM mysql.user 足够日常使用
这条语句返回最核心的两个字段:User 是用户名,Host 是允许连接的来源主机(不是客户端 IP,是创建用户时指定的 pattern)。常见组合如:
-
'app_user'@'10.20.30.%':只允许来自该网段的连接 -
'backup'@'localhost':仅本机 socket 连接可用 -
'admin'@'%':任意主机可连(高风险,慎用)
⚠️ 容易踩的坑:Host 值为 % 并不包含 localhost —— MySQL 把 localhost 当作特殊本地通道处理,和 TCP 的 127.0.0.1 也不同。所以 'user'@'%' 无法从本机命令行直连,得显式用 -h 127.0.0.1。
查字段定义前先看 DESCRIBE mysql.user
MySQL 版本差异大,mysql.user 表结构在 5.7、8.0、8.4 中变动频繁。比如:
-
password字段在 5.7.6+ 已被废弃,改用authentication_string -
account_locked和password_expired在 5.7.6+ 才有 - 8.0+ 新增了
password_reuse_history、password_require_current等列
执行 DESCRIBE mysql.user 能立刻确认你当前实例有哪些字段可用,避免写死列名导致查询失败。
需要权限详情时别只看 mysql.user
mysql.user 只存全局权限(如 Select_priv),不反映库级、表级或列级授权。如果要查某用户对某个数据库的实际权限,必须配合:
-
SHOW GRANTS FOR 'username'@'host':返回可执行的授权语句,最直观 - 查
mysql.db、mysql.tables_priv等表:对应库/表级权限,但字段含义复杂,容易误读
特别注意:SHOW GRANTS 返回结果里的 USAGE 表示“无任何权限”,不是漏查,而是明确限制。另外,权限生效需执行 FLUSH PRIVILEGES(仅在手动改表后才需要,正常用 CREATE USER/GRANT 不用)。











