サーバーにmytop をインストールする

業務でサーバーにmytop をインストールしたのでそのメモです。

環境

$ cat /etc/redhat-release
CentOS release 4.4 (Final)

$ rpm -qa | grep MySQL
MySQL-devel-4.0.26-0
MySQL-client-4.0.26-0

mytop とは

linux のtop コマンドのmysql 版です。perl で作られたモジュールです。

サーバのチューニングをする上でかなりやっかいなのがデータベース系。特にログファイルの量が膨大になると後から中身を見て問題を分析するのも一苦労という場合が。そんなときにこのMySQL用topコマンド「mytop」を使えば一体何が起きているのかがすぐにわかるので問題点の把握が容易になります。ベンチマークするときに併用すればかなり効率が良くなるのではないかと。

mytop をインストールする

上記サイトの手順に沿ってインストールを行いますが、個人的にはまったとこもまとめて書きます

1. Term::ReadKey をインストール
mytop を使うのに必要です。

$ sudo cpan install Term::ReadKey


2. mytop をインストール
1.6 が最新です。

$ wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz
$ tar -zxvf mytop-1.6.tar.gz
$ cd mytop-1.6
$ perl Makefile.PL
$ make
$ make test
$ sudo make install


起動。

$ mytop
nstall_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/lib/perl5/5.8.5/i386-linux-thread-multi /usr/lib/perl5/5.8.5 /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl/5.8.4 /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl/5.8.4 /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl/5.8.2 /usr/lib/perl5/vendor_perl/5.8.1 /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at (eval 10) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
or perhaps the capitalisation of 'mysql' isn't right.
Available drivers: ExampleP, Pg, Proxy, Sponge.
at /usr/bin/mytop line 235


DBD::mysql がなかったので、エラー。mytop には、perl-DBI, DBD::mysql が必要。


3. perl-DBI, DBD::mysql をインストール

$sudo cpan install DBI

$sudo cpan install DBD::mysql

DBD::mysql のインストールがmake test で見事落ちた。'root'@'localhost'にnopassword で入れないって言われる。どうやらテストの際に、実際にmysql を使用してテストしている模様。


4. mysql のroot ユーザーのパスワードを無効にする

$mysql -u root -p
$mysql> SET PASSWORD FOR root=PASSWORD('');


これについては、コンパイル時に指定することができるようです。

perl Makefile.PL --testdb=

これらのスイッチをコマンド行で設定したくなければ、代わりに mysql_configというスクリプトを作ることが出来ます。これは後で説明します。

利用できるスイッチは以下の通りです:

* testdb

テスト・データベースの名前。デフォルトはtest。
* testuser

テスト・ユーザの名前。デフォルトは空です。もし名前が空であれば、現在、ログインしているユーザ名が使われます。
* testpassword

テストユーザのパスワード。デフォルトは空。


もっかい、インストール。

$sudo cpan install DBD::mysql


またこけました。

got: ''
expected: ' '


とか、MySQL のテスト時に「Syntax Error」のような感じでこけてる。どうやら、モジュールのバージョンがあってないみたい。mysql のバージョン4.0 だしね。
ということで、DBD::mysql は手動インストール。ちなみに、cpan で入れたのは最新版で「4.007」でした。

5. DBD::mysql をインストール

$wget http://www.cpan.org/modules/by-module/DBD/DBD-mysql-3.0008.tar.gz
$gzip -cd DBD-mysql-3.0008.tar.gz | tar xf -
$cd cd DBD-mysql-3.0008
$perl Makefile.PL --mysql_config=/usr/bin/mysql_config
$make
$make test
$sudo make install


テストも無事通った。ということで、mytop 起動。

$mytop


普通に起動できました。

mytop のバグと解決方法

上手くインストールできたと思ったのですが、あっけなく不具合発見><リモートのmysql サーバーに対してmytop を使うと変な表示が。

$ mytop -u root -d hoge -h 192.168.0.2


本来は、ユーザー毎のプロセスが表示される場所に、以下のような表示が出る。

Use of uninitialized value in substitution (s///) at /usr/bin/mytop line 958


これは、どうやら既知のバグのようで、パッチが公開されていました。

Bug#455901: Use of uninitialized value in substitution (s///) at /usr/bin/mytop line 958.


パッチ をダウンロードする。
・・・でも、パッチの当て方知らないよ・・・orz なので、ググるぐるぐる。


ここによると、スクリプトの存在するディレクトリに行き、以下を実行すればおk。

$patch < PATCHFILE


ということで、mytop を探す。

$sudo find / -name mytop
/usr/bin/mytop
/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/mytop


下はフォルダなので、「/usr/bin/」下のmytop にパッチをあてる。

$sudo mv ~/fix.455901.diff /usr/bin
$sudo patch < fix.455901.diff
y


これで解決しました!

追記

MySQL 5.x の場合は、「innotop」の方がいいとのこと

MySQLのモニタするのに便利なmytopなんですが、MySQL 5に対して使うと、クエリの割合表示が全部ゼロになってしまったります。