はじめに
本ブログは、「Percona Toolkit のツールを全て使ってみる」シリーズの第 2 弾となります!
Percona 製品は、MySQL と非常に高い互換性を持つ MySQL の派生製品であり、 MySQL ユーザが快適に利用できることを開発コンセプトとしています。また、MySQL と同様 OSS で提供され、ユーザは無償で利用することができます。
本記事で紹介する Percona Toolkit は、Percona 社が開発した MySQL の運用・監視・分析といった、手動で実行するには複雑な作業を簡単に実施することができるコマンドツール群です。
現在 (2024/12/16
)、40 ツールが存在する中で、今回は pt-config-diff について紹介します。
Percona Toolkit のツールを全て使ってみるシリーズのブログは以下の表にまとめています。
シリーズ | ||
---|---|---|
第 1 弾 | pt-align | pt-archiver |
第 2 弾 (本ブログ) | pt-config-diff |
その他、Percona Toolkit 関連のブログは まとめ で紹介していますので併せてご覧ください。
Percona Toolkit のダウンロード・インストール
ダウンロード・インストールに関しては、以下の公式サイトを参考にしてください。
環境情報
今回利用する環境情報
- Oracle Linux 8
- Percona Server for MySQL 8.0.39-30
- Percona Toolkit 3.6.0
pt-config-diff
pt-config-diff は MySQL の構成ファイルとサーバー変数を比較し、差分を表示することができます。
※ 構成ファイルの比較ができるのはローカルのみとなっています。
実行例① 2 つの構成ファイルを比較
my.cnf1 と my.cnf2 の 2 つの構成ファイルを用意しました。
2 つの違いは key_buffer_size
の値と順番です。
また、my.cnf2 の値はバイト単位で記載し、値の手前にあえて空白を入れています。
(17825792 = 17M)
実際に実行してみると
1 2 3 4 5 |
shell# pt-config-diff /etc/my.cnf1 /etc/my.cnf2 1 config difference Variable /etc/my.cnf1 /etc/my.cnf2 ========================= ============ ============ key_buffer_size 16777216 17825792 |
key_buffer_size
の値が違うと一目で確認でき、値がバイト単位に統一されています。
1 config difference
からも違いが 1 カ所のみとわかり、空白が入っていても問題なく出力結果も綺麗に整列されていて非常に見やすいです。(複数出力された場合、アルファベット順に整列されます)
※ 違いがない場合、何も出力されません
実行例② 複数の構成ファイルとサーバー変数を比較
pt-config-diff は複数の比較にも対応しています。
server_id
が異なる 4 つの構成ファイルとローカルのサーバー変数を比較してみます。
1 2 3 4 5 6 7 8 |
shell# pt-config-diff h=127.0.0.1,u=root,p=password /etc/my.cnf1 /etc/my.cnf2 /etc/my.cnf3 /etc/my.cnf4 4 config differences Variable test /etc/my.cnf1 /etc/my.cnf2 /etc/my.cnf3 /e ========================= ========== ========== ========== ========== ======== key_buffer_size 8388608 16777216 17825792 16777216 16777216 max_allowed_packet 67108864 134217728 134217728 134217728 13421... server_id 1 1 2 3 4 socket /var/li... /tmp/my... /tmp/my... /tmp/my... /tmp/... |
このように構成ファイルやサーバー変数が混在している複数の比較も可能です。
しかし、上記の出力結果では文字が詰まっていて見づらいです。
これについては、–report-width オプションを使用することで改善可能です。
例では、ローカルのサーバー変数で比較しましたが、リモートサーバーでも可能です。
実行例③ サーバー変数とサーバー変数の比較
もちろん、サーバー変数とサーバー変数の比較も可能です。
以下は非同期レプリケーションのソースとレプリカのサーバー変数を比較しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# pt-config-diff h=host_1,u=repl,p=password h=host_2,u=user,p=password # A software update is available: 17 config differences Variable server1 server2 ========================= ========================= ========================= character_set_client utf8mb4 utf8mb3 character_set_connection utf8mb4 utf8mb3 character_set_database utf8mb4 utf8mb3 character_set_results utf8mb4 utf8mb3 character_set_server utf8mb4 utf8mb3 collation_connection utf8mb4_0900_ai_ci utf8mb3_general_ci collation_database utf8mb4_0900_ai_ci utf8mb3_general_ci collation_server utf8mb4_0900_ai_ci utf8mb3_general_ci general_log_file /var/lib/mysql/db101.log /var/lib/mysql/db102.log gtid_purged 95e8c17b-7f90-11ef-ab4... 95e8c17b-7f90-11ef-ab4... hostname db101 db102 relay_log db101-relay-bin db102-relay-bin relay_log_basename /var/lib/mysql/db101-r... /var/lib/mysql/db102-r... relay_log_index /var/lib/mysql/db101-r... /var/lib/mysql/db102-r... server_id 8001 8002 server_uuid 8b414722-b603-11ef-a61... f647deb1-b141-11ef-991... sql_mode STRICT_TRANS_TABLES,NO... |
オプション紹介
pt-config-diff には多くのオプションが存在します。
今回は –report-width と –[no]ignore-case の 2 つのオプションをピックアップして紹介したかったのですが、残念なことに –[no]ignore-case オプションにバグがあることが判明したため、–report-width のみ紹介します。
–[no]ignore-case のバグについては 注意点 で詳細をご確認ください。
その他のオプションについては リファレンス をご確認ください。
–report-width
–report-width オプションは、出力結果の幅を変更することができます。
デフォルトでは 78
という数字が設定されているようです。
以下のように文字が詰まって途切れてしまった時に
1 2 3 4 5 6 7 8 |
shell# pt-config-diff h=127.0.0.1,u=root,p=password /etc/my.cnf1 /etc/my.cnf2 /etc/my.cnf3 /etc/my.cnf4 4 config differences Variable test /etc/my.cnf1 /etc/my.cnf2 /etc/my.cnf3 /e ========================= ========== ========== ========== ========== ======== key_buffer_size 8388608 16777216 17825792 16777216 16777216 max_allowed_packet 67108864 134217728 134217728 134217728 13421... server_id 1 1 2 3 4 socket /var/li... /tmp/my... /tmp/my... /tmp/my... /tmp/... |
–report-width オプションに適当な値を追加して実行すると
1 2 3 4 5 6 7 8 |
shell# pt-config-diff --report-width 120 h=127.0.0.1,u=root,p=password /etc/my.cnf1 /etc/my.cnf2 /etc/my.cnf3 /etc/my.cnf4 4 config differences Variable test /etc/my.cnf1 /etc/my.cnf2 /etc/my.cnf3 /etc/my.cnf4 ========================= ========================= =============== =============== =============== =============== key_buffer_size 8388608 16777216 17825792 16777216 16777216 max_allowed_packet 67108864 134217728 134217728 134217728 134217728 server_id 1 1 2 3 4 socket /var/lib/mysql/mysql.sock /tmp/mysql.sock /tmp/mysql.sock /tmp/mysql.sock /tmp/mysql.sock |
綺麗に出力することができます。
パス名が長い時や、複数比較する時には重宝しますね。
ほとんど使い道は無さそうですが、短くすることも可能です。
注意点
pt-config-diff には、いくつかの注意点があります。
- 値の大文字小文字の区別が付かない (–[no]ignore-case オプションが効かない)
log_bin
とLog_bin
のようにサーバー変数名に大文字小文字が混在している場合は常に同一のものとみなされますが、log_bin=on
とlog_bin=ON
といったように値に大文字小文字が混在している場合は同一とみなされません。こちらは最新のバージョン (Percona Toolkit 3.6.0) でもバグが継続しており、Percona の バグチケット にてバグであることを確認しています。
本来ならば –[no]ignore-case オプションを使用することで区別されるはずですが、バグの影響でオプションが効きません。そのうちバグ修正が行われるかもしれませんが、値の大文字小文字の区別がつかないのは致命的に感じます…
- 構成ファイルで比較されるのは
[mysqld]
セクションのみ
[mysql] や [client] セクションは比較されません。
- 構成ファイルはローカルのものしか比較できない
リモート MySQL サーバーで比較できるのはサーバー変数のみになります。リモートの構成ファイルを比較したい場合は、一度ローカルに保存する必要があります。
まとめ
Percona Toolkit は、インストール自体が非常に簡単でインストールしておくだけで 40 個のツールを利用することができます。リファレンスに書かれている通り、これらのツールはプライベートや 1 回しか使用しないような時に非常に便利です。重宝するツールもあれば、使いこなすのに応用が必要そうなツールもありますが、Percona Toolkit 自体無償で提供されているのでぜひインストールしてみてください。
Percona Toolkit のツールを全て使ってみるシリーズはアルファベット順に進めていますので次回、第 3 弾は pt-deadlock-logger と pt-diskstats を紹介します! (ボリュームによっては pt-deadlock-logger のみの紹介となります)
* Percona Toolkit を紹介した SmartStyle TECH BLOG *