mysql 1236主从复制不一致_记一次mysql主从同步因断电产生的不能同步问题 1236 and 1032...

背景:

项目新上线一个月,qa需要测试断电服务拉起,服务拉起成功后,发现mysql主从异常

f0e88991e4f0308e5da113fa7ad23acd.png

以下是发现的问题以及解决方案

问题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>start 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> start 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 440267874Couldnot 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

方法5:某dba推荐方案:

可以通过修改mysql的配置项进行解决。

1.修改binlog_format,目前默认的应该是STATEMENT,可以修改为MIXED

2.修改sync_binlog=1,按照事物刷新磁盘

3.修改innodb_flush_log_at_trx_commit=1,当前系统默认可能是1

修改完之后会降低系统的性能

fd87e194977aee7ce52bbf39bd82e9e7.png

总而言之 1032 error 只要想办法把主从数据同步就OK了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值