mysqldump不能直接导出用户授权语句,因其不处理mysql系统表中的权限数据且版本兼容性差;应使用SHOW GRANTS FOR逐个生成标准SQL,注意补全CREATE USER、核对主机名与认证插件。

导出用户授权语句为什么不能直接用 mysqldump
mysqldump 默认不导出权限信息,它只处理数据库对象(表、视图、存储过程等)和数据。用户权限存放在 mysql.user、mysql.db、mysql.tables_priv 等系统表中,且这些表结构随 MySQL 版本变化较大(比如 8.0 引入了角色和组件权限),直接 dump 表内容生成的 SQL 很可能无法在目标实例上正确执行。
用 SHOW GRANTS FOR 逐个生成可重放的授权语句
这是最安全、兼容性最好的方式:MySQL 原生支持将当前用户的权限转为标准 SQL 语句,输出结果可直接用于恢复授权。注意必须用有 SELECT 权限的账户(如 root)连接,并确保目标用户存在(否则 SHOW GRANTS 会报错)。
实操建议:
- 连接时加
--skip-column-names --batch避免表头和格式化空格,方便管道处理:mysql -u root -p -N -B -e "SHOW GRANTS FOR 'myuser'@'localhost';" - 若要导出多个用户,先查出用户名+主机列表:
mysql -u root -p -N -B -e "SELECT CONCAT('''', user, '''@''', host, '''') FROM mysql.user WHERE user NOT IN ('mysql.infoschema','mysql.session','mysql.sys');",再循环调用SHOW GRANTS - 对 MySQL 8.0+ 用户,
SHOW GRANTS默认不包含角色权限;需显式加FOR ... WITH ADMIN OPTION或单独查mysql.role_edges表补全
导出时绕过密码明文暴露风险
命令行里写 -p'password' 会导致密码出现在 ps aux 或 shell 历史中。必须避免。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
安全做法:
- 使用配置文件:
~/.my.cnf设置[client]段,仅限当前用户读写(chmod 600 ~/.my.cnf),内容为:[client] user=root password=your_secure_password
- 或完全交互式输入:
mysql -u root -p -N -B -e "SHOW GRANTS FOR 'u'@'h'",回车后手动输密码 - 禁止在脚本里拼接密码字符串——哪怕临时变量也不行
导出脚本执行前必须检查的三件事
生成的 SQL 不是“拿来就能跑”。常见翻车点:
-
CREATE USER语句缺失:MySQL 5.7+ 默认不自动创建用户,GRANT前必须先CREATE USER;而SHOW GRANTS不输出这句,需自己补 - 主机名通配符不一致:比如源库是
'user'@'%',但目标库防火墙只允许'user'@'192.168.1.%',直接执行会失败 - 插件认证差异:MySQL 8.0 默认用
caching_sha2_password,若目标库是 5.7 或未启用该插件,需在CREATE USER后加IDENTIFIED WITH mysql_native_password
真正麻烦的不是导出,是确认目标环境的版本、认证插件、网络策略是否匹配——这些没法自动化,得人眼核对。

















