在 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
表,是最终确定的身份。三、查看用户的详细权限
仅仅知道用户存在是不够的,更重要的是知道他们有哪些权限。
全局权限适用于服务器上的所有数据库。
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
表示拥有全部权限。
数据库级权限适用于指定数据库的所有对象。
-- 查看用户对特定数据库的权限
SELECT * FROM mysql.db WHERE User='username' AND Host='host'\G
这些权限记录在 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';
四、实用查询示例
这个查询可以帮你快速了解每个用户的大致权限范围。
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;
例如,查找所有具有 SUPER
权限的用户:
SELECT User, Host FROM mysql.user WHERE Super_priv = 'Y';
这对于安全检查非常有用。
SELECT User, Host FROM mysql.user WHERE Host = '%';
五、重要注意事项
mysql
系统表)通常需要管理员权限,如 SELECT
权限在 mysql
数据库上,或者最好是 SHOW DATABASES
和 SELECT
权限。'app_user'@'%'
和 'app_user'@'localhost'
是两个完全不同的用户,可以拥有完全不同的密码和权限。mysql.user
表中的 authentication_string
(或 Password
)字段存储的是密码的哈希值,你无法通过查询它来获取明文密码。CREATE USER
, GRANT
, DROP USER
等语句直接修改了用户或权限,这些更改会立即生效。但在某些极少数情况下,如果手动更新了系统表,可能需要执行 FLUSH PRIVILEGES;
来重新加载权限。总结
你的需求 |
推荐命令 |
查看所有用户列表 |
|
查看当前登录用户 |
|
查看特定用户的完整权限 |
|
安全检查(查找远程用户) |
|
查看用户进程 |
|
掌握这些命令,你就能全面了解和监控 MySQL 的用户状况,这是进行数据库权限管理和安全审计的基础。 另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。