【MySQL】【复制】利用slave_exec_mode处理复制过程中出现的1062与1032错误

背景:

? 今天张师兄在群里问了主从之间出现1032错误后,使用pt-slave-restart跳过后又出现了1062错误,该如何快速处理。

问题解析:

? 1032错误:主库传递过来的binlog中包含了删除某些数据的语句,但在从库中部分数据或者全部这些数据被提前手工删除了,或者根本就不存在。

? 1062错误:主库传递过来的binlog中包含了更新(或插入)某些数据的语句,但在从库中部分数据已经存在,或者被其他的数据占据了唯一性索引的入口。

? 问题出在binlog重放时是以一个事务作为一个原子单位进行重放。正如原子中是由三个夸克组成一样,一个事务一般也会由若干个event组成。一个event视为一条语句。

? 若主库传过来一个包含删除三行数据(r1,r2,r3)的事务,但在从库中只有两个个对应的行(r1,r2)。

begin;
delete from t1 where row=r3; #假设row列为唯一性索引
delete from t1 where row=r2;
delete from t1 where row=r1;
commit;

? 那么当执行第一条的时候,从库就会报1032 delete a not exist row错误。使用Pt-slave-restart --error-numbers=1032 就会把这整个事务都跳过去,导致后面的r1,r2行都没有被删除。下一次若从主库传来

begin;
insert into t1(row) values(r1,r2)
commit;

? 那么从库执行插入的时候肯定会报1062 duplicate entry错误。

问题处理:

方法一:

? 使用Pt-table-sync进行主从数据同步,但是在双主条件或者主库相关表不停的更新的状况下,这种数据同步会导致比较致命的数据混乱。

方法二:

? 使用slave_exec_mode参数。

? 先看下官方手册描述:

参数名称: slave_exec_mode
变量范围: 全局
动态修改:
默认值: NDB集群默认IDEMPOTENT,其他模式STRICT
有效值: STRICT/IDEMPOTENT
设置方式: SET GLOBAL slave_exec_mode = ‘IDEMPOTENT‘

? Controls how a slave thread resolves conflicts and errors during replication. IDEMPOTENT mode
causes suppression of duplicate-key and no-key-found errors; STRICT means no such suppression
takes place.
IDEMPOTENT mode is intended for use in multi-master replication, circular replication, and some
other special replication scenarios for NDB Cluster Replication

? 此参数最初作为在NDB模式中被引进,后来在多主和环形复制都有用武之地。主要的作用就是在slave_exec_mode=‘IDEMPOTENT时,slave会忽略在插入时的遇到重复的唯一性索引节点和删除时的未发现对应记录的复制错误即1062和1032。但是,当从库从 主库接收到了一条尝试update一条自己不存在的记录时还是会报错1032。

? 问题到此就很简单了,应进行如下步骤:

stop slave;
SET GLOBAL  slave_exec_mode = ‘IDEMPOTENT‘
start slave;

? 再次show slave status\G 应该可以看到从库的复制SQL线程已经恢复正常。

? 但是这毕竟是非常规手段,在执行完后且主从一致后,应抽空进行数据校验。且不推荐作为默认参数直接打开。

附:

5.7.0以后可以将idempotent作为mysqld启动参数调用,即:mysqld --defaults-file =my.cnf --indempotent& 当然,也可以将其写入my.cnf中。

? --idempotent
Tell the MySQL Server to use idempotent mode while processing updates; this causes suppression
of any duplicate-key or key-not-found errors that the server encounters in the current session while
processing updates. This option may prove useful whenever it is desirable or necessary to replay
one or more binary logs to a MySQL Server which may not contain all of the data to which the logs
refer.
The scope of effect for this option includes the current mysqlbinlog client and session only.
The --idempotent option was introduced in MySQL 5.7.0.

5.7.1以后可以引入了此参数的会话级别版 rbr_exec_mode,只对当前会话生效,且限制行复制模式。

? rbr_exec_mode
This variable switches the server between IDEMPOTENT mode and STRICT mode. IDEMPOTENT
mode causes suppression of duplicate-key and no-key-found errors. This mode is useful when
replaying a row-based binary log on a server that causes conflicts with existing data. mysqlbinlog
uses this mode when you set the --idempotent option by writing the following to the output:
SET SESSION RBR_EXEC_MODE=IDEMPOTENT;

原文地址:http://blog.51cto.com/l0vesql/2067914

时间: 2024-08-12 22:32:26

【MySQL】【复制】利用slave_exec_mode处理复制过程中出现的1062与1032错误的相关文章

MySQL 5.1安装和配置过程中遇到的问题

