pt-show-grants
规范化并打印 MySQL 用户授权(grants),便于复制用户、比较差异和纳入版本控制。
语法
bash
pt-show-grants [OPTIONS] [DSN]示例:
bash
pt-show-grants
pt-show-grants --separate --revoke | diff othergrants.sql -用法示例
以下命令假定已通过 /etc/my.cnf、~/.my.cnf 或本机 socket 配置好 MySQL 连接;需用 DSN 显式指定连接时加 h=主机,P=端口,u=用户 或 F=/path/my.cnf(DSN 中不写明文密码)。命令可直接复制,替换其中的主机与用户名即可。
场景:全量导出授权做备份
定期把实例上的全部用户授权导成 SQL 文件归档,遇到误删用户时能快速回放恢复:
bash
pt-show-grants > grants-$(date +%F).sql场景:对比两台服务器的授权差异
怀疑两台机器权限不一致(如主从权限漂移),把两边授权各导一份再 diff,输出完全可比对:
bash
pt-show-grants h=host1 > host1-grants.sql
pt-show-grants h=host2 > host2-grants.sql
diff host1-grants.sql host2-grants.sql场景:只导出指定用户
迁移某个应用账号到新环境,只取 appuser 这一个用户的授权:
bash
pt-show-grants --only 'appuser@localhost'场景:排除系统/内部用户
只想看业务账号的授权、不想让 root、mysql.session 这些内置账号刷屏,把它们忽略掉:
bash
pt-show-grants --ignore 'root@localhost','mysql.session@localhost'场景:生成回收权限的脚本
要撤销某批用户的全部权限(而不是删用户),加 --revoke 为每条 GRANT 生成对应 REVOKE,--separate 让每条单独成行便于审阅:
bash
pt-show-grants --revoke --separate > revoke-all.sql场景:生成可重建用户的完整脚本
需要把用户连带 DROP USER 与 FLUSH PRIVILEGES 一起导出,形成一份可重复执行的"重建用户"脚本:
bash
pt-show-grants --drop --flush > recreate-users.sql功能说明
pt-show-grants 提取、排序并打印 MySQL 用户账户的授权。典型用途:
- 在服务器之间复制用户:从第一台服务器提取授权,把输出直接管道到另一台服务器即可。
- 把授权纳入版本控制:MySQL 的
SHOW GRANTS输出顺序看似随机 (同一天的两次 dump 可能GRANT DELETE, INSERT, UPDATE与GRANT INSERT, DELETE, UPDATE交替出现), 会在版本控制里产生大量无意义的变更集。本工具会把每一行GRANT与ON之间的权限排序, 并对SHOW GRANTS的多行结果排序(用户密码所在行永远最先打印),消除三类不一致。 - 跨服务器 diff 授权:未"规范化"的授权难以 diff,本工具输出完全可 diff。
- 配合
--revoke、--separate等选项,可以方便地回收用户的特定权限。
选项
| 选项 | 说明 |
|---|---|
--ask-pass | 连接 MySQL 时交互式询问密码 |
--[no]buffer-stdout | 默认开启 STDOUT 缓冲;使用 tee、kubectl logs 等后处理工具想看到实时进度时可关闭 |
-A, --charset | 类型:string。默认字符集。utf8 时设置 Perl STDOUT binmode、传 mysql_enable_utf8 给 DBD::mysql 并执行 SET NAMES UTF8;其他值执行不带 utf8 层的 binmode 和 SET NAMES |
--config | 类型:Array。读取逗号分隔的配置文件列表;如指定必须放在命令行第一个选项的位置 |
-D, --database | 类型:string。连接使用的数据库 |
-F, --defaults-file | 类型:string。只从给定文件读取 mysql 选项,必须给绝对路径 |
--drop | 在输出中每个用户前添加 DROP USER |
--flush | 在输出末尾添加 FLUSH PRIVILEGES;在 4.1.1 之前的服务器上想彻底删除用户时可能需要 |
--[no]header | 默认:yes。打印 dump 头部信息(工具版本、来源服务器、时间等) |
--help | 显示帮助并退出 |
-h, --host | 类型:string。要连接的主机 |
--ignore | 类型:array。忽略的用户列表(逗号分隔) |
-s, --mysql_ssl | 类型:int。创建 SSL MySQL 连接 |
--only | 类型:array。只显示该用户列表(逗号分隔)的授权 |
--convert-MariaDB | 把 MariaDB 专有语法转换为合法的 MySQL 形式 |
-p, --password | 类型:string。连接密码;密码含逗号时需用反斜杠转义 |
--pid | 类型:string。创建指定的 PID 文件;冲突规则与自动清理见官方文档 |
-P, --port | 类型:int。连接端口 |
--revoke | 为每条 GRANT 语句添加对应的 REVOKE 语句 |
--separate | 把每条 GRANT/REVOKE 单独一行列出(MySQL 默认把多个权限列在一行);配合 --flush 时对每个用户单独输出 FLUSH PRIVILEGES |
--set-vars | 类型:Array。以逗号分隔的 变量=值 列表设置 MySQL 变量;默认 wait_timeout=10000,命令行指定会覆盖默认值;无法设置时打印警告并继续 |
--[no]include-unused-roles | dump MySQL 8+ 角色时包含未使用的角色 |
-S, --socket | 类型:string。连接使用的 socket 文件 |
--[no]timestamp | 默认:yes。在 dump 头部加时间戳 |
-u, --user | 类型:string。登录用户(若非当前用户) |
--version | 显示版本并退出 |
DSN 选项
DSN 选项大小写敏感(P 与 p 不同),= 两侧不能有空白,值含空白时需加引号。
| 键 | DSN 部分 | 说明 |
|---|---|---|
A | charset | 默认字符集 |
D | database | 默认数据库 |
F | mysql_read_default_file | 只从给定文件读取默认选项 |
h | host | 要连接的主机 |
p | password | 连接密码(含逗号需转义) |
P | port | 连接端口 |
S | mysql_socket | 连接使用的 socket 文件 |
u | user | 登录用户(若非当前用户) |
s | mysql_ssl | 创建 SSL 连接 |
其他信息
- 通用说明:已知问题的反馈方式、PTDEBUG 调试安全提示、系统要求基线,见 通用说明。
更多细节请阅读 官方文档。