You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8.0中SHOW GRANTS通配符使用及用户权限表创建方法

MySQL 8.0 通配符查询所有用户权限说明

MySQL 8.0 原生不支持在SHOW GRANTS语句中直接用通配符匹配查询所有用户权限,直接执行SHOW GRANTS FOR '%'@'%';只会查询账号名和主机名完全为通配符字面量的单个账号权限,不会遍历所有账号返回结果,无法实现查询全量用户权限的目的。

全量用户权限存储表创建方案

你之前导出所有非系统账号对应SHOW GRANTS语句的逻辑是可行的,按以下步骤操作即可生成包含「用户名、用户权限」两列的存储表:

  • 第一步:先创建权限存储表,执行如下建表语句:
CREATE TABLE IF NOT EXISTS user_permissions (
    username VARCHAR(255) NOT NULL COMMENT '账号标识,格式为 用户名@主机名',
    permission_text TEXT NOT NULL COMMENT '账号对应的权限配置'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 第二步:优先推荐跳过中间导出文件,直接通过存储过程一次性完成全量权限采集写入,操作更简便:
DELIMITER //
CREATE PROCEDURE collect_all_user_grants()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE cur_user VARCHAR(128);
    DECLARE cur_host VARCHAR(128);
    DECLARE user_cur CURSOR FOR 
        SELECT user, host FROM mysql.user 
        WHERE user NOT IN ('mysql.infoschema','mysql.session','mysql.sys');
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    TRUNCATE TABLE user_permissions;

    OPEN user_cur;
    read_loop: LOOP
        FETCH user_cur INTO cur_user, cur_host;
        IF done = 1 THEN
            LEAVE read_loop;
        END IF;
        SET @grant_sql = CONCAT(
            "INSERT INTO user_permissions(username, permission_text) ",
            "SELECT CONCAT('",cur_user,"'@'",cur_host,"'), GROUP_CONCAT(`Grants for ",QUOTE(CONCAT(cur_user,'@',cur_host)),"` SEPARATOR '\n') ",
            "FROM (SHOW GRANTS FOR '",cur_user,"'@'",cur_host,"') AS t"
        );
        PREPARE stmt FROM @grant_sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;
    CLOSE user_cur;
END //
DELIMITER ;

-- 执行存储过程完成数据采集
CALL collect_all_user_grants();
-- 采集完成后可删除存储过程
DROP PROCEDURE IF EXISTS collect_all_user_grants;
  • 如果你要复用之前导出到/var/lib/mysql-files/show_grants.txt的文件,可以在服务器命令行执行sed命令,把导出的SHOW GRANTS语句批量转换为插入语句:
sed "s/SHOW GRANTS FOR '\(.*\)'@'\(.*\)';/INSERT INTO user_permissions(username, permission_text) SELECT CONCAT('\1'@'\2'), GROUP_CONCAT(`Grants for '\1@\2'` SEPARATOR '\\n') FROM (SHOW GRANTS FOR '\1'@'\2') AS t;/g" /var/lib/mysql-files/show_grants.txt > /var/lib/mysql-files/insert_grants.sql

转换完成后登录MySQL,执行source /var/lib/mysql-files/insert_grants.sql;即可把所有权限数据写入存储表,执行完成后可以用SELECT * FROM user_permissions;验证结果。

内容的提问来源于stack exchange,提问作者Blax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:33:11