MySQL: ステータス情報の収集と表示

以下、DBマガジン2010年7月号の草稿から

ステータス情報をCSV形式で収集する

mysqladminコマンドの結果をcsv形式で保存するperlスクリプトstatus2csv.plを示す。 変数$fileに結果を保存するファイル名を指定すればすぐに使うことができる。

$cat /usr/local/bin/status2csv.pl
#!/usr/bin/perl -w
use strict;

my $file = '/tmp/status.csv'; # 記録するファイル名を記述する
my $datetime = `/bin/date`; chop($datetime);
my $init = "false";    my $c = 0;     my($i, @val);

$init = "true" if (! -e $file);
open(FILE, ">>$file") || die "Error: Can't open $file";
print FILE "datetime," if ($init eq "true");
while(<>) {
    if ($_ !~ /^\+/ && $_ !~ /^\-/ && $_ !~ /^\| Variable_name/) {
        my @row = split(" ", $_); $val[$c++] = $row[3];
        print FILE $row[1] . "," if ($init eq "true");
    }
}
print FILE "\n" if ($init eq "true");
print FILE $datetime . ",";
for ($i = 0; $i < $c; $i++) { 
    print FILE $val[$i]; print FILE "," if($i < $c-1);
}
print FILE "\n";
close(FILE);

使い方は簡単で次のとおりである。これで結果が'/tmp/status.csv'に保存される。

$ mysqladmin -u root -p password extended-status | /usr/local/bin/status2csv.pl

定期的なステータス情報収集

定期的にステータス情報を記録するには、crontabに次のような記述を行えばよい。 この例では毎晩0時にステータス情報を保存する。

0 0 * * * /usr/local/mysql/bin/mysqladmin -u root -p password extended-status | /usr/local/bin/status2csv.pl

収集結果の解析スクリプト

保存したステータス情報を解析する簡易スクリプトshowstatus.plを示す。 出力モードは最低限の機能のみ。

$ cat /usr/local/bin/showstatus.pl
#!/usr/bin/perl -w
use strict;  use Getopt::Std;

my(%opts, @row, @len, @val, $keywd, $i, $j);  my $c = 0; 

getopts("dk:", \%opts);
$keywd = $opts{k} if (defined $opts{k}) 
    || die "\"Usage: showstatus.pl [-d] -k keyword < status.csv\"";
while(<>) {
    chop;
    @row = split(",", $_);
    for ($i = 0; $i <= $#row; $i++) {
        $val[$c][$i] =  $row[$i] 
            if ($c != 0 || $i == 0 || defined $val[0][$i] || $row[$i] =~ /^$keywd/i);
        $len[$i] = length($row[$i])
            if (!defined $len[$i] || ($len[$i] < length($row[$i])));
    } $c++;
}
for ($i = 0; $i < $c; $i++) {
    for ($j = 0; $j <= $#row; $j++) {
        if (defined $val[0][$j]) { 
            my $tmpval = $val[$i][$j];
            $tmpval -= $val[$i-1][$j]
                if (defined $opts{d}  && $val[$i][$j] =~ /^[0-9]+$/ && $i != 1);
            my $s = $len[$j] - length($tmpval) + 3;
            while($s-- > 0) {print " ";};  print $tmpval;
        }
    } print "\n";
}

使い方は次のとおりである。

  • kオプションに表示したいステータス情報名を設定し、標準入力からステータス情報を保存したファイルを読み込む。 前方一致検索するので、完全なステータス情報名を指定する必要はない。
$ /usr/local/bin/showstatus.pl -k key_reads < /home/mysql/status.csv
                      datetime    Key_reads
   Sun Apr 11 0:00:01 JST 2010     12321148
   Mon Apr 12 0:00:01 JST 2010     12753271
   TUE Apr 13 0:00:00 JST 2010     13018683
  • dオプションを設定すれば差分情報を表示する。
$ /usr/local/bin/showstatus.pl -d -k key_reads < /home/mysql/status.csv
                      datetime    Key_reads
   Sun Apr 11 0:00:01 JST 2010     12321148
   Mon Apr 12 0:00:01 JST 2010       432123
   TUE Apr 13 0:00:00 JST 2010       265412