mysqlのレプリケーションを使う(5) エラー1236の対処
以前に
で、mysqlのレプリケーション(replication) のエラー対処について記事にしました。
今回は、そのmysqlのレプリケーションでエラー1236でストップしたときの対処についてです。
今回は、マスター側サーバーで何かしらの問題が発生し、システムリブートなどが発生した場合によく起こるエラー1236の対処について考えてみたいと思います。
レプリケーション(replication)とは、
直訳のとおり
複製を意味します。(レプリカ(replica)と語源は一緒なので、こちらがピンとくるかもしれません)
mysqlでレプリケーションと言うと、マスター、スレーブのそれぞれのmysqlサーバーを構築することに他なりません。
マスター1台に対して、スレーブ複数台というのが一般的なmysqlサーバーの構成になります。
一般的には、マスター mysql サーバー でデータベースの更新処理(書き込み)を受け持ち、スレーブ側で参照処理(読み込み)を受け持つことで負荷を分散させたり、バックアップデータベースを作成するなど行うことができます。
上の図は、その典型的なレプリケーションの例を示したものです。
ユーザは、1台のサーバーにアクセスしているつもりですが、実際のデータベースへの書き込み処理は、バックにあるマスターサーバー側で処理され、データベースの読み込み処理は、フロントのスレーブサーバーで処理されます。
特に参照がメインのサーバーでは、かなりの負荷分散が期待されます。
エラー1236の意味
エラー1236が発生しているかどうかは、スレーブ側の状態確認で以下のように表示されます。
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: xxx.xxx.xxx.xxx
Master_User: slave-user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: bin-log.000001
Read_Master_Log_Pos: 394
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 537
Relay_Master_Log_File: bin-log.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 394
Relay_Log_Space: 693
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position'
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
|
この Error 1236 は、英文からして、
バイナリログからデータを読み込む際にマスターデータベースから致命的なエラー1236を受信した:”クライアントデータベースは、不可能な位置からレプリケーションを開始するようにマスターデータベースへ要求した。”
という感じの直訳になりますかね!?
つまり、Error 1236は、
スレーブ側からマスターの情報読み出しを行ったが、マスター側にないようなデータベースの位置情報を元に読み込もうとした・・・
ということになります。
レプリケーションは、スレーブ側に
スレーブ側のデータベースが、マスターのデータベースのどの時点まで情報と一致させているか(データベースの位置情報)
を管理しています。
その情報に基づいて、スレーブ側は、追加の更新情報を要求します。そのときのキー情報が、データベースの位置情報情報になるわけですが、
マスター側は、
そんな位置情報のデータはないよ
とエラーを返信してきたということなんですね。
データ不一致に違いはないのですが、スレーブ側のみのデータ更新でのエラーは、Error 1062 が出力されるはずですから、原因は異なります。(参照「mysqlのレプリケーションを使う(3) エラー1062の対処」)
この Error 1236 が出るのは、
- スレーブ側の立ち上げの際に、データベースの位置情報の設定に誤りがあった場合
- マスター側で何らかの要因で、データベースのログ情報を破棄してしまった場合
が考えられます。
前者は、「mysqlのレプリケーションを使う」でレプリケーションの初期設定を正しく行えばOKですね。
後者は、マスター側で何の障害が発生したか確認し、その要因や状況によって、マスター側を再設定する必要があるでしょう。
マスター側の再設定を行った場合は、
「mysqlのレプリケーションを使う」の手順でスレーブ側も再設定する必要があります。
しかし、ほとんどの場合は、単純にシステムのリブートなどデータベースに関連した障害でないことが多いでしょう。
その場合は、スレーブ側をマスター側に合わせるだけでOKです。
そのスレーブ側をマスター側に合わせるだけの手順は、以下のとおりです。
- マスターデータベースでデータベースの状態を確認しておきます。
mysql> SHOW MASTER STATUS;
+----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| bin-log.000001 | 901 | | |
+----------------+----------+--------------+------------------+
1 row in set (0.00 sec)
|
- スレーブデータベースのマスター側の読み込み位置を変更します。
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx', MASTER_LOG_FILE='bin-log.000001', MASTER_LOG_POS=901;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: xxx.xxx.xxx.xxx
Master_User: slave-user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: bin-log.000001
Read_Master_Log_Pos: 901
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 249
Relay_Master_Log_File: bin-log.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 901
Relay_Log_Space: 405
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
ERROR:
No query specified
|
これだけです。
やるのは、
CHANGE MASTERでスレーブデータベースのマスター側の読み込み位置を変更することだけです。
簡単なんですけど、最初にエラーが発生した場合、どうやれば良いかわかりませんから、あたふたしちゃいますよね。
落ち着いて考えれば、なんてこと無いことも多いものです。
1062のエラー対処でも、スキップさせる方法を紹介していましたが、
エラーを無視するだけなら、
my.conf ( [mysqld]セクション )に
slave-skip-errors = 1236
を追記して、MySQLをリスタートすれば、すべての1236エラーは無視されます。
ただ、これは、原因がマスター側にある場合が多いので、スキップせずにちゃんと確認した方が良いです。当たり前ですけど。。。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :