【Shell】fix 1032报错信息的脚本

 生产环境总会遇到由于各种原因导致的主从复制不一致的情况,导致slave出现 1032报错。为了使主从关系能够稳定的运行,大多时候可以选择修复1032 报错 ,先跳过去 ,然后使用 percona  的工具 pt-table-checksum 和 pt-table-sync 进行校验和修复 。 

修复1032 error的脚本如下:

#!/bin/sh

# fetch port 1032 error recored to /tmp/record.bashc.1032.$port

# parament port

if [ -z "$1" ] ; then

    PORT=3001

else

    PORT=$1

fi

tmpfile="/tmp/record.bashc.1032.$PORT"

touch $tmpfile

if [ -f $tmpfile ] ; then

    rm -f $tmpfile

fi

while true ; do

   mysql -uroot -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep -i Slave_SQL_Running | grep -i no > /dev/null

   if [ $? -eq 0 ] ; then

    # whether 1032 ?

    mysql -uroot -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep -i Last_SQL_Errno | grep -i 1032 > /dev/null

    if [ $? -eq 0 ] ; then

     table=$(mysql -uroot -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep Last_SQL_Error | awk -F 'on table ' '{print $2}' | awk -F ';' '{print $1}')

     grep "$table" $tmpfile > /dev/null

     if [ $? -eq 0 ] ; then

        echo "Error $table is already exists , can't record $tmpfile , Errorno 1032"

        mysql -h127.0.0.1 -P$PORT -Ae 'STOP SLAVE ; SET GLOBAL sql_slave_skip_counter = 1 ; SELECT SLEEP(0.1) ; START SLAVE'

     else

     echo "Error $table is not exists record it to $tmpfile Errorno 1032"

        echo $table >> $tmpfile

        mysql -uroot -h127.0.0.1 -P$PORT -Ae 'STOP SLAVE ; SET GLOBAL sql_slave_skip_counter = 1 ; SELECT SLEEP(0.1) ; START SLAVE'

          fi

        else

     echo "Error , is not 1032 error , please maunal fix , infor $(mysql -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep Last_SQL_Error)"

    fi

   else

      echo "IS OK , behind master : $(mysql -h127.0.0.1 -P$PORT -Ae 'SHOW SLAVE STATUS\G' | grep Seconds_Behind_Master | awk '{print $2}')"

   fi

   sleep 0.2

done

使用该脚本需要注意的是 sql_slave_skip_counter = 1 
该参数是跳过一个事务 ,是跳过一个事务,是 跳过一个事务,重要的事情说三遍,如果你的一个事务里面包含了多个dml操作 比如4个update,第二个update出现问题,使用该参数跳过的结果是 整个事务都会被跳过去,会导致数据不一致。
binlog为row模式:

master> select * from t;

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

| id | pid |

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

| 1 | 1 |

| 2 | 2 |

| 3 | 3 |

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

3 rows in set (0.00 sec)

slave> select * from t;

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

| id | pid |

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

| 1 | 1 |

| 3 | 3 |

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

2 rows in set (0.00 sec)

master> BEGIN;

Query OK, 0 rows affected (0.00 sec)

master> DELETE FROM t WHERE id = 1;

Query OK, 1 row affected (0.00 sec)

master> DELETE FROM t WHERE id = 2;

Query OK, 1 row affected (0.00 sec)

master> DELETE FROM t WHERE id = 3;

Query OK, 1 row affected (0.00 sec) 

master> COMMIT;

Query OK, 0 rows affected (0.01 sec)

slave> show slave status G

*************************** 1. row ***************************

...

Last_SQL_Errno: 1032

Last_SQL_Error: Could not execute Delete_rows event on table test.t; Can't find record in 't', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000002, end_log_pos 333

...

1 row in set (0.00 sec)

binlog为 statement格式

master> select * from t;

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

| id | pid |

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

| 4 | 1 |

| 6 | 3 |

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

2 rows in set (0.00 sec)

slave> select * from t;

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

| id | pid |

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

| 4 | 1 |

| 5 | 2 |

| 6 | 3 |

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

3 rows in set (0.00 sec)

master> BEGIN;

Query OK, 0 rows affected (0.00 sec)

master> delete from t where id = 4;

Query OK, 1 row affected (0.00 sec)

master> insert into t values (5,2);

Query OK, 1 row affected (0.00 sec)

master> delete from t where id = 6;

Query OK, 1 row affected (0.00 sec)

master> COMMIT;

Query OK, 0 rows affected (0.15 sec)

slave> show slave status G

*************************** 1. row ***************************

...

               Last_SQL_Errno: 1062

               Last_SQL_Error: Error 'Duplicate entry '5' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'insert into t values (5,2)'

...

1 row in set (0.00 sec)

slave> stop slave; set global sql_slave_skip_counter = 1; start slave;

