MariaDB(MySQL) での各種ログのローテーション設定

スポンサーリンク
スポンサーリンク

以下の記事で設定したログの運用上、容量を圧迫しないように定期的に削除されるようにローテーションの設定を行っていきます。

事前設定

ローテーションにて mysqladmin コマンドを実行する為のユーザー設定を行います。

設定には以下の2つの方法があり、それぞれの設定を書いていきたいと思います。
①mysql_config_editorコマンドにて、暗号化したユーザー情報を作成する。
②.my.cnfファイルを作成し、平文でユーザー情報を保持する。

①mysql_config_editorコマンドにてファイルを作成する方法

logrotate のバッチ処理は root ユーザーで実行される為、root ユーザーにて、以下のコマンドを実行します。


$ su
Password:
# mysql_config_editor set --login-path=logrotate --host=localhost --user=root --password

実行すると、内容が暗号化された以下のファイルが作成されます。
これで、事前設定は完了です。


/root/.mylogin.cnf

設定内容を確認する場合は、以下のコマンドで確認します。


# mysql_config_editor print --all
[logrotate]
user = root
password = *****
host = localhost

また、きちんと使用されているかを以下のコマンドで確認できます。
※エラーがでなければ設定はうまくいってます。


# mysqladmin --login-path=logrotate flush-logs

削除したい場合には、removeオプションをつけて実行します。


# mysql_config_editor remove --login-path=logrotate

また、設定の一部だけを削除したい場合には、更に削除したい項目をオプションとして追加します。


# mysql_config_editor remove --login-path=logrotate --host

②.my.cnfファイルを作成する方法

.my.cnfファイルを作成し、ユーザー情報を記述します。


# vim /root/.my.cnf


[mysqladmin] password = xxxxxxxxxx # root のパスワードを設定 user = root

権限情報を変更します。


# chmod 600 /root/.my.cnf

これで設定は、完了です。

ローテーション設定

上記で設定したユーザー情報を使用し、ローテーションの設定を行っていきます。

/etc/logrotate.d/配下にmysqlというファイルが存在する場合には、そちらに追記しても大丈夫ですが、管理しやすいように、今回は、別ファイルを作成し、対応していきたいと思います。

以下のコマンドにて、ファイルを作成&ローテーション設定を記述します。


$ vi /etc/logrotate.d/mysql-log
/var/log/mysql/mariadb.log /var/log/mysql/slow.log /var/log/mysql/query.log {
 # create 600 mysql mysql
 daily
 rotate 3
 missingok
 dateext
 compress
 postrotate
 # just if mysqld is really running
 if test -x /usr/bin/mysqladmin && \
  /usr/bin/mysqladmin ping &>/dev/null
 then
  /usr/bin/mysqladmin --login-path=logrotate flush-logs
 fi
 endscript
}

※事前設定①を使用している場合は、上記の設定を行い、事前設定②を使用している場合には、以下の変更を行います。


- /usr/bin/mysqladmin --login-path=logrotate flush-logs
+ /usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf flush-logs

設定はこれで完了です。

設定オプション説明
daily毎日ローテートを行う為の設定となります。その他、weekly は毎週、monthly は毎月1回ローテートする設定もあります。
rotate [count][count]の世代数のログファイルを確保し、それより古いログファイルを削除する設定です。記述が無い場合は rotate 0 となり、古いログを全て削除してしまいます。
missingokログファイルが無い場合でもエラー処理しない設定となります。
dateext古いログファイルへリネームする際の suffix を日付8桁(-YYYYMMDD) にする設定となります。
compress古いログファイルを gzip で圧縮します。圧縮したくない場合は nocompress を指定します。
postrotate 〜 endscriptpostrotate と endscript の間にあるスクリプトを、ローテート後に実行します。

最後に、デバッグモードでlogrotateコマンドを実行し、設定に問題がないかを確認します。


$ logrotate -dv /etc/logrotate.d/mysql-log

うまく動作しない場合

MySQL バージョン次第では flush-logs が正しく動作しないことがあります。
例えば、コマンドで実行するとエラーはでないが、cron から実行すると flush-logs がきちんと動作していないという場合もあります。
そのような場合には、cron 処理で logrotate を実行する際のデバッグログを出力するのが、一番かと思いますので、その設定を書いていきます。

今回設定したローテーション設定は、/etc/cron.daily/logrotate で実行されてますので、こちらの処理にログ出力設定書いていきます。
※vi もしくは、vim でファイルを開きます。


$ sudo vim /etc/cron.daily/logrotate
- /usr/sbin/logrotate /etc/logrotate.conf
+ /usr/sbin/logrotate -v /etc/logrotate.conf >/var/log/logrotate.log 2>&1

これで、きちんと動作しない理由が確認できるかと思いますので、デバッグ情報を元に修正を行っていきます。

コメント

タイトルとURLをコピーしました