免責事項
この記事はMySQL Server Blogの投稿をユーザが翻訳したものであり、Oracle公式の文書ではありません。
この記事では新しくMySQLサーバのオプションになったbinlog_error_actionについて説明しようと思う。このオプションは、MySQL 5.6.22以降で使用可能だ。
背景
MySQLのレプリケーション機能の一部として、マスタ上で実行されたデータの変更は全てバイナリログに記録され、それをスレーブに送る事でスレーブで処理が再生される。mysqldがバイナリログへ書き込むのを妨げるようなエラー(ディスクフルやファイルシステムがリードオンリーになってしまうなど)が発生すると、ログへの書き込みは単に無効化され、マスタでの処理は継続されてしまう。こういったエラーは、バイナリログのローテーションやバイナリログファイルを開く際に主に発生する。
しかし、このような問題はレプリケーショングループ内での深刻なデータ損失を起こす可能性がある。本番環境のマスタでこの類の障害が起こると、配下の全てのスレーブにおいてレプリケーションイベントの受信が止まってしまう。コミット済みのトランザクションをバイナリログイベントとしてマスタが保存しないので、結果的にレプリケーションクライアントへ送るバイナリログには何の新しいイベントも存在しない事になってしまう。その後にマスタがダウンしてしまうと、バイナリログが無効になっていた間に実行された全てのトランザクションは、永遠に失われてしまう。これは、同期されていないスレーブや、正しくないバックアップデータが出来てしまう原因になる。
ファイルシステムがリードオンリーになった時のエラーメッセージ
バグ#51014の修正の一環で、binlog_error_actionサーバオプションが導入された。このオプションを使うと、エラーを無視する(同GAリリースでの動作の違いがないようにこちらがデフォルト)か、サーバを停止するかを選択できるようになる。IGNORE_OPTION
は(前述の)デフォルト動作を意味しており、(マスタ障害時は)バイナリログが単に無効にされるだけで、マスタは通常の動作を続ける。
mysql> SHOW GLOBAL VARIABLES LIKE 'binlog_error_action';
+---------------------+--------------+
| Variable_name | Value |
+---------------------+--------------+
| binlog_error_action | IGNORE_ERROR |
+---------------------+--------------+
1 row in set (0.00 sec)
一方、ABORT_SERVER
を設定している時は、バイナリログに対する処理が失敗した場合にはサーバが停止する。サーバの停止時には、致命的エラーがクライアントにプッシュされ、その後サーバはシャットダウンする。その際のエラーは以下のようになる。
Error code: ER_BINLOG_LOGGING_IMPOSSIBLE
Error message: Binary logging not possible. Either disk is full or file system is read only while rotating the binlog. Aborting the server
オプションの設定方法
このオプションは、スタートアップオプションとして(コマンドライン及び設定ファイルどちらも可)、あるいはSETコマンドを使ってオンラインで動的に設定する事が出来る。
mysql> SET GLOBAL binlog_error_action=ABORT_SERVER;
ファイルシステムがリードオンリーになった際のオプションの動作デモ
SET GLOBAL binlog_error_action=ABORT_SERVER;
- ファイルシステムをリードオンリーにする
- ログをフラッシュする
まとめ
mysqldがバイナリログへの書き込み出来ないようになってしまうようなエラーが起きた時、従来の動作だと、バイナリログへの書き込みは無効になる一方でサーバは通常の動作を続ける、というものだった。しかし今回導入されたbinlog_error_actionサーバオプションにより、バイナリログに問題が発生した時にエラーを無視するか(IGNORE_ERROR
)、サーバを停止するか(ABORT_SERVER
)をユーザが選べるようになった。この動作は、最初はMySQL 5.6.20でbinlogging_impossible_modeオプションとして登場した。しかしそのオプション名はMySQL 5.6.22で非推奨となり、現在ではbinlog_error_actionになっている。
この機能についてのフィードバックをお待ちしている。疑問があったりバグを発見したりした際には、サポートチケットをオープンするか、バグを報告して欲しい。そして、MySQLを使ってくれてどうもありがとう!