Query OK, 0 rows affected (0.05 sec)

slave> select * from t;

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

| id | pid |

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

| 4 | 1 |

| 5 | 2 |

| 6 | 3 |

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

3 rows in set (0.00 sec)

所以修复1032之后务必使用上面提供的工具(当然如果你们的工作环境有更好的工具也可以) 修复数据不一致。
推荐一下关于sql_slave_skip_counter 的参考资料
[1] MySQL小误区:关于set global sql_slave_skip_counter=N 命令的一些点
[2] Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL

时间: 2024-12-23 21:32:48

【Shell】fix 1032报错信息的脚本的相关文章

java-编写易宝支付报错,报错信息看不懂,求大神

问题描述 编写易宝支付报错,报错信息看不懂,求大神 com.yeepay.merchant.InvalidParamException: invalid param, name[hmac] value[54ae8ae84065be5c1fb90bbd3e4e71cc] 这是报错的信息,根据网上一个易宝文档写的,运行后就这样了.求大神!! 解决方案 按照错误提示来说是,merchant的无效参数导致的. name[hmac] value[54ae8ae84065be5c1fb90bbd3e4e71

限制上传文件大小-Springmvc上传文件限制大小,异常处理返回报错信息后,eclipse控制台还报错

问题描述 Springmvc上传文件限制大小,异常处理返回报错信息后,eclipse控制台还报错 1.web.xml配置: <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/X

c#-C# Winfrom项目,运行程序一段时间后提示“内在不足”的报错信息。

问题描述 C# Winfrom项目,运行程序一段时间后提示"内在不足"的报错信息. 在C# Winfrom项目,有一个form窗体,六个Panel控件(用于放置显示监控视频图像的用户自定义控件), 还有一个timer计时器控件(设置每隔2分钟调用其它六个监控视频图像放到对应的Panel控件) 目前遇到的问题是,监控点的视频图像有的由于网络好点显示加载视频图像快点,有的由于网络不是太好加载显示视频图像慢点. 在form窗体运行一段时间后,导致这个form窗体的六个Panel控件在轮流显示

scalar-SQL @list临时变量 ,报错信息必须定义变量

问题描述 SQL @list临时变量 ,报错信息必须定义变量 declare @list table ( Id int, Name navarchar(12) ) insert into @list select * from tableA select * from @list --到这步都是OK的,能得到@list中的数据 --下面我想把@list与tableB表联接起来做查询 select * from @list,tableB where @list.id = tableB.id 结果报

apache-tomcat在myeclipse中一直是部署不起来,报错信息如下

问题描述 tomcat在myeclipse中一直是部署不起来,报错信息如下 Dec 19, 2015 7:45:47 PM org.apache.coyote.AbstractProtocol init SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"] java.net.BindException: Address already in use :8080 a

java报错信息如下,有人能帮忙解决是什么原因吗

问题描述 org.openqa.selenium.WebDriverException:Anunknownserver-sideerroroccurredwhileprocessingthecommand.(WARNING:Theserverdidnotprovideanystacktraceinformation)Commanddurationortimeout:35millisecondsBuildinfo:version:'2.42.2',revision:'6a6995d31c7c56c

java-如何看懂eclipse的报错信息

问题描述 如何看懂eclipse的报错信息 我现在都不怎么会看eclipse报错信息,一报错我就傻眼,满屏的提示信息,却没几句人话,不知道说了些啥,提示信息给出的类,一点进去全是jar包,根本不关我的事,求大神指教,怎么去看懂eclipse的报错啊 解决方案 随便找一个:http://bbs.csdn.net/topics/380209294 最重要的是,从上往下看(因为最上面的是调用最里层的函数),找到你的代码出异常的位置 另一个就是注意 XXXXException,这是异常,比如Cannot

mapreduce提交作业出现报错信息

问题描述 mapreduce提交作业出现报错信息 我最近采用这种方法提交作业,把mr作业的业务逻辑打包上传至hdfs中,在eclipse中提交任务(不安装hadoop插件),报错Error: java.io.IOException: Unable to initialize any output collector,如果把mr作业的业务逻辑打包上传至hdfs节点上,就可以顺利完成. 这是为什么? Configuration conf = new Configuration(); conf.set

logcat不停输出,无法看清报错信息,使用过滤器可以过滤,但是来不及看就消失了

问题描述 logcat不停输出,无法看清报错信息,使用过滤器可以过滤,但是来不及看就消失了 安卓开发调试程序时即使不运行所写程序logcat窗口也是一直输出,运行程序时也一直在不停输出.添加过滤器后可以过滤出信息,但是来不及看就消失了.请问这种情况该怎么处理?谢谢!!!! 解决方案 可以看一下这篇文章:http://blog.csdn.net/chenchudongsg/article/details/24664387 解决方案二: 你可以选择哪些类型的信息需要输出的,在logcat右上侧有一个