Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
9年以上前投稿 修正あり

MySQL 5.6でバイナリログへの書き込み失敗時にサーバを停止できるオプション

マスタでバイナリログの書き込みに失敗した場合、手動でスレーブを切り離しマスタスレーブ間の整合性をとる必要があったが、MySQL 5.6.20で登場したbinlog\_error\_action変数の設定によって、バイナリログ書き込みと同時にサーバを停止できるようになった。この機能についての概要と、挙動について解説する。

原文
New Option to Stop the Server If Binlogging Fails in MySQL 5.6 | MySQL Server Blog (English)
翻訳依頼者
D98ee74ffe0fafbdc83b23907dda3665
翻訳者
D98ee74ffe0fafbdc83b23907dda3665 doublemarket
原著者への翻訳報告
未報告


免責事項

この記事は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;

ファイルシステムがリードオンリーになった際のオプションの動作デモ

  1. SET GLOBAL binlog_error_action=ABORT_SERVER;
  2. ファイルシステムをリードオンリーにする
  3. ログをフラッシュする

ファイルシステムがリードオンリーになった時の動作

まとめ

mysqldがバイナリログへの書き込み出来ないようになってしまうようなエラーが起きた時、従来の動作だと、バイナリログへの書き込みは無効になる一方でサーバは通常の動作を続ける、というものだった。しかし今回導入されたbinlog_error_actionサーバオプションにより、バイナリログに問題が発生した時にエラーを無視するか(IGNORE_ERROR)、サーバを停止するか(ABORT_SERVER)をユーザが選べるようになった。この動作は、最初はMySQL 5.6.20binlogging_impossible_modeオプションとして登場した。しかしそのオプション名はMySQL 5.6.22で非推奨となり、現在ではbinlog_error_actionになっている。

この機能についてのフィードバックをお待ちしている。疑問があったりバグを発見したりした際には、サポートチケットをオープンするか、バグを報告して欲しい。そして、MySQLを使ってくれてどうもありがとう

次の記事
Redis作者Salvatore Sanfilippo氏へのインタビュー : シチリア島から才能と情熱を
前の記事
MySQLのレプリケーションでありがちな10の問題

Feed small 記事フィード

新着記事Twitterアカウント