你的MySQL数据库里都有谁?一文掌握用户查看、权限分析与安全监控

时间:2025-10-10 16:18

在 MySQL 中查看用户是一个基础但至关重要的管理操作。下面我将为您详细解析如何查看用户信息、权限以及相关的注意事项。

一、查看用户列表

MySQL 的用户信息主要存储在 ​​mysql​​ 系统数据库的 ​​user​​ 表中。

方法一:直接查询 ​​mysql.user​​ 表(最全面)

这是最直接的方法,可以获取用户的所有基础信息。

SELECT User, Host, authentication_string FROM mysql.user;

输出示例:

+------------------+-----------+-------------------------------------------+
| User             | Host      | authentication_string                     |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| mysql.session    | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| my_app_user      | %         | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| readonly_user    | 192.168.1.% | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------------+-----------+-------------------------------------------+

关键字段解释:

  • ​User​​: 用户名。
  • ​Host​​: 允许该用户连接的主机。这是 MySQL 安全模型的核心。
  • ​localhost​​: 只能从数据库服务器本机连接。
  • ​%​​: 可以从任何主机连接。
  • ​192.168.1.%​​: 可以从 ​​192.168.1.0/24​​ 网段的任何主机连接。
  • ​authentication_string​​: 用户的加密密码哈希(在 MySQL 5.7+ 中叫此名,在 5.6 及以前版本中叫 ​​Password​​)。

获取更简洁的列表: 如果你只想看用户名和主机,可以这样查询:

SELECT User, Host FROM mysql.user;

方法二:使用 ​​SHOW GRANTS​​ 查看特定用户权限(间接查看)

虽然 ​​SHOW GRANTS​​ 主要用于查看权限,但它会明确显示用户和主机,是确认用户存在的另一种方式。

-- 查看当前用户
SHOW GRANTS;

-- 查看指定用户(需要相关权限)
SHOW GRANTS FOR 'my_app_user'@'%';
SHOW GRANTS FOR 'root'@'localhost';

注意: 指定用户时必须同时提供 ​​'username'@'host'​​,这与 ​​mysql.user​​ 表中的记录完全对应。

二、查看当前登录的用户

有时你需要知道当前是哪个用户在操作数据库。

-- 方法1:返回用户和主机
SELECT USER();
-- 输出:'my_app_user@192.168.1.100'

-- 方法2:返回用户、主机和连接ID
SELECT CURRENT_USER();
-- 输出:'my_app_user@%'

-- 查看进程列表(可以看到所有当前连接的用户和他们在执行的命令)
SHOW PROCESSLIST;

​USER()​​ vs ​​CURRENT_USER()​​ 的区别:

  • ​USER()​​: 返回的是客户端尝试连接时声称的用户名和客户端的主机名。
  • ​CURRENT_USER()​​: 返回的是 MySQL 授权系统实际用来做权限验证的用户名和主机组合。这个值来自 ​​mysql.user​​ 表,是最终确定的身份。

三、查看用户的详细权限

仅仅知道用户存在是不够的,更重要的是知道他们有哪些权限。

  1. 查看全局权限

全局权限适用于服务器上的所有数据库。

SHOW GRANTS FOR 'username'@'host';

示例输出:

SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+

​*.*​​ 表示所有数据库的所有表,​​ALL PRIVILEGES​​ 表示拥有全部权限。

  1. 查看数据库级权限

数据库级权限适用于指定数据库的所有对象。

-- 查看用户对特定数据库的权限
SELECT * FROM mysql.db WHERE User='username' AND Host='host'\G
  1. 查看表级和列级权限

这些权限记录在 ​​mysql.tables_priv​​ 和 ​​mysql.columns_priv​​ 表中。

-- 查看表级权限
SELECT * FROM mysql.tables_priv WHERE User='username' AND Host='host';

-- 查看列级权限
SELECT * FROM mysql.columns_priv WHERE User='username' AND Host='host';

四、实用查询示例

  1. 查看所有用户及其权限摘要

这个查询可以帮你快速了解每个用户的大致权限范围。

SELECT
    User,
    Host,
    CASE
        WHEN Select_priv = 'Y' THEN 'Global'
        WHEN EXISTS (SELECT 1 FROM mysql.db WHERE db.User = user.User AND db.Host = user.Host) THEN 'DB'
        ELSE 'Limited'
    END AS Privilege_Level
FROM mysql.user
ORDER BY User, Host;
  1. 查找具有特定权限的用户

例如,查找所有具有 ​​SUPER​​ 权限的用户:

SELECT User, Host FROM mysql.user WHERE Super_priv = 'Y';
  1. 查找可以从任意主机连接的用户

这对于安全检查非常有用。

SELECT User, Host FROM mysql.user WHERE Host = '%';

五、重要注意事项

  1. 执行权限:执行这些查询(尤其是直接查询 mysql 系统表)通常需要管理员权限,如 SELECT 权限在 mysql 数据库上,或者最好是 SHOW DATABASESSELECT 权限。
  2. 用户标识:在 MySQL 中,一个用户是由 'username'@'hostname' 共同唯一确定的。'app_user'@'%''app_user'@'localhost' 是两个完全不同的用户,可以拥有完全不同的密码和权限。
  3. 密码字段:mysql.user 表中的 authentication_string(或 Password)字段存储的是密码的哈希值,你无法通过查询它来获取明文密码。
  4. 修改后刷新:如果你通过 CREATE USER, GRANT, DROP USER 等语句直接修改了用户或权限,这些更改会立即生效。但在某些极少数情况下,如果手动更新了系统表,可能需要执行 FLUSH PRIVILEGES; 来重新加载权限。

总结

你的需求

推荐命令

查看所有用户列表

​SELECT User, Host FROM mysql.user;​

查看当前登录用户

​SELECT CURRENT_USER();​

查看特定用户的完整权限

​SHOW GRANTS FOR 'user'@'host';​

安全检查(查找远程用户)

​SELECT User, Host FROM mysql.user WHERE Host = '%';​

查看用户进程

​SHOW PROCESSLIST;​

掌握这些命令,你就能全面了解和监控 MySQL 的用户状况,这是进行数据库权限管理和安全审计的基础。 另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。

mysql设置最大连接数,设置最大连接数的方法
选择哪个MySQL安装包下载?部署后如何统一管理多个实例?
MySQL修改字段长度后,如何验证应用并准备回滚?
MySQL数据库安装在不同系统,备份方法能统一吗?
「干货指南」MySQL 删除表的正确姿势:DROP TABLE 与 TRUNCATE 详解
告别选择困难症!五大主流MySQL连接工具深度评测,总有一款适合你
MySQL启动不了?保姆级教程来了!Win/Linux/macOS三系统启动命令大全(下)
MySQL版本信息全方位查询指南:涵盖命令行、SQL语句与主流编程语言
从入门到精通:MySQL密码重置全流程详解(附Linux/Windows/Docker方案)
MySQL的「身份证」系统:深入理解自增主键的运作机制、使用技巧与进阶替代方案