推荐使用mysqlpump(mysql 5.7.8+)或pt-show-grants(旧版兼容)导出用户权限,因mysqldump不处理mysql库权限字段、无法正确生成create user/grant语句,且忽略角色与动态权限。

直接用 mysqldump 导出用户权限?不行,它不处理 mysql.user 表的权限字段
MySQL 的用户权限信息分散在 mysql.user、mysql.db、mysql.tables_priv 等多张系统表中,且 mysqldump 默认跳过 mysql 库(或导出后无法直接还原权限),更关键的是:字段如 authentication_string、plugin、max_questions 等需按特定格式拼成 CREATE USER 和 GRANT 语句,不能简单 dump 行数据。
用 SELECT ... INTO OUTFILE + 拼接 SQL?风险高,易漏场景
手动拼 CREATE USER 和 GRANT 容易出错,尤其遇到以下情况:
-
plugin是caching_sha2_password但密码字段是十六进制哈希,直接拼字符串会失败 -
GRANT语句中WITH GRANT OPTION、MAX_QUERIES_PER_HOUR等子句未还原 - 匿名用户(
''@'%')、空用户名、特殊 host(如'host1.example.com'vs'%.example.com')导致语法错误 - MySQL 8.0+ 的角色(
roles表)和动态权限(mysql.role_edges)完全被忽略
推荐方案:用 mysqlpump(MySQL 5.7.8+)或 mysqldump --all-databases 配合过滤
mysqlpump 是官方替代工具,原生支持权限导出,且默认包含 mysql 库(含用户权限),生成可执行的 SQL 脚本。实操建议如下:
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 确认版本:
mysqlpump --version≥ 5.7.8;若为 MySQL 8.0+,确保用户有SELECT权限在mysql库所有表上 - 基础命令:
mysqlpump --exclude-databases=% --include-databases=mysql --skip-definer --set-gtid-purged=OFF > users_grants.sql - 关键参数说明:
--skip-definer避免DEFINER冲突;--set-gtid-purged=OFF防止 GTID 相关报错;--include-databases=mysql显式指定只导 mysql 库 - 导出后务必检查脚本中是否含
CREATE USER、GRANT、FLUSH PRIVILEGES—— 缺一不可
兼容旧版 MySQL(5.6 或更低)?用 pt-show-grants(Percona Toolkit)最稳
Percona 提供的 pt-show-grants 是专为权限导出设计的工具,能正确处理各版本差异、角色、动态权限、插件认证等边界情况:
- 安装:
apt install percona-toolkit(Debian/Ubuntu)或从官网下载二进制 - 基本用法:
pt-show-grants --user=root --password=xxx --host=localhost > grants.sql - 它自动跳过
root@localhost这类内置账户(可加--no-skip-root强制包含) - 输出严格按用户分块,每块以
CREATE USER开头,GRANT后紧跟FLUSH PRIVILEGES,可直接 source 执行
注意:pt-show-grants 不导出密码哈希本身,而是生成带 IDENTIFIED WITH ... AS 'xxx' 的语句,还原时依赖目标实例已启用对应认证插件。










