天天看點

記一次mysql主從同步因斷電産生的不能同步問題 1236 1032

背景:

  項目新上線一個月,qa需要測試斷電服務拉起,服務拉起成功後,發現mysql主從異常,以下是發現的問題以及解決方案

問題1:

  Slave_IO_Running:  No 一方面原因是因為網絡通信的問題也有可能是日志讀取錯誤的問題。以下是日志出錯問題的解決方案:

    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'

  解決方案:

  第一步停止從機slave

    mysql> stop slave;

  到master機器執行

    mysql> show master status/G;

  可以看到:

    +-------------------+----------+--------------+-------------------------------------------+

    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB                                                                            |

    +-------------------+----------+--------------+-------------------------------------------+

    | mysqld-bin.000013 |      4 |              | information_schema,mysql |

    +-------------------+----------+--------------+-------------------------------------------+

  日志為mysqld-bin.000013

  主機重新整理日志

    mysql> flush logs;

   因為重新整理日志file的位置會+1,即File變成為:mysqld-bin.000014

  接着切換到從機

    mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000014',MASTER_LOG_POS=4;

    mysql> stop slave;

    mysql> show slave status\G;     

 以上為解決方案,可百分之九十解決mysql 1236 error ,當然還有百分之十解決不了,還有個簡單粗暴的方法

    1.重新開機停止slave

      mysql> stop slave;

    2.重置binlog 檔案

      mysql> reset slave;

      mysql> reset master;    

    3.啟動從機slave

      mysql> stop slave;        

問題2:

  Slave_SQL_Running:  No  1.可能是在從庫進行了寫操作   2.從庫重新開機後進行了事物復原導緻和主庫資料不一緻

  Last_SQL_Error: Worker 3 failed executing transaction '' at master log mysql-bin.000013, end_log_pos 440267874        

   Could not execute Delete_rows event on table db_test.tbuservcbgolog; Can't find record in 'tbuservcbgolog', Error_code: 1032  

   handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.0000013, end_log_pos 440267874

  方法1,忽略所有1032錯誤,不推薦

    更改my.cnf檔案,在Replication settings下添加:

     slave-skip-errors = 1032

    

  方法2,跳過上一次錯誤:

    mysql> stop slave ;

    mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

    mysql> start slave ;

  但是由于我們服務有好多秒級重新整理的資料,是以導緻跳過一個錯誤,又來一個錯誤

  方法3,利用end_log_pos還原資料,此方法需要停止master的寫操作

    根據錯誤提示資訊,用mysqlbinlog找到該條資料event SQL并逆向手動執行。如delete 改成insert。

    本例中,此事件在主伺服器Master binlog中的位置是 mysql-bin.000013, end_log_pos 440267874。

    1)利用mysqlbinlog工具找出440267874的事件

      ( 可以加上參數-d, --database=name 來進一步過濾)

/usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000013 |grep -A 20 '440267874'

或者/usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000013 --stop-position=440267874 | tail -20

或者usr/local/mysql-5.6.30/bin/mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000013 > decode.log
      

     将查詢出來的語句進行反轉執行即可,然後啟動slave就ok了

  方法4,停止master的寫操作後備份master資料到slave