Skip to content

pt-config-diff

对比 MySQL 配置文件与服务器变量的差异。

语法

bash
pt-config-diff [OPTIONS] CONFIG CONFIG [CONFIG...]

CONFIG 可以是文件名,也可以是 DSN;至少要给两个 CONFIG 源。 与标准 Unix diff 一样,没有差异时没有输出。

bash
# 对比 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 的实际运行值:

bash
pt-config-diff h=host1 h=host2

场景:验证改了没生效

改完 my.cnf 重启后想确认"文件里的配置"和"实际运行值"一致,把文件与运行配置比一比:

bash
pt-config-diff /etc/my.cnf h=localhost

场景:对比两份选项文件模板

迁移或选型时,比较 my-small.cnfmy-large.cnf 这类模板的差异:

bash
pt-config-diff /etc/my-small.cnf /etc/my-large.cnf

场景:只判断是否有差异

在脚本里只想用退出码(0=无差异,1=有差异)做健康检查、不需要报告本身,关掉报告:

bash
pt-config-diff --no-report h=host1 h=host2

场景:忽略易变变量再比

主机间 datadir/port/socket 等本就不同,先忽略这些噪声变量,聚焦真正该一致的参数:

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

其他信息

  • 作者:Baron Schwartz 和 Daniel Nichter

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

更多细节请阅读 官方文档

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