MySQLで、レプリケーションの設定を行ったら、マスターのバイナリログのメンテナンス設定は、必ず行いましょう。

レプリケーション環境のMySQLで、マスターのMySQLに書き込みが出来ない障害が発生!

結論からいうと、これは、レプリケーション環境で使う、マスターが出力するバイナリログが、メンテナンスされずに溜まってしまい、サーバーのディスクスペースを圧迫していたことが原因でした。

このへんの設定は、レプリケーションの設定時の稼働には問題にならない為、つい忘れたりしてしまいがちです。(自分だけかな・・。)

「MySQLで、レプリケーションの設定を行ったら、マスターのバイナリログのメンテナンス設定は、必ず行いましょう。」という戒めを込めて、対応の履歴を記録しておきます。

障害発生状況

  • MySQLで書き込みが出来ない。
  • MySQLは、実行中なのに、ログインができない。
  • このMySQLは、レプリケーション環境のマスターDB
  • ログを確認すると、ディスクに空きスペースがなくバイナリログを更新できないとのエラー
    [ERROR] /usr/libexec/mysqld: Disk is full writing './mysqld-bin.000050' (E
    rrcode: 28). Waiting for someone to free space... Retry in 60 secs

対応

ある程度の容量は、確保して構築しているはずなんだけど・・・。と、各種のログ等を確認しながら考えていて、「はっ!」と思いついて、MySQLにログインができないので、直接バイナリログをを確認。

