在mysql数据库的日常运维和迁移场景中,批量导出所有用户的权限设置是高频需求,通过查询系统库中的mysql.user表,我们可以快速获取所有用户的基础权限信息,进而生成可重复执行的权限SQL脚本。

mysql.user表核心权限字段说明
mysql.user表存储了mysql实例中所有用户的全局权限信息,不同版本的字段略有差异,但核心权限字段的命名规则一致,基本都是xxx_priv的格式,取值为Y代表拥有该权限,N代表没有该权限。常见的核心权限字段如下:
- 用户标识字段:
user存储用户名,host存储用户允许登录的客户端地址 - 基础权限字段:
select_priv、insert_priv、update_priv、delete_priv对应增删改查权限 - 管理权限字段:
create_priv、drop_priv、grant_priv、super_priv对应库表创建、权限授予、超级管理员权限
批量生成权限SQL的实现逻辑
生成批量权限脚本的核心思路是:先查询mysql.user表获取所有用户的基础信息,再遍历每个用户的权限字段,拼接对应的GRANT语句,最后输出完整的可执行的SQL脚本。需要注意要排除mysql内置的默认用户,避免生成无用的权限语句。
基础权限导出脚本示例
以下脚本可以查询所有非内置用户的基础全局权限,生成对应的GRANT语句:
-- 查询mysql.user表生成批量权限导出SQL
SELECT
CONCAT(
'GRANT ',
-- 拼接所有权限项
IF(select_priv = 'Y', 'SELECT,', ''),
IF(insert_priv = 'Y', 'INSERT,', ''),
IF(update_priv = 'Y', 'UPDATE,', ''),
IF(delete_priv = 'Y', 'DELETE,', ''),
IF(create_priv = 'Y', 'CREATE,', ''),
IF(drop_priv = 'Y', 'DROP,', ''),
IF(grant_priv = 'Y', 'GRANT OPTION,', ''),
IF(super_priv = 'Y', 'SUPER,', ''),
-- 去除末尾多余的逗号
SUBSTRING(
CONCAT(
IF(select_priv = 'Y', 'SELECT,', ''),
IF(insert_priv = 'Y', 'INSERT,', ''),
IF(update_priv = 'Y', 'UPDATE,', ''),
IF(delete_priv = 'Y', 'DELETE,', ''),
IF(create_priv = 'Y', 'CREATE,', ''),
IF(drop_priv = 'Y', 'DROP,', ''),
IF(grant_priv = 'Y', 'GRANT OPTION,', ''),
IF(super_priv = 'Y', 'SUPER,', '')
),
1,
LENGTH(
CONCAT(
IF(select_priv = 'Y', 'SELECT,', ''),
IF(insert_priv = 'Y', 'INSERT,', ''),
IF(update_priv = 'Y', 'UPDATE,', ''),
IF(delete_priv = 'Y', 'DELETE,', ''),
IF(create_priv = 'Y', 'CREATE,', ''),
IF(drop_priv = 'Y', 'DROP,', ''),
IF(grant_priv = 'Y', 'GRANT OPTION,', ''),
IF(super_priv = 'Y', 'SUPER,', '')
)
) - 1
),
' ON *.* TO ''',
user,
'''@''',
host,
''' IDENTIFIED BY ''用户密码'';'
) AS grant_sql
FROM mysql.user
-- 排除内置默认用户
WHERE user NOT IN ('mysql.session', 'mysql.sys', 'root')
AND host NOT IN ('localhost', '127.0.0.1')
;
脚本使用注意事项
- 上述脚本中的
IDENTIFIED BY ''用户密码''部分需要替换成用户实际的密码,mysql5.7及以上版本密码存储在authentication_string字段,低版本存储在password字段,需要根据实际版本调整 - 如果用户有库级或者表级的权限,需要额外查询
mysql.db、mysql.tables_priv表,按照同样的拼接逻辑生成对应权限语句 - 生成的SQL脚本可以直接在目标mysql实例中执行,快速还原所有用户的权限配置
权限导出结果验证
执行上述查询后,会得到类似如下的输出结果,每一行都是一条完整的GRANT语句:
GRANT SELECT,INSERT,UPDATE ON *.* TO 'test_user'@'192.168.0.%' IDENTIFIED BY '用户密码'; GRANT CREATE,DROP,SUPER ON *.* TO 'admin_user'@'%' IDENTIFIED BY '用户密码';
可以将这些结果导出为.sql文件,在需要恢复权限的场景下直接执行即可,大幅提升权限管理的效率。
mysql权限导出查询mysql_user表SQL生成脚本用户权限管理修改时间:2026-07-20 12:42:33