背景:
項目新上線一個月,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