前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一次mysql主从同步因断电产生的不能同步问题 1236 and 1032

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

作者头像
房上的猫
发布2019-08-16 16:42:33
1.6K0
发布2019-08-16 16:42:33
举报
文章被收录于专栏:个人随笔个人随笔

背景:

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

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

问题1:

  Slave_IO_Running:  No 一方面原因是因为网络通信的问题也有可能是日志读取错误的问题。以下是日志出错问题的解决方案:

代码语言:javascript
复制
    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

代码语言:javascript
复制
 mysql> stop slave;

  到master机器执行

代码语言:javascript
复制
  mysql> show master status/G;

  可以看到:

    +-------------------+----------+--------------+----------------------------------+     | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB                                                                 |     +-------------------+----------+--------------+----------------------------------+     | mysqld-bin.000013 |      4 |              | information_schema,mysql |     +-------------------+----------+--------------+----------------------------------+

  日志为mysqld-bin.000013

  主机刷新日志

代码语言:javascript
复制
 mysql> flush logs;

   因为刷新日志file的位置会+1,即File变成为:mysqld-bin.000014

  接着切换到从机

代码语言:javascript
复制
 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

代码语言:javascript
复制
  mysql> stop slave;

    2.重置binlog 文件

代码语言:javascript
复制
 mysql> reset slave;

 mysql> reset master;  

    3.启动从机slave

代码语言:javascript
复制
mysql> stop slave; 

问题2:

  Slave_SQL_Running:  No  1.可能是在从库进行了写操作   2.从库重启后进行了事物回滚导致和主库数据不一致

代码语言:javascript
复制
  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下添加:

代码语言:javascript
复制
slave-skip-errors = 1032

 方法2,跳过上一次错误:

代码语言:javascript
复制
 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 来进一步过滤)

代码语言:javascript
复制
/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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景:
  • 问题1:
    •   解决方案:
    • 问题2:
      • 解决方案: 
        •  方法1,忽略所有1032错误,不推荐
        •  方法2,跳过上一次错误:
        •  方法3,利用end_log_pos还原数据,此方法需要停止master的写操作
        •   方法4,停止master的写操作后备份master数据到slave
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档