当前位置 主页 > 技术大全 >

    MySQL权限混乱?这几个命令让你彻底理清用户清单与权限归属

    栏目:技术大全 时间:2025-10-17 16:43

    在 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,简单便捷。可以大大地提高工作效率喔。


1分钟搞定MySQL部署!Docker最强实操指南,含所有常用命令和配置
忘记MySQL密码怎么办?别慌!用这一招跳过验证,轻松重置管理员权限
MySQL自增主键用完怎么办?从原理到实战,全面破解开发中的高频难题
MySQL权限混乱?这几个命令让你彻底理清用户清单与权限归属
你的数据库安全吗?读懂MySQL这几种日志,关键时刻能「救你一命」
MySQL性能上不去?八成是这里没配好!手把手教你搞定my.cnf核心配置
修改MySQL字段长度别乱来!这3个核心要点和1个致命陷阱,新手必看
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
你的MySQL数据库为什么总是又慢又卡?掌握这五大优化法则,查询速度快十倍!(上篇)
你的MySQL数据库为什么总是又慢又卡?掌握这五大优化法则,查询速度快十倍!(下篇)