notebook

都内でWEB系エンジニアやってます。

mysql slow-logのlogrotate

mysql slow-logのlogrotate

今まで動いていたログローテーションが動かなくなったので何だと思って調べたら色々はまったのでメモ

$ ls -al /var/lib/mysql
-rw-rw---- 1 mysql mysql          0 May 14 04:08 mysql-slow.log
-rw-rw---- 1 mysql mysql 7416685154 May 18 11:28 mysql-slow.log-20150514
....
....

現象は上記のようにファイル名は変わるけど書き込み先が変わらないというもの

結果いつまでも20150514のファイルに書き込みに行くし圧縮もされないしディスク容量も圧迫する

まずはファイルを見てみましょう

/var/lib/mysql/mysql-slow.log /var/lib/mysql/mysqld.log {
        # create 600 mysql mysql
        notifempty
        daily
        rotate 3
        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 flush-logs
        fi
    endscript
}

パスワード設定

設定自体は悪くなさそうだし、特に変更をしたわけではないのにどうして。。。。

と思っていたらありました、直近でパスワードをrootユーザーに付与しましたw

ローテーション時にパスワードが入力できないのでmysqladminのflush-logsが実行されない

よく見れば/etc/logrotate.d/mysqlコメントアウトで書いてある。。。

それに従い/root/.my.cnfを設定

  • /root/.my.cnf
[mysqladmin]
password = passwd
user = root

600のパーミッションにもしたし。後は様子を見るだけ。。。。

はい、ダメでしたー

強制実行ではローテーションできるのにcrontabだと実行されない

  • 強制実行
logrotate -f /etc/logrotate.d/mysql

環境変数

コンソールで実行できてcronで実行できない、この手のトラブルはよくあるあれですね、環境変数

他の記事にも書いてありましたが(URL忘れた...)

rootユーザのHOMEがうまく読み込まれていないことが原因

なので下記のようにpostrotate実行時に適切な環境変数を設定してあげました

   postrotate
        # just if mysqld is really running
+        export HOME=/root/
        if test -x /usr/bin/mysqladmin && \
}

無事

rotateがされるようになりました、めでたしめでたしw