pt-config-diff
对比 MySQL 配置文件与服务器变量的差异。
语法
pt-config-diff [OPTIONS] CONFIG CONFIG [CONFIG...]CONFIG 可以是文件名,也可以是 DSN;至少要给两个 CONFIG 源。 与标准 Unix diff 一样,没有差异时没有输出。
# 对比 host1 与 host2 的 SHOW VARIABLES
pt-config-diff h=host1 h=host2
# 对比 my.cnf 的 [mysqld] 段与 host1 的运行配置
pt-config-diff /etc/my.cnf h=host1
# 对比两个选项文件的 [mysqld] 段
pt-config-diff /etc/my-small.cnf /etc/my-large.cnf用法示例
以下命令假定已通过 /etc/my.cnf、~/.my.cnf 或本机 socket 配置好 MySQL 连接;需用 DSN 显式指定连接时加 h=主机,P=端口,u=用户 或 F=/path/my.cnf(DSN 中不写明文密码)。命令可直接复制,替换其中的主机与文件路径即可。
场景:对比两台主机的运行时配置
怀疑主从或双主配置跑偏了,直接对比两台机器 SHOW VARIABLES 的实际运行值:
pt-config-diff h=host1 h=host2场景:验证改了没生效
改完 my.cnf 重启后想确认"文件里的配置"和"实际运行值"一致,把文件与运行配置比一比:
pt-config-diff /etc/my.cnf h=localhost场景:对比两份选项文件模板
迁移或选型时,比较 my-small.cnf 与 my-large.cnf 这类模板的差异:
pt-config-diff /etc/my-small.cnf /etc/my-large.cnf场景:只判断是否有差异
在脚本里只想用退出码(0=无差异,1=有差异)做健康检查、不需要报告本身,关掉报告:
pt-config-diff --no-report h=host1 h=host2场景:忽略易变变量再比
主机间 datadir/port/socket 等本就不同,先忽略这些噪声变量,聚焦真正该一致的参数:
pt-config-diff --ignore-variables datadir,port,pid_file,socket,log_error \
h=host1 h=host2功能说明
pt-config-diff 通过检查两个及以上 CONFIG 源中服务器系统变量的值来对比 MySQL 配置。 CONFIG 源可以是 DSN,也可以是包含以下内容的文件: mysqld --help --verbose 输出、my_print_defaults 输出、SHOW VARIABLES 输出, 或选项文件(如 my.cnf)。
对每个 DSN CONFIG,工具连接 MySQL 并执行 SHOW /*!40103 GLOBAL*/ VARIABLES 获取变量与值, 这是"活动配置"——反映服务器当前实际运行的值。
只对比所有 CONFIG 源都存在的变量:变量不存在时无法得知也无法安全猜测其值。 例如对比选项文件与活动配置时,选项文件可能只有少量变量,而活动配置包含所有变量, 此时只对比两者共有的变量值。选项文件 + DSN 组合的效果最好。
输出
没有差异时无输出;有差异时打印类似下面的报告:
2 config differences
Variable my.source.cnf my.replica.cnf
========================= =============== ===============
datadir /tmp/12345/data /tmp/12346/data
port 12345 12346由于 MySQL 各版本与发行版的变量有很多差异和细节,比较失败时工具会向 STDERR 打印警告。 请报告这些警告,以便改进比较函数。
退出状态
没有差异时退出码为 0,有差异时为 1。
选项
| 选项 | 说明 |
|---|---|
--ask-pass | 连接 MySQL 时交互式询问密码 |
--[no]buffer-stdout | 默认开启 STDOUT 缓冲;使用 tee、kubectl logs 等后处理工具想看到实时进度时可关闭 |
-A, --charset | 类型:string。默认字符集(utf8 时设置 binmode/mysql_enable_utf8 并执行 SET NAMES UTF8) |
--config | 类型:Array。读取逗号分隔的配置文件列表;如指定必须放在命令行第一个选项的位置(等价于 --defaults-file,不指定 CONFIG 源) |
-D, --database | 类型:string。连接的数据库 |
-F, --defaults-file | 类型:string。只从给定文件读取 mysql 选项,必须给绝对路径 |
--help | 显示帮助并退出 |
-h, --host | 类型:string。要连接的主机 |
--[no]ignore-case | 默认:yes。比较变量时忽略大小写 |
--ignore-variables | 类型:array。忽略(不比较)这些变量 |
-s, --mysql_ssl | 类型:int。创建 SSL MySQL 连接 |
-p, --password | 类型:string。连接密码 |
--pid | 类型:string。创建指定的 PID 文件;冲突规则与自动清理见官方文档 |
-P, --port | 类型:int。连接端口 |
--[no]report | 默认:yes。把差异报告打印到 STDOUT;只想通过退出码判断是否不同时用 --no-report |
--report-width | 类型:int;默认:78。报告行截断宽度;值较长或对比多个配置时可调大 |
--set-vars | 类型:Array。以逗号分隔的 变量=值 列表设置 MySQL 变量;默认 wait_timeout=10000;无法设置时打印警告并继续 |
-S, --socket | 类型:string。连接使用的 socket 文件 |
-u, --user | 类型:string。MySQL 用户(若非当前用户) |
--version | 显示版本并退出 |
--[no]version-check | 默认:yes。检查 Percona Toolkit、MySQL 等软件的最新版本与已知问题版本(详见版本检查) |
DSN 选项
| 键 | 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 连接 |
其他信息
作者:Baron Schwartz 和 Daniel Nichter
通用说明:已知问题的反馈方式、PTDEBUG 调试安全提示、系统要求基线,见 通用说明。
更多细节请阅读 官方文档。