MySQL マスターバイナリログを消去する

linux, サーバー関連 2010年5月17日,

レプリケーション環境のMySQLで最近ちょっとやばかったんです。

マスターと全く同じDB内容をスレーブが保ってくれるMySQLレプリケーションですが
マスターの更新のログ?みたいなのがどんどん溜まっていって肥大化していくみたいです。
通称バイナリーログというらしいですけど。

うちの環境では常にHDDのパーティションごとの使用率を監視しているのですが、
99%になってエラーメールが来て何事かと思ってみると
このバイナリーログだらけになっていました。

あと1%遅ければDBが「書き込みできない」状態になってとまってたかもしれないです。
やばかったです。そうなったら大障害ですからね・・・(月収ン億のサイトだったし・・・)

緊急でMySQLですらログインできない場合は直接バイナリファイルをrmしてもOKなんだけど
ログインできる状態ならログインして行うのがベストです。
というわけでバイナリーログを削除する方法。

バイナリーログの削除をする

バイナリーログ削除手順です。

マスター側のバイナリログ状況の確認

まずMySQLのdataディレクトリにバイナリログがいっぱい溜まってる状況を確認してみましょう。
ボクの環境では mysqld-bin.0000xx みたいな1個1Gほどのファイルが20、30個たまってました。
Mysqlにログインして確認することもできます

mysql -u root -p
show master logs;


現在アクティブなバイナリログを確認

スレーブ側で現在どのバイナリーログがみられているか確認します。
(レプリケーションを行ってない場合は数字が一番大きいものが現在参照されてるバイナリログなはず。)

スレーブ側にログインして現在のレプリケーション状態を確認

mysql -u user -p
mysql> show slave status \G


Master_Log_File:項目のファイル名を控えておく。


マスター側でバイナリログ削除コマンド

mysql -u root -p
PURGE MASTER LOGS TO ‘mysqld-bin.0000xx′;


mysqld-bin.0000xxではメモった現在アクティブなログファイルを指定してください。
このコマンドで指定したログファイル以外を削除してくれます。


バイナリーログの自動削除設定

再びこんな事にならないように自動削除する設定にします。
my.cnfに以下の追加

expire_logs_days = 30

こうすると次回mysqlの再起動後に設定が反映される。

しかしレプリケーションまで行う場合、DBを一瞬でも止めれない環境である事がほとんどなので
再起動は行えない為、直接設定の変更もしておく。

mysql -u root -p
set global expire_logs_days = 30;

確認

SHOW GLOBAL VARIABLES like ‘expire_logs_days’;


これで30日以前のバイナリログは削除していくようになる。
しかし、バイナリログのローテーションはmysql再起動とか新たなバイナリログが作られた時とかのタイミングで行われるので
厳密に30日ちょっきりに毎回行われるわけではない。
が、そこまで厳密にやる必要はないからOK。

コメントどうぞ