忘れてはいけないMySQLのレプリケーション時のバイナリログの削除設定

あれ、なんかDBサーバーの空き容量がなくなっている・・・

これ、MySQLのDBサーバーでレプリケーションなんかを組んでたりすると起こりえちゃうことがあります。 なにが空き領域を食ってしまっているかというと、バイナリログなんですね。 レプリケーションの設定ばかりに目がいって忘れがちなのですが、 これ忘れちゃうとログが溜まっていってDBサーバーが、いっぱいいっぱいになってしまいます。 定期的に消してやらないといけないんだけど、バイナリログファイルを直接rmとかで削除しちゃうと MySQLの認識上ではまだ残ったままになっているので具合が悪いんですね。

じゃぁ消していきましょうか。の前に確認

まずはレプリケーション組んでるんだから、マスター、スレーブにDBサーバが分かれているかと思います。 マスターからスレーブにレプリケートしているなら、どの時点のログまでスレーブに反映されているか確認しましょう。 つまりはどこまでログを削除できるか?を確認します。 スレーブ側で下記コマンドで確認しましょう。

 mysql> SHOW SLAVE STATUS ... Master_Log_File:mysql-bin.000662 ... 

「mysql-bin.000662」ファイルまではスレーブにも反映されているようですね。 (スレーブのDBサーバが複数ある場合はすべて確認しておきましょう。)

こんどこそ消していきましょう

こんどはマスターで下記コマンドでどれだけバイナリログが溜まっているかを確認しましょう。

 mysql> SHOW MASTER LOGS; ... mysql-bin.000658 125391257 mysql-bin.000659 1073769728 mysql-bin.000660 150671106 mysql-bin.000661 125295185 mysql-bin.000662 836504387 ... 

もろもろログがでてきいますが、すでにスレーブでは「mysql-bin.000662」まで反映されているので、 それよりも前のログは削除できるわけですね。(削除して良いかどうかはまた別問題ですよ) 削除は下記コマンドを実行すればOKです。 指定したログファイル名より前のログが削除されるようになっています。

 mysql> PURGE MASTER LOGS TO 'mysql-bin.000662'; 

もっぺんマスターでログ確認してみると、

 mysql> SHOW MASTER LOGS; ... mysql-bin.000662 836504387 ... 

さて、削除できたもののこれを定期的にしておきたい。これ重要

一定時間が経過したバイナリログを自動的に削除したい場合は、設定することで実現可能です。 というかしておかないと。冒頭のようなことになります。 ちなみにデフォルトでは0となっており、削除されません。 方法は2種類あって

  • my.cnfに直接設定を書き込んでしまうパターン
  • DBに一時的に設定しておくパターン

my.cnfに直接設定を書き込んでしまうパターンの場合(DBサービスの再起動が必要) set-variable行を追加。サンプルでは7日間ログを保持

 [mysqld] set-variable = expire_logs_days=7 

DBに一時的に設定しておくパターンの場合(DBサービスの再起動が不要

 SET GLOBAL expire_logs_days = 7; 

最後に確認のため、設定が入っているか確認

 show global variables like 'expire_logs_days'; 

忘れていると痛い目にあう

レプリケーション設定そのものに目がいってしまいがちですが、忘れないようにしておきましょう。 いずれディスク容量が足らないということになり、忘れた頃にトラブルはやってきますので、、、