mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

MySQL - バイナリログ肥大化!

[ サーバ構築 ] [ MySQL ]

こんばんは。

DB サーバ MySQL を使用していて、突然ディスク容量不足になって MySQL に接続できなくなる事があります。(以下は実際は1行で出力されます)

1
2
3
4
5
ERROR 20 (HY000) at line 989:
 Disk is full writing './mysql-bin.000022' (Errcode: 28).
 Waiting for someone to free space...
 (Expect up to 60 secs delay for server to continue
  after freeing disk space)

mysql-bin.999999 というバイナリログが多数出来たり肥大化しているためにこの現象が発生します。

MySQL を使用している方ならご存知の方も多いと思いますが、レプリケーション(複製)の設定が影響しています。 レプリケーションとは MySQL サーバ複数台でデータベースの負荷分散とリアルタイムなバックアップを行う為の機能です。

ちなみに、少し古い MySQL 5.1 系なら標準でレプリケーションが無効になっている(有効になっていない)ので、このような現象に遭遇する事はないと思います。個人で利用するレベルなら必要もないですし。。。

ところが、最新の 5.5 系を導入すると標準でレプリケーションが有効になっているので、バイナリログがどんどん作成されます。レプリケーションを使用しない場合は無駄にバイナリログが作成されてディスク容量が圧迫されてしまいます。

当方の場合、MySQL 5.5 系を導入しているサーバでの 20GB を超えるダンプのインポート作業中のことでした。1GB 位のバイナリログが10個以上作成されてしまった頃でした。"/var" ディレクトリの容量がいっぱいになっていました。

対策方法

以下、「MySQL 5.5 系を使用し、レプリケーション機能は使用しないのにバイナリログが作成されディスク容量が圧迫されて困る」場合の対策です。 ※実際に作業したのは、"Scientific Linux 6.2 (amd64版)“ ですが、Redhat 系なら同じです。また、それ以外でも同様(似たような手順)です。

1. バイナリログの削除

まず、不要なのに無駄に作成されてしまったバイナリログ “mysql-bin.999999” というファイルを削除します。 mysql サーバに root でログインして、以下のコマンドを実行します。

1
PURGE MASTER LOGS BEFORE now();

もしくは、以下のように最新のログファイル名を指定したり、日付を指定したりして削除します。

1
2
PURGE MASTER LOGS TO 'mysql-bin.000022';
PURGE MASTER LOGS BEFORE '2012-06-01 00:00:00';

直接 “mysql-bin.999999” というファイルを削除しない方がいいでしょう。 MySQL サーバにログインして “PURGE” コマンドを使用する方がいいと思います。 また、これらの方法では最新のログファイルは削除できず残ってしまいます。 ※"PURGE" コマンドを使用せずに直接削除(rm)しても大丈夫のようですが、当方はとりあえず最新のバイナリログだけは残しています。実際に稼動中のサーバでなければ試行してみるのですが。。。

2. MySQL の設定を変更

5.5 系では標準でレプリケーションを使用する設定になっているので、設定ファイル “my.cnf” を編集してレプリケーションを使用しない設定にする。 [mysqld] の以下の行をコメントアウトする。(InnoDB ストレージエンジンを使用しない場合や、レプリケーションを使用しない場合) ※Linux 系なら、"/etc/my.cnf" です。

1
2
3
log-bin=mysql-bin
 ↓ 変更
# log-bin=mysql-bin

3. MySQL サーバの再起動

変更した設定を有効化するために、MySQL サーバを再起動する。 ※以下は、Redhat 系 Linux の場合。

1
2
3
# /etc/rc.d/init.d/mysqld restart
 もしくは
# service mysqld restart

これで、バイナリログは無駄に作成されなくなります。

以上です。

Comments