2013年12月3日火曜日

MySQLのスロークエリログをローテートさせる。

MySQLでスロークエリログ(log-slow-queries)を出力させ、そのログをログローテート(logrotate)機能でローテーションさせます。


MySQLスロークエリログの出力設定

スロークエリのログを出力する設定をmy.cnfに追記します。
今回はlog_query_timeを5秒に設定しています。この値を超える時間を要したクエリがログに出力されます。
出力されるログファイルはlog-slow-queriesで指定して下さい。
下記の例では/var/log/mysqld/ディレクトリにslow_query.logというファイルに出力させるように設定しました。( ´∀`)

[root@centos5 ~]# vi /etc/my.cnf
[mysqld]
long_query_time=5
log-slow-queries=/var/log/mysqld/slow_query.log

ログローテーションの実行設定

ログローテーションが実行されるように、/etc/logrotate.d/ディレクトリ下にファイルを作成します。
例ではmysqldというローテーションの設定ファイルを作成しています。
(下記の設定例では、スロークエリログ出力で指定したディレクトリ内に存在する全ての.log拡張子を持つファイルを対象としています。)

[root@centos5 ~]# vi /etc/logrotate.d/mysqld
/var/log/mysqld/*.log {
        create 640 mysql mysql
        notifempty
        daily
        rotate 7
        missingok
     postrotate
       if test -x /usr/bin/mysqladmin && /usr/bin/mysqladmin ping &>/dev/null
       then
          /usr/bin/mysqladmin -u anonymous flush-logs
       fi
    endscript
}

  • create : (新規に作成されるファイルの所有者と権限を指定出来ます。)
  • notifempty : (ローテート対象のファイルが空の場合はローテートを行わない。)
  • daily : (日毎に行う。)
  • rotate : (ローテート履歴上限数。)
  • missingok : (ローテート対象となるログファイルが存在しなかった場合も処理を継続する。)
  • postrotate : (ローテート実行後に実行するコマンドやスクリプト。)

ポイントとしては/usr/bin/mysqladminflush-logsを実行させる際、-u(ユーザー指定オプション)を用いてログインにパスワード入力の必要がないユーザーを指定しています。
このファイル内にMySQLアカウントのパスワードを直接書いても良いのであれば「--user=USERNAME --password=PASSWORD」でも構わないと思います。
今回は、anonymousという専用ユーザーを作成しました。このユーザーにはRELOADの権限が必要となります。(それ以外は必要ありません。)

ユーザー名を未指定で実行した場合はrootユーザーで実行されます。
その場合、rootがパスワード入力無しでログイン出来ない場合は、以下の様なエラーメッセージが出力されます。

running postrotate script
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
error: error running postrotate script for /var/log/mysqld/*.log

ログローテートの実行後、新しく作成されたログファイルにログを出力させるためにはMySQLを再読み込みさせる必要があるので、この対応が必要となります。詳しくはリンク先を参照して下さい。
4.10.6. ログ ファイルの保守(MySQL に新しいログ ファイルの使用を強制するには、mysqladmin flush-logs...)
ログローテートの設定を行ったら、必ずテスト実行(-dオプション)して下さい。(`・ω・´)

[root@centos5 ~]# logrotate -d /etc/logrotate.d/mysqld

エラーが無ければOKです。
(-fオプション[ログローテートの強制実行]を指定すれば、実際にログのローテーションが行われます。)


今日はここまでです! ⊂⌒(。・ω・)っ お役にたてましたら嬉しいです。