# cd /var/lib/mysql
# ls -l
-rw-rw---- 1 mysql mysql    56541504 11月 12 17:41 mysqld-bin.000001
-rw-rw---- 1 mysql mysql    25081715 11月 22 14:45 mysqld-bin.000002
-rw-rw---- 1 mysql mysql    46907503 12月  2 07:39 mysqld-bin.000003
-rw-rw---- 1 mysql mysql    22192865 12月 10 07:58 mysqld-bin.000004
-rw-rw---- 1 mysql mysql     1531470 12月 15 18:25 mysqld-bin.000005
-rw-rw---- 1 mysql mysql          98 12月 15 20:37 mysqld-bin.000006
-rw-rw---- 1 mysql mysql      294344 12月 26 07:04 mysqld-bin.000007
-rw-rw---- 1 mysql mysql  1073906608  1月 28 18:34 mysqld-bin.000008
-rw-rw---- 1 mysql mysql   601284082  1月 29 07:55 mysqld-bin.000009
-rw-rw---- 1 mysql mysql   815188395  1月 30 10:15 mysqld-bin.000010
-rw-rw---- 1 mysql mysql  1073781613  1月 31 07:20 mysqld-bin.000011
-rw-rw---- 1 mysql mysql  1073777972  2月  1 06:34 mysqld-bin.000012
-rw-rw---- 1 mysql mysql  1073829316  2月  2 16:16 mysqld-bin.000013
-rw-rw---- 1 mysql mysql  1073892592  2月  3 14:01 mysqld-bin.000014
-rw-rw---- 1 mysql mysql  1073861148  2月  4 12:01 mysqld-bin.000015
-rw-rw---- 1 mysql mysql  1073786894  2月  5 12:26 mysqld-bin.000016
-rw-rw---- 1 mysql mysql  1073755153  2月  6 10:03 mysqld-bin.000017
-rw-rw---- 1 mysql mysql  1073762786  2月  7 08:20 mysqld-bin.000018
-rw-rw---- 1 mysql mysql  1073782366  2月  8 08:14 mysqld-bin.000019
-rw-rw---- 1 mysql mysql  1073748068  2月  9 07:09 mysqld-bin.000020
-rw-rw---- 1 mysql mysql  1073745851  2月 10 05:06 mysqld-bin.000021
-rw-rw---- 1 mysql mysql  1073762528  2月 11 02:14 mysqld-bin.000022
-rw-rw---- 1 mysql mysql  1073806377  2月 12 00:30 mysqld-bin.000023
-rw-rw---- 1 mysql mysql  1073805333  2月 12 22:41 mysqld-bin.000024
-rw-rw---- 1 mysql mysql  1073803999  2月 13 20:51 mysqld-bin.000025
-rw-rw---- 1 mysql mysql  1073764709  2月 14 20:20 mysqld-bin.000026
-rw-rw---- 1 mysql mysql  1073834140  2月 15 20:53 mysqld-bin.000027
-rw-rw---- 1 mysql mysql  1073825293  2月 16 20:43 mysqld-bin.000028
-rw-rw---- 1 mysql mysql  1073763127  2月 17 21:28 mysqld-bin.000029
-rw-rw---- 1 mysql mysql  1073758075  2月 18 19:59 mysqld-bin.000030
-rw-rw---- 1 mysql mysql  1073781147  2月 19 20:23 mysqld-bin.000031
-rw-rw---- 1 mysql mysql  1073759274  2月 20 21:31 mysqld-bin.000032
-rw-rw---- 1 mysql mysql  1073742078  2月 21 21:21 mysqld-bin.000033
-rw-rw---- 1 mysql mysql  1074359076  2月 22 21:40 mysqld-bin.000034
-rw-rw---- 1 mysql mysql  1073796154  2月 23 20:45 mysqld-bin.000035
-rw-rw---- 1 mysql mysql  1073814266  2月 24 21:31 mysqld-bin.000036
-rw-rw---- 1 mysql mysql  1073892781  2月 26 03:50 mysqld-bin.000037
-rw-rw---- 1 mysql mysql  1073742144  2月 27 09:07 mysqld-bin.000038
-rw-rw---- 1 mysql mysql  1073782465  2月 28 12:47 mysqld-bin.000039
-rw-rw---- 1 mysql mysql  1073824742  3月  1 17:10 mysqld-bin.000040
-rw-rw---- 1 mysql mysql  1073777916  3月  2 21:32 mysqld-bin.000041
-rw-rw---- 1 mysql mysql  1073793131  3月  4 02:43 mysqld-bin.000042
-rw-rw---- 1 mysql mysql  1073789908  3月  5 04:12 mysqld-bin.000043
-rw-rw---- 1 mysql mysql  1073785890  3月  6 11:06 mysqld-bin.000044
-rw-rw---- 1 mysql mysql  1073750194  3月  7 16:54 mysqld-bin.000045
-rw-rw---- 1 mysql mysql  1073781833  3月  8 22:26 mysqld-bin.000046
-rw-rw---- 1 mysql mysql  1073747955  3月 10 06:22 mysqld-bin.000047
-rw-rw---- 1 mysql mysql  1073792201  3月 11 14:32 mysqld-bin.000048
-rw-rw---- 1 mysql mysql  1046327296  3月 16 11:53 mysqld-bin.000049
-rw-rw---- 1 mysql mysql      872448  3月 16 18:37 mysqld-bin.000050

およそ40GBほど溜まっています。やはりバイナリログが原因のようです・・・。

とりあえず、古いものから10ファイルを直接削除して、容量を確保。

# rm -f mysqld-bin.000001 mysqld-bin.000002 mysqld-bin.000003 mysqld-bin.000004 mysqld-bin.000005 mysqld-bin.000006 mysqld-bin.000007 mysqld-bin.000008 mysqld-bin.000009 mysqld-bin.000010

ある程度の容量を確保したら、MySQLにログインできるようになったので、改めて、バイナリログの一覧を確認。

# mysql -u user -p

