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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
 生产环境总会遇到由于各种原因导致的主从复制不一致的情况,导致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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
79 32
|
1天前
|
JavaScript Shell C#
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
30 1
|
5月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
155 1
|
4月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
115 2
6种方法打造出色的Shell脚本
|
4月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
146 1
|
4月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
144 2
|
5月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
104 6
|
4月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
5月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
110 12
|
5月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
144 2