Logrotatedを使用して、MySQLのエラーログとスローログをローテーションさせる設定に、ちょっとしたコツがあったので忘れないようにまとめてみた。
[パスワードファイルの設定]
まず、MySQLをセットアップした際に、一緒にインストールされる、logrotaedの設定ファイル「/etc/logrotate.d/mysql」の中に書いてある設定方法にしたがって、MySQLの認証に使用するパスワードファイルを、rootのホームディレクトリに作る。
# vi /root/.my.cnf
[mysqladmin]
host = hostname
user = root
password = password
.my.confファイルは、rootユーザーのみが読み書き可能な設定にする。
# chown root:root .my.cnf
# chmod 600 .my.cnf
[logrotaedの設定]
標準の設定では、.my.cnfで指定した、ファイル名のファイルを、ローテーションする設定になっていないので、ローテーション対象のログファイルの名前を設定ファイルで指定する。
ログファイルの名前は、下記のように設定したとする。
エラーログ: mysql-error.log
スローログ: mysql-slow.log
ログファイル名を、指定するだけで、ログローテーションが、されるはずなのだが、なぜか、「/etc/logrotate.d/mysql」の記述にしがってパスワードファイルを作成しても、パスワードファイルを、読み込んでくれないようで、ログローテーションが正常にされなかった。
問題の解決策として、下記のようにlogrotatedの設定ファイル「/etc/logrotate.d/mysql」の内容を書き直す必要があった。
/usr/bin/mysqladmin flush-logs
設定ファイル中の上記の行を次のように書き直して、明示的にパスワードファイルを読み込むようにした。
/usr/bin/mysqladmin –defaults-extra-file=/root/.my.cnf flush-logs
上記を、踏まえた上で設定をすると、設定ファイルの内容は、下記のようになった。
# vi /etc/logrotate.d/mysql
/var/log/mysql/mysql-error.log
/var/log/mysql/mysql-slow.log
{
# create 600 mysql mysql
notifempty
daily
rotate 14
missingok
compress
postrotate
# just if mysqld is really running
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin ping &>/dev/null
then
/usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf flush-logs
fi
endscript
}