b.l0g.jp     About     Archive     Feed

MySQLスローログの手動ローテート

MySQLのスローログは、通常それほど大量に出るものではないからか、自動でローテートされるような設定は特にない。しかし、負荷が上がったりしてスローログが大量に出てしまい、ローテートしたい場合はよくあるだろう。手動でローテートする場合は以下のように行う。

この例は、MySQLのデータディレクトリ(datadir)が /var/lib/mysql で、スローログファイル名(slow_query_log_file)がmysql-slow.logの場合。

  
$ cd /var/lib/mysql
  
$ mv mysql-slow.log mysql-slow.log.old
  
$ mysqladmin flush-logs
  
または
  
mysql> flush logs;
  

mysqladmin flush-logs あるいは flush logs で、ログファイルを開き直すことができる。

なお、5.1.12以降だとログ出力をコンソールからオフにできるので、オフにしてからflush-logsし、その後オンに戻すとよいだろう。

  
mysql> set global slow\_query\_log = 'OFF';
  
mysql> set global slow\_query\_log = 'ON';
  

ここで、MySQL5.1以前のバージョンでは「mysqladmin flush-logs」を実行すると、バイナリログや一般クエリログも全部まとめてローテートされてしまう。binlogを有効にしているサーバ(レプリケーションしている構成のマスタなど)では注意した方がいいかもしれない。

なお、5.5からは、


# スローログだけ開き直す

mysql> flush slow logs;

# 一般クエリログだけ開き直す

mysql> flush general logs;

# バイナリログだけローテート

mysql> flush binary logs;

# エラーログだけローテート

mysql> flush error logs;
  

というように、種類を指定できるようになっている。

(2014/12/17 エラーログについてコメントで指摘いただいたので追加。情報提供ありがとうございます)

ちなみにlogrotateで定期的にローテートする場合はこうやるそうだ。

[MySQL の slowlog を logrotate する方法 Carpe Diem](http://www.sssg.org/blogs/naoya/archives/1251)

定期的にローテートする必要があるほどスローログが出るままにするってのはどうかと思うが、そういうこともあるかもw


海外の役立つブログ記事などを人力で翻訳して公開するYakstというプロジェクトをやっています。よろしければそちらもどうぞ!