项目新上线一个月,qa需要测试断电服务拉起,服务拉起成功后,发现mysql主从异常
以下是发现的问题以及解决方案
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;
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
更改my.cnf文件,在Replication settings下添加:
slave-skip-errors = 1032
mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;
但是由于我们服务有好多秒级刷新的数据,所以导致跳过一个错误,又来一个错误
根据错误提示信息,用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了
总而言之 1032 error 只要想办法把主从数据同步就OK了