在 MySQL 中查看用户是一个基础但至关重要的管理操作。下面我将为您详细解析如何查看用户信息、权限以及相关的注意事项。
一、查看用户列表
MySQL 的用户信息主要存储在 `mysql` 系统数据库的 `user` 表中。
方法一:直接查询 `mysql.user` 表(最全面)
这是最直接的方法,可以获取用户的所有基础信息。
```sql
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`)。
获取更简洁的列表:
如果你只想看用户名和主机,可以这样查询:
```sql
SELECT User, Host FROM mysql.user;
```
方法二:使用 `SHOW GRANTS` 查看特定用户权限(间接查看)
虽然 `SHOW GRANTS` 主要用于查看权限,但它会明确显示用户和主机,是确认用户存在的另一种方式。
```sql
-- 查看当前用户
SHOW GRANTS;
-- 查看指定用户(需要相关权限)
SHOW GRANTS FOR 'my_app_user'@'%';
SHOW GRANTS FOR 'root'@'localhost';
```
注意: 指定用户时必须同时提供 `'username'@'host'`,这与 `mysql.user` 表中的记录完全对应。
二、查看当前登录的用户
有时你需要知道当前是哪个用户在操作数据库。
```sql
-- 方法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. 查看全局权限
全局权限适用于服务器上的所有数据库。
```sql
SHOW GRANTS FOR 'username'@'host';
```
示例输出:
```sql
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` 表示拥有全部权限。
2. 查看数据库级权限
数据库级权限适用于指定数据库的所有对象。
```sql
-- 查看用户对特定数据库的权限
SELECT * FROM mysql.db WHERE User='username' AND Host='host'\G
```
3. 查看表级和列级权限
这些权限记录在 `mysql.tables_priv` 和 `mysql.columns_priv` 表中。
```sql
-- 查看表级权限
SELECT * FROM mysql.tables_priv WHERE User='username' AND Host='host';
-- 查看列级权限
SELECT * FROM mysql.columns_priv WHERE User='username' AND Host='host';
```
四、实用查询示例
1. 查看所有用户及其权限摘要
这个查询可以帮你快速了解每个用户的大致权限范围。
```sql
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;
```
2. 查找具有特定权限的用户
例如,查找所有具有 `SUPER` 权限的用户:
```sql
SELECT User, Host FROM mysql.user WHERE Super_priv = 'Y';
```
3. 查找可以从任意主机连接的用户
这对于安全检查非常有用。
```sql
SELECT User, Host FROM mysql.user WHERE Host = '%';
```
五、重要注意事项
1. 执行权限:执行这些查询(尤其是直接查询 `mysql` 系统表)通常需要管理员权限,如 `SELECT` 权限在 `mysql` 数据库上,或者最好是 `SHOW DATABASES` 和 `SELECT` 权限。
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,简单便捷。可以大大地提高工作效率喔。