ログのローテーション

出典: MySQL Practice Wiki


目次

ログのローテーションとは?

運用管理の基本となる話ではあるが、ログのローテーションとはログを切り替える行為のことである。ログはたまる一方なので、放っておくと肥大化してしまう。MySQLには種々のログがあるので、ディスクが溢れてしまわないようにログのファイルを切り替え、なおかつ古いログを削除する必要がある。

MySQLにおけるログの種類

ログの種類 デフォルトのファイル名 有効にするオプション セクション 機能
一般クエリログ ホスト名.log log [mysqld] MySQLサーバに対する全てのリクエストを記録する。アプリケーションのデバッグ時以外はあまり使用しない。
エラーログ ホスト名.err log-error [mysqld_safe] mysqldが出力するエラーログ。トラブルシューティングの基本。
バイナリログ ホスト名-bin.NNNNNN(Nは数字) log-bin [mysqld] 全ての更新をステートメントレベルで記録する。レプリケーションやリカバリに使用する。SHOW MASTER STATUSコマンドで一覧表示出来る。
スロークエリログ ホスト名-slow.log log-slow [mysqld] 長時間かかったクエリを記録する。記録に至る閾値はlong_query_time秒である。また、--log-queries-not-using-indexesを指定することによりインデックスを使用していないクエリを全て記録させることも可能。デフォルトでは管理系のコマンドは記録されないが、--log-slow-admin-statementsを指定すると記録されるようになる。

FLUSH LOGSコマンド

FLUSH LOGSを実行すると、mysqldはログファイルを全てcloseし、ログファイルを新規作成して開き直す。その際、ログファイルの種類によって振る舞いが異なる。なお、mysqladmin flush-logsをシェルから実行することで同様の結果を得ることが出来る。

一般クエリログ、スロークエリログ

FLUSH LOGSはログを(実行中の書き込みが完了したタイミングで)いったんcloseしてからopenするという単純な動作をする。ログファイルを切り替える際にはFLUSH LOGSの前にログファイルを移動(待避)させなければならない。

FLUSH LOGS実行前にファイルを移動するとどうなるか?

次の手順がリファレンスマニュアルにて紹介されている。

shell> cd mysql-data-directory 
shell> mv mysql.log mysql.old 
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs 

mysqladmin flush-logsの前にログファイルをmvにより移動しているが、この場合ファイルの中身が壊れたり、mvを実行してからmysqladmin flush-logsコマンドを実行するまでの短期間においてログが失われたりしないだろうか?という疑問を持つ人が居るかも知れないが、そのような心配は無用である。mvコマンドではinodeが変更されない。従って、open中のファイルが指す実体も変更されることはない。例えば上記の例では、mvした後からmysqladmin flush-logsが実行されるまで、mysql.oldやmysql-slow.oldが引き続き更新される。同じファイル名でopenし直す際には元のファイルが見つからないので、違うinode番号を持ったファイルが再作成されることになる。

バイナリログ

自動的に新しい名前のファイルが作成される。バイナリログの名前は指定がなければ次のようになる。

/datadir/<hostname>-bin.NNNNNN

NNNNNNは連番で、0000001から始まる。FLUSH LOGSを実行する度にインクリメントされる。必要のない古いファイル(番号が小さいファイル)を消去しよう。消去するにはPURGE MASTER LOGSコマンドを利用すると良い。手順的には以下のようになるだろう。

  1. FLUSH LOGSでバイナリログを切り替える。
  2. 古いバイナリログが必要でないことを保証する。
    • レプリケーションのスレーブにおいてSHOW SLAVE STATUSコマンドを実行して使用中のバイナリログが新しくなっていることを確認する。
    • データのフルバックアップを取得する。(バイナリログはRedoで使用されるため、データの完全なコピーがあればそれ以前のバイナリログは必要ない。)
    • 必要に応じて古いバイナリログをバックアップする。
  3. PURGE MASTER LOGSコマンドで最新でないログを消去する。

エラーログ

エラーログは自動的に切り替わる。古いファイルは-oldというサフィックスがつく。デフォルトのエラーログのファイル名は<hostname>.errなので<hostname>.err-oldというファイルが出来る。次にFLUSH LOGSコマンドを実行すると、既存の-oldファイルは削除されてしまうので注意しよう。(必要ならば待避しておくと良い。)

なお、エラーログについても一般クエリログ、スロークエリログと同様にファイルをmvしてからFLUSH LOGSを実行してもよい。

mysql-log-rotateスクリプト

ソースコード情報

ログの操作に関するコードは全て sql/log.cc で行われている。

個人用ツール