MySQL
Vagrant
1
どのような問題がありますか?

この記事は最終更新日から1年以上が経過しています。

Organization

MySQL のバイナリログを整理してディスクを空けた話

株式会社オズビジョンの @terra_yucco です。
Qiita 投稿自体久々なのですが、また地道に自分のログを書き溜めていこうと思います。
※まだログしかありませんが、以前にオススメいただいた Qrunch も始めました。アカウントに -_ が使えなかったので @terrayucco でやっております。

本日は自分の開発環境をあふれさせ、ディスク拡張ではなく不要ファイル整理で解消したのでそちらのメモを置いておきます。

TL; DR

本番環境のデータ dump を import した MySQL を local vagrant 上で動かしていたら、ディスク領域が 100% になったので、拡張ではなく不要ファイル削除で対応した話。

より詳しく

事象説明

本番環境のデータ (100 万件くらい) を dump して local vagrant の MySQL にリストアし、バッチ処理を流すテストを何度も実施。(リランのテストなど兼ねていたので)

そうしたら、何回目かで

"Error writing file '\/tmp\/MYuQz1fV' (Errcode: 28)" 的なメッセージを吐き出してバッチが全く動かないようになった。

状況

ほんの少しだけ空いていますが、ルートディスクを 100% 使い切っていました。

$ df
ファイルシス                      1K-ブロック      使用    使用可 使用% マウント位置
/dev/mapper/centos-root             8775680   8775000      680  100% /
devtmpfs                             498600         0   498600    0% /dev
tmpfs                                508684         0   508684    0% /dev/shm
tmpfs                                508684      6668   502016    2% /run
tmpfs                                508684         0   508684    0% /sys/fs/cgroup
/dev/sda1                            508588    149056   359532   30% /boot
192.168.33.1:/C/work/batch-code   248611840 212789792 35822048   86% /vagrant
tmpfs                                101740         0   101740    0% /run/user/0

du -sch ./* を繰り返して階層を下って行ったところ、大きかったのは以下の場所。

$ du -sch /usr/local/mysql/*
20K     /usr/local/mysql/COPYING
132K    /usr/local/mysql/INSTALL-BINARY
4.0K    /usr/local/mysql/README
155M    /usr/local/mysql/bin
5.1G    /usr/local/mysql/data
16K     /usr/local/mysql/docs
704K    /usr/local/mysql/include
15M     /usr/local/mysql/lib
760K    /usr/local/mysql/man
122M    /usr/local/mysql/mysql-test
16K     /usr/local/mysql/scripts
2.5M    /usr/local/mysql/share
2.8M    /usr/local/mysql/sql-bench
100K    /usr/local/mysql/support-files
5.4G    合計

/usr/local/mysql/data ということで、消えても local のデータなので良いだろうということでここを空けました。

空け方

一覧

mysql-bin.000xxx は MySQL のバイナリログファイルということで、レプリケーションが終わっていれば (特に個人の local では) 消して良いもの。1
なんと一年以上消していなかったらしく、そりゃ溜まるはずだという感じでした。

$ ls -ltr
合計 5274624
drwxr-xr-x 2 mysql mysql         19  3月 18  2016 test
drwx------ 2 mysql mysql       4096  3月 18  2016 performance_schema
drwx------ 2 mysql root        4096  3月 18  2016 mysql
-rw-rw---- 1 mysql mysql        264  3月 18  2016 mysql-bin.000001
        : // mysql-bin.000xxx が連番で続く
drwx------ 2 mysql mysql       8192 11月 22 12:05 hoge
-rw-rw---- 1 mysql mysql    5242880 11月 26 09:57 ib_logfile1
-rw-rw---- 1 mysql mysql       2717 12月  4 14:06 mysql-bin.index
-rw-rw---- 1 mysql mysql          5 12月  4 14:06 localhost.localdomain.pid
-rw-rw---- 1 mysql mysql 1193279488 12月  4 15:05 ibdata1
-rw-rw---- 1 mysql mysql    5242880 12月  4 15:05 ib_logfile0
-rw-rw---- 1 mysql mysql  153083532 12月  4 15:33 mysql-bin.000143
-rw-r----- 1 mysql root      457642 12月  4 15:33 localhost.localdomain.err

コマンド

ここで rm してはダメで、
mysql 上で (権限のあるユーザで) 以下を実行します。

上記の例では、最新のバイナリログファイルは mysql-bin.000143 なので、このファイルだけを残しました。

mysql> PURGE BINARY LOGS TO 'mysql-bin.000142';
Query OK, 0 rows affected (0.02 sec)

結果はスッキリ。
ひそかに mysql-bin.index も更新されていました。

[root@localhost data]# ls -ltr
合計 1424124
drwxr-xr-x 2 mysql mysql         19  3月 18  2016 test
drwx------ 2 mysql mysql       4096  3月 18  2016 performance_schema
drwx------ 2 mysql root        4096  3月 18  2016 mysql
drwx------ 2 mysql mysql       8192 11月 22 12:05 hoge
-rw-rw---- 1 mysql mysql    5242880 11月 26 09:57 ib_logfile1
-rw-rw---- 1 mysql mysql          5 12月  4 14:06 localhost.localdomain.pid
-rw-rw---- 1 mysql mysql 1193279488 12月  4 15:05 ibdata1
-rw-rw---- 1 mysql mysql    5242880 12月  4 15:05 ib_logfile0
-rw-rw---- 1 mysql mysql  153083532 12月  4 15:33 mysql-bin.000143
-rw-r----- 1 mysql root      457642 12月  4 15:33 localhost.localdomain.err
-rw-rw---- 1 mysql mysql         38 12月  4 15:39 mysql-bin.index

まとめ

MySQL 利用環境で Disk 利用率が高くなったら、バイナリログの整理でスッキリできることも。

Vagrant ディスクフル などで検索すると、ディスク容量を増やす方法の方がよく出てきますが、不要なものであれば削除してスッキリ使いたい派なので、このエントリを書くに至りました。
local 環境であれば普段本番では触れられない MySQL の管理系コマンドも試せるので、いろいろと学びになりました。2


  1. Is it safe to delete mysql-bin files? 

  2. ローカル環境であれば my.cnf に expire_logs_days=7 とか書いておけば回避できそうです。(書いてなかった) 

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザー登録ログイン
terra_yucco
株式会社オズビジョンでサーバサイドエンジニアとして勤務しているユッコ (テラシマユウコ) です。IPA の情報処理技術者試験で資格を取りまくっていた時期があり FE/AP/SA/DB/ES/SC(旧区分時代:情報セキュリティスペシャリスト) を取得済。
ozvision
購買プラットフォーム「ハピタス」を開発・運営するベンチャー企業

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
1
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー