5個増えたMaatkitのツールを触ってみた

Maatkitのツール群は,毎月bugfixや機能増強,新ツールがリリースされていて,以前紹介した時から5つの新しいツールが登場しています.

# Release Notes November 2010, version 7041
# Release Notes October 2010, version 6960
# Release Notes September 2010, version 6926
# Release Notes August 2010, version 6839
# Release Notes July 2010, version 6652
# Release Notes June 2010, version 6457

Google Code Archive - Long-term storage for Google Code Project Hosting.

以上のうち,今日までに追加されたツールは

  • mk-index-usage
  • mk-merge-mqd-results
  • mk-query-advisor
  • mk-variable-advisor
  • mk-purge-logs

です."advisor"なるものが増えていて,情報だけでなくその上での助言までお節介をして貰えそうで気になります.
以上5つを前のように一通り試してみました.

mk-index-usage

スローログとホストを見合わせて,インデックスの使用状況を解析して,必要の無いインデックスを示してくれるツール.

[hmsk@hmsk maatkit]$ mk-index-usage db01-slow.log --host 192.168.11.4
ALTER TABLE `service`.`messages` DROP KEY `index_files_on_fromuser`; -- type:non-unique
ALTER TABLE `service`.`logs` DROP KEY `RegisterDate`, DROP KEY `UserID`, DROP KEY `modified_at`; -- type:non-unique

デフォルトでは,"使われていなくてnon-uniqueでプライマリではないインデックス"が一覧されます.
--drop オプションでprimary,unique,non-unique,allの4つが使えます.
mk-duplicate-key-checkerと一緒に無駄なインデックスの削減が行えそうですね.

スローログと合わせて見ているという点からは,これは元のコードを少し追ってみた方が良いかもしれません.

--save-results-database mk というようなオプションで同ホストのmkデータベース上に結果を出力することも可能なようです.(データベースが存在しない場合 --create-save-results-database を付加すれば良いようです)

mk-merge-mqd-results

mqdというのはmk-query-digestの略のようで,これはmqdの結果をマージしてくれるツール.
mk-query-digestの結果となるres1.txt,res2.txtがあったら

mk-merge-mqd-results res1.txt res2.txt

で,結果をマージして再集計してくれる.
サービスの性質によっては,曜日や時間帯などでカットしているものと,それを併せたものでは出て来る傾向が割と変わる場合も考えられるので,その差異を見比べる際に使いやすいですね.

mk-query-advisor

スローログやクエリログもしくはmk-query-digestが咀嚼したtcpdumpを解析して改善点をサジェストしてくれるツール.

[hmsk@hmsk maatkit]$ mk-query-advisor db-slave-mobile-01-slow.log
# Query ID 0xE0594838B483BE03 at byte 238837
# WARN CLA.001 SELECT without WHERE.
# Also: COL.001
SELECT * FROM `users`
...

という具合に,クエリとCOL.001というようなコードが表示されます.
CLA.001やCOL.001といったコードが警告内容の分類になっていてman mk-query-advisorを見ると

CLA.001
severity: warn
SELECT without WHERE.  The SELECT statement has no WHERE clause.
COL.001
severity: note
SELECT *.  Selecting all columns with the * wildcard will cause the query’s meaning
and behavior to change if the table’s schema changes, and might cause the query to
retrieve too much data.

のように警告の内容や理由が確認出来ます.具体的にアプリエンジニアを突つきやすくなりますね.
mk-query-digestで優先順位を付け,mk-query-advisorから改善方法を考えるという組み合わせが良さそうです.

また,

mk-query-digest --type tcpdump.txt --print --no-report │ mk-query-advisor

みたいにmk-query-digestを通してtcpdumpを読ませることも出来ます.

mk-variable-advisor

show variablesの値をこう弄っては?とアドバイスしてくれるツール.親切.

[hmsk@hmsk maatkit]$ mk-variable-advisor 192.168.11.4
# WARN innodb_log_file_size: The InnoDB log file size is set to its default value, which is not usable on production systems.
# NOTE log_warnings-2: Log_warnings must be set greater than 1 to log unusual events such as aborted connections.
# NOTE low_priority_updates: The server is running with non-default lock priority for updates.
# NOTE max_connect_errors: max_connect_errors should probably be set as large as your platform allows.
# WARN old_passwords: Old-style passwords are insecure.
# NOTE query_cache_size-1: The query cache does not scale to large sizes and can cause unstable performance when larger than 128MB, especially on multi-core machines.
# NOTE read_buffer_size-1: The read_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.
# WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.
# WARN sync_binlog: Binary logging is enabled, but sync_binlog isn't configured so that every transaction is flushed to the binary log for durability.
# NOTE end-of-life mysql version: Every release older than 5.1 is now officially end-of-life.

改めて設定値の確認や比較が出来て便利ですね.自身の環境がお恥ずかしい...

同様のツールだとメモリの必要量を計算する為のツールが

で公開されていたりしますね.少し古いですがお世話になった覚えがあります.

mk-purge-logs

レプリケーションのマスタなどで吐いているバイナリログを削除してくれるツール.これで"purge master logs to ''"ともお別れです.削除の条件として --purge-rules total_size --total-size [データサイズ(1Mや1Kなど)] とすることで残しておきたいバイナリログのデータサイズを与えることが可能です.
デフォルトでは --purge-rules unused が定義されていて,スレーブ群が使用していないバイナリログだけを削除対象としてくれています.この使用しているかどうかの判定はレプリケーションしているスレーブでのshow slave statusの結果から調べてくれていて安心です.*1

--print というオプションを付ければ削除対象となるバイナリログ一覧が以下のように出ます.

[hmskd@hmsk maatkit]$ mk-purge-logs --print h=192.168.11.3
log-bin.013685 1073742273
log-bin.013686 1073742319
log-bin.013687 1073742497

このときmysql側でバイナリログ一覧を表示すると以下のようになっています.

mysql> show master logs;
+----------------+------------+
| Log_name       | File_size  |
+----------------+------------+
| log-bin.013685 | 1073742273 | 
| log-bin.013686 | 1073742319 | 
| log-bin.013687 | 1073742497 | 
| log-bin.013688 |  237558961 | <= スレーブがレプリケーションしているバイナリログ 
+----------------+------------+

--purge を付けると削除が実施されますが(--purge-rulesをオプションで与えている場合は --purge を付けなくても削除されます)--dry-runを付けることで

[hmsk@hmsk maatkit]$ mk-purge-logs --purge h=192.168.11.3 --dry-run
This is a dry-run.  The following SQL statement would be executed by specifying --purge without --dry-run:
PURGE BINARY LOGS TO ? log-bin.013688

というように,実行するクエリを教えてくれるだけに留められます.親切.

大きめのサービスだとpurgeする機会も多くて,大抵は自作のpurgeスクリプトが作られていて,あまり出る幕は無いかもしれませんが,スレーブのチェックが走る点まではなかなか実装するのが面倒なので有り難いのかもしれません.

以上です

これらツールの登場以外にも,今までのツールのbugfixと改善が行われており,リスクが軽減されていたり,より詳細な情報を得ることが出来たりするようになっています.詳しくはリリースノートをご覧下さい.

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

*1:MKDEBUG=1を頭に付けて実行するとわかります