MySQL权限备份有三种可靠方法:导出权限表数据(推荐日常使用)、生成GRANT语句、整库备份mysql系统库;需根据迁移、审计或灾备需求选择,并确保备份账号具备最小必要权限。

MySQL 权限配置不能靠“猜”或“重设”,必须通过可靠方式备份。最实用、可恢复、兼容性好的方法就三种:导出权限表结构数据、生成 GRANT 语句、整库备份 mysql 系统库。选哪种,取决于你要迁移、审计,还是做灾难恢复。
直接备份权限相关表(推荐日常使用)
MySQL 的用户和权限信息都存在 mysql 库的几张核心表里:user、db、tables_priv、columns_priv、procs_priv。用 mysqldump 把它们导出即可:
mysqldump -u root -p --single-transaction mysql user db tables_priv columns_priv procs_priv > priv_backup.sql-
--single-transaction能避免锁表,适合生产环境在线备份 - 如果用了存储过程/函数,加上
--routines;若含事件(EVENT),再加--events - 恢复时执行
mysql -u root -p mysql 即可(注意先停掉应用或确保无并发写权限表)
导出可读性强的 GRANT 语句(适合迁移与审计)
相比二进制或表结构导出,GRANT 语句更直观,能看清每个用户具体有哪些权限,也方便人工审核或跨版本迁移:
- 查单个用户:
SHOW GRANTS FOR 'app_user'@'10.20.%'; - 批量导出所有用户的 GRANT 语句(含注释和分号):
mysql -u root -p -N -s -e "SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user!=''" | mysql -u root -p --skip-column-names | sed 's/$/;/g' > grants_backup.sql - 该文件可直接导入新实例执行,也能用文本工具搜索特定权限(比如找谁有
FILE权限) - 注意:GRANT 语句不包含密码哈希值,但会保留
REQUIRE、WITH GRANT OPTION等关键细节
备份整个 mysql 系统库(适合全量灾备)
如果你需要保留插件、角色、默认密码策略、时区表、help_topic 等全部系统级配置,那就别只导权限表,直接备份整个 mysql 库:
mysqldump -u root -p --single-transaction --routines --events --triggers mysql > mysql_full_backup.sql- 这个备份包含所有用户、角色、存储过程、事件、权限、密码历史(如启用)、甚至部分认证插件状态
- 恢复前建议先确认目标 MySQL 版本是否兼容(例如 8.0 的
mysql.role_edges表在 5.7 中不存在) - 务必加密保存该文件——里面含
authentication_string字段,即加密后的密码
权限备份前的关键准备
无论选哪种方式,备份账号本身要有足够且最小化权限:
- 创建专用备份用户,避免用 root:
CREATE USER 'bkp_user'@'localhost' IDENTIFIED BY 'StrongPass!2025';GRANT SELECT ON mysql.* TO 'bkp_user'@'localhost';GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'bkp_user'@'localhost';FLUSH PRIVILEGES; - 若用
--single-transaction,可省略LOCK TABLES;若用--master-data,则必须有RELOAD - 备份脚本中避免明文写密码(用
~/.my.cnf配置文件更安全)