mysql> show master logs;
+-------------------+------------+
| Log_name          | File_size  |
+-------------------+------------+
| mysqld-bin.000001 |          0 |
| mysqld-bin.000002 |          0 |
| mysqld-bin.000003 |          0 |
| mysqld-bin.000004 |          0 |
| mysqld-bin.000005 |          0 |
| mysqld-bin.000006 |          0 |
| mysqld-bin.000007 |          0 |
| mysqld-bin.000008 |          0 |
| mysqld-bin.000009 |          0 |
| mysqld-bin.000010 |          0 |
| mysqld-bin.000011 | 1073781613 |
| mysqld-bin.000012 | 1073777972 |
| mysqld-bin.000013 | 1073829316 |
| mysqld-bin.000014 | 1073892592 |
| mysqld-bin.000015 | 1073861148 |
| mysqld-bin.000016 | 1073786894 |
| mysqld-bin.000017 | 1073755153 |
| mysqld-bin.000018 | 1073762786 |
| mysqld-bin.000019 | 1073782366 |
| mysqld-bin.000020 | 1073748068 |
| mysqld-bin.000021 | 1073745851 |
| mysqld-bin.000022 | 1073762528 |
| mysqld-bin.000023 | 1073806377 |
| mysqld-bin.000024 | 1073805333 |
| mysqld-bin.000025 | 1073803999 |
| mysqld-bin.000026 | 1073764709 |
| mysqld-bin.000027 | 1073834140 |
| mysqld-bin.000028 | 1073825293 |
| mysqld-bin.000029 | 1073763127 |
| mysqld-bin.000030 | 1073758075 |
| mysqld-bin.000031 | 1073781147 |
| mysqld-bin.000032 | 1073759274 |
| mysqld-bin.000033 | 1073742078 |
| mysqld-bin.000034 | 1074359076 |
| mysqld-bin.000035 | 1073796154 |
| mysqld-bin.000036 | 1073814266 |
| mysqld-bin.000037 | 1073892781 |
| mysqld-bin.000038 | 1073742144 |
| mysqld-bin.000039 | 1073782465 |
| mysqld-bin.000040 | 1073824742 |
| mysqld-bin.000041 | 1073777916 |
| mysqld-bin.000042 | 1073793131 |
| mysqld-bin.000043 | 1073789908 |
| mysqld-bin.000044 | 1073785890 |
| mysqld-bin.000045 | 1073750194 |
| mysqld-bin.000046 | 1073781833 |
| mysqld-bin.000047 | 1073747955 |
| mysqld-bin.000048 | 1073792201 |
| mysqld-bin.000049 | 1046327296 |
| mysqld-bin.000050 |     970445 |
+-------------------+------------+

今度は、別ウィンドウで、スレーブ設定のMySQLにログインして、スレーブが現在使用しているバイナリログを確認。

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

*************************** 1. row ***************************
            Master_Log_File: mysqld-bin.000049

確認したら、マスターに戻って、ひとつ前のログファイルを削除するSQL文を実行。

mysql> purge master logs to 'mysqld-bin.000049';
Query OK,

もういちど、バイナリログの一覧を確認。

mysql> show master logs;
+-------------------+------------+
| Log_name          | File_size  |
+-------------------+------------+
| mysqld-bin.000049 | 1046327296 |
| mysqld-bin.000050 |     971625 |
+-------------------+------------+

これで、圧迫していたファイルが削除され、容量が確保できたので、障害自体の対応は、完了。

バイナリログを定期的に削除

今後、こういう事態にならないよう、定期的にメンテナンスするように設定。

MySQLのcnfファイルに以下の設定を加えます。

# vi /etc/my.cnf

[mysqld]
set-variable=expire_logs_days=14

バイナリ ログの自動削除の日数を指定する。 デフォルトは 0 で 「自動削除しない」 ことを意味する。MySQLサーバ起動時もしくは ログをローテートするときが、ログを削除するタイミングである。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.2.3 システム変数

設定したら、MySQLを再起動。

# /etc/init.d/mysqld restart
MySQL を停止中:                                            [  OK  ]
MySQL を起動中:                                            [  OK  ]

これで、14日間を超えた古いバイナリログは、定期的に削除されるようになりました。

補足

この設定では、スレーブがどのバイナリログを使っているかを確認しません。厳密にするなら、スレーブが現在使用しているバイナリログを確認してから削除するものを自分で作って、定期的に走らせてもいいかもしれません。

カテゴリー: サーバ・インフラのこと   タグ: , ,   この投稿のパーマリンク

トラックバック

MySQLで、レプリケーションの設定を行ったら、マスターのバイナリログのメンテナンス設定は、必ず行いましょう。 への1件のコメント

  1. ピンバック: MySQLの負荷分散の基本、レプリケーションの設定 « FlatLabs Blog

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>