2012年12月25日火曜日

CHANGE MASTER TO

久々にkagoya vpsのテスト環境にログインしてみたら・・・mysqlがとまっとる!!!
何か少し前にサーバーの再起動を行います的なメールが来ていたので、
その影響で止まっていたのかな?

早速、起動を試した際におきた問題の話です:(;゙゚'ω゚'):

masterは簡単に起動できたのですが、
slave側で起動後にslave startを実行してみたらエラーになってしまいました。

エラー内容は次のような内容になっていました。
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: ***********
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000010
          Read_Master_Log_Pos: 218
               Relay_Log_File: mysql-relay-bin.000006
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000010
             Slave_IO_Running: No
            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: 218
              Relay_Log_Space: 214
              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: NULL
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: 'Could not find first log file name in binary log index file'
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 10
1 row in set (0.00 sec)
バイナリーログがなんちゃら~と出ているので、バイナリーログを確認してみることに。
masterのバイナリーログの状態の確認をしてみる。
現在のmasterのバイナリーログの状態は、次のようになっていました。
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 |      107 |              |                  |
+------------------+----------+--------------+------------------+
ただし、先程のslave側の情報を見る限りだと、
*************************** 1. row ***************************
              Master_Log_File: mysql-bin.000010
          Read_Master_Log_Pos: 218
               Relay_Log_File: mysql-relay-bin.000006
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000010
と、なっているため、slave側はまだ一つ前のバイナリーログを必要としているみたいでした。
slave側ではまだI/Oスレッドがmysql-bin.000010を必要としている?
なので、master側にそのバイナリーログがあるか確認してみることに。
# ls -alt /var/lib/mysql/
合計 28772
drwxr-xr-x  6 mysql mysql     4096 12月 21 11:38 2012 .
-rw-rw----  1 mysql mysql      107 12月 21 11:38 2012 mysql-bin.000011
-rw-rw----  1 mysql mysql       19 12月 21 11:38 2012 mysql-bin.index
-rw-rw----  1 mysql root     15348 12月 21 11:38 2012 mysql-error.log
drwxr-xr-x 17 root  root      4096  9月 28 02:12 2012 ..
無いだと!?・・・:(;゙゚'ω゚'):

ということは、slaveが必要としているバイナリーログがmaster側にないために 為にエラーが出ている感じかな?

恐らく今回の現象的には、master,slaveのサーバーが再起動されたタイミングで、
mysqlが停止され、そのまま数日放置しておいたため、バイナリーログの保存期間を超えてしまったために、
master側を起動した際にログローテートされたタイミングで?mysql-bin.000010が削除されてしまい、
その後に、slaveを起動したことで、slave側はmasterのmysql-bin.000010必要としていたけど、
なくなってしまったことでエラーが発生ということですかね・・・?:(;゙゚'ω゚'):

Google先生に聞いてみたところ、次のような記述を見つけました。

MySQL5.6のmysqlbinlogコマンド
コピーするバイナリログがコピー元サーバから削除されている場合(expire_logs_daysやpurge master logs to等で)はエラーとなります。 ERROR: Got error reading packet from server: Could not find first log file name in binary log index file

ということなので、直すにはコピーするバイナリーログを変更してあげれば(・∀・)イイ!!
先程確認したmasterのバイナリーログの設定情報を元に、
slaveの設定を行います

#マスターのバイナリーログの情報(masterサーバーで実行する)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 |      107 |              |                  |
+------------------+----------+--------------+------------------+

#ここから下はslave側で実行する。

#slaveの同期停止
mysql> STOP SLAVE; 
Query OK, 0 rows affected (0.00 sec) 

#masterのバイナリーログの情報を設定する
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=107;
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: *********
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000011
          Read_Master_Log_Pos: 107
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000011
             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: 107
              Relay_Log_Space: 409
              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:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 10
1 row in set (0.00 sec)
キタ――(゚∀゚)――!!
おまけですが、この復旧を行っている際に、
CHANGE MASTER TOで、 MASTER_LOG_POSを指定せずに実行し、slaveを起動したところ、次のようならエラーが出ていました。
Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'mysql-bin.000011' at 218, the last event read from './mysql-bin.000011' at 4, the last byte read from './mysql-bin.000011' at 4.'
このエラーはちゃんとmasterのpositionを指定し直した解消されました。
またもう一つ、slave stopせずにCHANGE MASTER TOを実行したら、
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=107;
ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first
というエラーも出てしました:(;゙゚'ω゚'):
CHANGE MASTER TOはslave stopを実行してからやりましょうね( ̄ー+ ̄)キラリってことですね!

他のやり方として、
http://server-setting.info/centos/mysql_replication_1236_error.html
1062のエラー対処でも、スキップさせる方法を紹介していましたが、
エラーを無視するだけなら、
my.conf ( [mysqld]セクション )に
slave-skip-errors = 1236
を追記して、MySQLをリスタートすれば、すべての1236エラーは無視されます。
ただ、これは、原因がマスター側にある場合が多いので、スキップせずにちゃんと確認した方が良いです。当たり前ですけど。。。
というやり方もあるそうです(`・ω・´)ゞビシッ!!


参考URL

0 件のコメント:

コメントを投稿