mysqlのbinlogでディスク容量を使い切った話
最近 https://kaori-info.com というサイトを作りました。
mysqlはまだわかってないことが多くて、ディスクを使い切ってしまいました。
理由と解決方法を調べたので備忘録として書いておきます。
何が起きていたか
ある日、サイトを見ると、500 internal errorが出ていたので何だろうと思ってサーバーに繋いで見に行きました。
インターナルエラーは、経験的にはアプリケーションサーバーが落ちてるか、データベースにつなげられない時が多かったので順番に見ていきました。
アプリケーションサーバーは生きていたので、mysqlにログインしてみたところ、こちらもログインは出来ました。しかし操作ができないことに気がつきました。それでdfコマンドを使ってみたらディスクを使い切ってることがわかりました。
解決方法
容量を喰っているところを探す
どこで大量に使われているかを探すために次のコマンドを実行しました。
# cd /
# du -d1 -h |sort -h
として段階的にディレクトリを潜っていきました。
たどり着いたところが/var/lib/mysqlでした。
そこにたくさんあるbinlog.* 。
これでディスクを使い切っていました。
このログは、更新したときのログで、更新に失敗したりしたときに使うログらしいということがわかりました。
わたしは今のところそのログが無くても問題ないので、binlogの削除方法を探していてこの記事にたどり着きました。
このbinlogはファイルを削除するだけではダメなようなので、mysqlコンソールからbinlogを削除していきます。
ストレージの追加
困ったのは、mysqlにつなげられるものの、ディスクがいっぱいなので削除操作さえできないことでした。
conohaにサーバーを借りてるのでストレージを追加して、binlogの新しい方をいくらか待避してからpurgeしてある程度ディスクが空いたら、待避したbinlogを元の場所に戻してmysqlからpurgeすることにしました。
ストレージ追加方法
ストレージを借りて、VPC(VM)に接続(アタッチ)します。このときVPCが動いているとつなげられないので、一度シャットダウンします。
アタッチできたら、VPCを起動してログインし、lsblkで接続されているデバイス名を調べます。
fileコマンドを使って、初期化しようとしているデバイスが空っぽか確認します。
そのデバイスをmkfsして初期化します。
具体的なコマンドは下記を参考にしてください。
Linuxインスタンスを選ぶと出てきます。デバイス名は使ってる会社やシステムによって違うので、よく確認してください。
アタッチしたストレージの初期化~追加方法
Amazon EBS ボリュームを使用できるようにする
binlogの一部待避
そのドライブをmountでマウントして必要ならディレクトリを作って、さきほどのbinlogを一部移動させます。
例えば、新しいストレージを/mntにマウントしているとして、
# mv /var/lib/mysql/binlog.xxx6* /mnt
などとしてファイルを待避します。
削除する
ls binlog.* |head -20
とコマンドを打って、削除対象の具体的なファイル名を見つけます。
次に、
# mysql -u root
として、mysqlのコンソールを出して、
# purge master logs to 'binlog.xxxxxx';
とコマンドを書いて実行します。(binlogは別の名前のこともあるようです)
'binlog.xxxxxx'のxxxxxxの部分は数字なのですが、このpurgeコマンドは、その数字の1つ前までを一気に消してくれるので、最初少しずつ削っていって、負荷にもよりますが、わたしは半分くらい削ったところで一気に消しました。
以後のための対処方法
そして、/etc/mysql/mysql.conf.d を編集し
[mysqld]
expire_logs_days=7
を追加しておきました。
そしてmysqldの再起動を忘れないように…
Discussion