由于工作学习的需要,所以在公司的电脑上安装MySQL.安装过程很顺利,注意安装路径和数据保存路径在一个disk中.MySQL配置就没有那么幸运,中间出现各种问题,折腾了将近一天才解决问题成功登陆和使用MySQL.此文主要针对个人在安装配置过程中遇到的问题进行整理,期间借鉴和使用了网上各种解决方案,整理的解决方案是适用于本人的,本着学习的态度,如有雷同还请原谅. 安装环境 系统:win7,64位 安装包:MySQL 5.1 msi文件,64位 安装路径:C:\Program Files\MySQL

mysql/mariadb主从复制架构配置及过程中出现的问题

两台CentOS7系虚拟主机:分别是:主服务器172.16.75.1,从服务器172.16.75.2使用的是mariadb-5.5.56,即centOS自带的软件版本为了使实验结果显示精准,此处关闭两台服务器的防火墙和SELinux:[[email protected] ~]# setenforce 0[[email protected] ~]# iptables -F 一.首先在主服务器172.16.75.1上配置:在/etc/my.cnf中配置如下:[mysqld]###定义二进制日志的存放

复制中常见1062和1032错误处理方法

复制中错误处理 传统复制错误跳过: stop slave sql_thread ; set global slq_slave_skip_counter=1; start slave sql_thread ; GTID复制错误跳过: stop slave sql_thread ; set gtid_next='uuid:N'; begin;commit; set gtid_next='automatic'; start slave sql_thread ; 注意: 若是binlog+pos复制,使

java连接mysql数据库8.0以上版本过程中遇到的坑

来自:https://blog.csdn.net/u013276277/article/details/80255468 首先,我居然不能用navicat客户端连接上mysql8.0数据库报1251错误,这个的解决方式已经在我的上一篇博客中解决了.然后我又遇到了java无法连接mysql数据库8.0的问题. 报错:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysq

selenium使用过程中遇到的“element not visiable”错误

今天在做项目的页面自动化时遇到了一个问题,现在把它以及解决方法记录下来. 背景流程:打开一个网页,在页面上字段填了内容,然后点击取消按键1,会跳出一个对话框,对话框里有取消按键2和确定按键2.就是在点击取消按键2时,程序报元素不可见错误. 当时看到这个错误时,我就注意了这个不是元素找不到错误,也就是说我定位到了元素,但是因为某种原因它隐藏了,展示不了. 我的第一个年头就是看看页面上这个对话框是不是放在ifream里,结果发现不是. 不过在这个过程里,我发现这个对话框在点击取消按键1之前是隐藏的,

ios 编译过程中碰到std::ios_base::Init::~Init()错误的问题解决方法

转载自:http://wicrewoft.blog.51cto.com/210706/1236005 原作者:范国锋 标签:libstdc++.6.dylib 如果遇到下面这个问题是因为引用的c++库不正确导致,xcode 6.1版本需要引用 libstdc++.6.dylib才能解决问题. Undefined symbols for architecture armv6:"std::ios_base::Init::~Init()", referenced from:  ___tcf_

Keil5调试过程中遇到的一些警告和错误

最近用keil5调试代码出了一些警告与错误,整理如下: 1.warning: #1295-D: Deprecated declaration run_c - give arg types void run_c();//原函数 void run_c(void);//改正后 对比前面声明的函数,发现是括号少了一个void,因为我的函数是不带参的,不加void会有警告的,往括号里加了void之后,重新编译之后警告消失. 2.warning: #940-D: missing return stateme

Kubernetes集群搭建过程中遇到的问题

1. 创建Nginx Pod过程中报如下错误: #kubectlcreate -f nginx-pod.yaml Error from server: error when creating "nginx-pod.yaml": Pod "nginx" is forbidden: no API token found for service account default/default, retry after the token is automatically

Hihocoder #1121 二分图一?二分图判定( bfs或者dfs搜索实现 搜索的过程中进行 节点标记 *【模板】)

对于拿到的相亲情况表,我们不妨将其转化成一个图.将每一个人作为一个点(编号1..N),若两个人之间有一场相亲,则在对应的点之间连接一条无向边.(如下图) 因为相亲总是在男女之间进行的,所以每一条边的两边对应的人总是不同性别.假设表示男性的节点染成白色,女性的节点染色黑色.对于得到的无向图来说,即每一条边的两端一定是一白一黑.如果存在一条边两端同为白色或者黑色,则表示这一条边所表示的记录有误. 由于我们并不知道每个人的性别,我们的问题就转化为判定是否存在一个合理的染色方案,使得我们所建立的无向图满