Skip to content

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'

场景:排除系统/内部用户

只想看业务账号的授权、不想让 rootmysql.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 USERFLUSH PRIVILEGES 一起导出,形成一份可重复执行的"重建用户"脚本:

bash
pt-show-grants --drop --flush > recreate-users.sql

功能说明

pt-show-grants 提取、排序并打印 MySQL 用户账户的授权。典型用途:

  1. 在服务器之间复制用户:从第一台服务器提取授权,把输出直接管道到另一台服务器即可。
  2. 把授权纳入版本控制:MySQL 的 SHOW GRANTS 输出顺序看似随机 (同一天的两次 dump 可能 GRANT DELETE, INSERT, UPDATEGRANT INSERT, DELETE, UPDATE 交替出现), 会在版本控制里产生大量无意义的变更集。本工具会把每一行 GRANTON 之间的权限排序, 并对 SHOW GRANTS 的多行结果排序(用户密码所在行永远最先打印),消除三类不一致。
  3. 跨服务器 diff 授权:未"规范化"的授权难以 diff,本工具输出完全可 diff。
  4. 配合 --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-rolesdump MySQL 8+ 角色时包含未使用的角色
-S, --socket类型:string。连接使用的 socket 文件
--[no]timestamp默认:yes。在 dump 头部加时间戳
-u, --user类型:string。登录用户(若非当前用户)
--version显示版本并退出

DSN 选项

DSN 选项大小写敏感(Pp 不同),= 两侧不能有空白,值含空白时需加引号。

DSN 部分说明
Acharset默认字符集
Ddatabase默认数据库
Fmysql_read_default_file只从给定文件读取默认选项
hhost要连接的主机
ppassword连接密码(含逗号需转义)
Pport连接端口
Smysql_socket连接使用的 socket 文件
uuser登录用户(若非当前用户)
smysql_ssl创建 SSL 连接

其他信息

  • 通用说明:已知问题的反馈方式、PTDEBUG 调试安全提示、系统要求基线,见 通用说明

更多细节请阅读 官方文档

Percona Toolkit 中文文档 · 社区维护的第三方学习站