MySQL跳过复制错误

在MySQL中,有两种跳过复制错误的方法:
1、对于未使用GTID的复制,可以使用sql_slave_skip_counter来跳过错误
2、对于使用GTID的复制,可以使用GTID_NEXT模拟空事务来跳过错误

================================================
使用sql_slave_skip_counter跳过错误

对于set global sql_slave_skip_counter=N
1>N代表N个event
2>当N=1时,代表跳过下一个事务,无论下一个事务包含多少event
3>当N>1时,代表启动复制后,从当前位置跳过N个event,每跳过一个event,进行N--操作,如果最终跳到一个事务中,则跳过该事务进行复制。

在binlog中上命令以event的形式存在,但由于存储引擎和binlog日志格式的不同,一条命令可能被解析成一个或N个event。
如对于Innodb存储引擎+STATEMENT日志格式,由于支持事务,会有begin和commit事件。
而对于MyISAM存储引擎+STATEMENT日志格式,由于不考虑事务,则不会有begin和commit事件。

## 停止slave进程
STOP SLAVE;

## 跳过N个复制事件
set global sql_slave_skip_counter=N

## 启动slave进程
START SLAVE;

## 查看复制进度
SHOW SLAVE STATUS \G

================================================
使用GTID_NEXT模拟空事务跳过错误

对于使用GTID复制,当在从库上执行主库传递过来的BINLOG时,会先判断根据GTID该事务是否已在从库上执行过。
可以通过在从库上模拟生成空事务,来跳过主库传递来的事务,从而跳过错误。

## 停止slave进程
STOP SLAVE;

## 使用空事务跳过指定GTID
SET GTID_NEXT= ‘e0a86c29-f20d-11e8-93c2-04b0e7954a65:104934‘;
BEGIN; COMMIT;

## 设置GTID自动增长
SET SESSION GTID_NEXT = AUTOMATIC;

## 启动slave进程
START SLAVE;

## 查看复制进度
SHOW SLAVE STATUS \G

如果需要跳过一批GTID,可以使用下面脚本来生成脚本:

import os

script_file = "./skip_file.sql"

def write_script(script_content):
    file_handle = open(script_file, ‘a+‘)
    file_handle.writelines(script_content + "\n")
    file_handle.close()

def delete_script_file():
    if os.path.exists(script_file):
        os.remove(script_file)

def get_skip_script_list(master_uuid, start_tran_id, end_tran_id):
    script_list = []
    current_tran_id = start_tran_id
    while current_tran_id <= end_tran_id:
        current_script = """
SET @@SESSION.GTID_NEXT= ‘{master_uuid}:{tran_id}‘;
BEGIN; COMMIT;
""".format(
            master_uuid=master_uuid,
            tran_id=current_tran_id
        )
        current_tran_id = current_tran_id + 1
        script_list.append(current_script)
    script_list.append("SET SESSION GTID_NEXT = AUTOMATIC;")
    return script_list

def main():
    master_uuid = "e0a86c29-f20d-11e8-93c2-04b0e7954a65"
    start_tran_id = 104935
    end_tran_id = 105007
    script_list = get_skip_script_list(master_uuid, start_tran_id, end_tran_id)
    write_script("\n".join(script_list))

if __name__ == ‘__main__‘:
    main()

生成结果如下:

SET @@SESSION.GTID_NEXT= ‘e0a86c29-f20d-11e8-93c2-04b0e7954a65:104935‘;
BEGIN; COMMIT;
...
SET @@SESSION.GTID_NEXT= ‘e0a86c29-f20d-11e8-93c2-04b0e7954a65:105007‘;
BEGIN; COMMIT;

SET SESSION GTID_NEXT = AUTOMATIC;

PS: 跳过事务后一定要执行命令“SET SESSION GTID_NEXT = AUTOMATIC”

原文地址:https://www.cnblogs.com/gaogao67/p/10494487.html

时间: 2024-08-04 17:54:25

MySQL跳过复制错误的相关文章

MySQL跳过主从错误工具(mysqlha_skiperror.sh)

工具名称:mysqlha_skiperror.sh 工具用途:用于MySQL跳过主从错误 工具参数:options: -P port   指定端口                   -N number   指定跳过错误次数  不指定默认为10次(如果不知道可以设置大一些,会记录log) -C      error code  Take ,  as the separator  指定跳过错误的状态码 可以跳过多个以,分隔 工具示例: mysqlha_skiperror.sh -P 4444 -C

Mysql高可用复制原理及主从实例测试解析

一.Mysql复制简介 使用mysql复制功能可以将主数据的数据复制到多台从服务器上.默认情况下,采用异步传输方式,数据复制可以在各种不同的网路环境中进行.主从复制技术在企业生产中得到了广泛应用,它避免了数据库的单点故障,当一台服务器宕机,其他服务器一样可以提供稳定可靠的数据服务. 1 mysql 复制原理 Mysql复制功能是将数据分布在多个系统上,这种机制是通过将Mysql的某一台服务器(master)的数据复制到其它服务器(slaves)上来实现的.复制过程中一个服务器充当主服务器,而一个

详解MySQL双活同步复制四种解决方案

目录 基于MySQL原生复制主主同步方案 基于Galera replication方案 基于Group Replication方案 基于canal方案 对于数据实时同步,其核心是需要基于日志来实现,是可以实现准实时的数据同步,基于日志实现不会要求数据库本身在设计和实现中带来任何额外的约束. 基于MySQL原生复制主主同步方案  这是常见的方案,一般来说,中小型规模的时候,采用这种架构是最省事的. 两个节点可以采用简单的双主模式,并且使用专线连接,在master_A节点发生故障后,应用连接快速切换

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

背景: ? 今天张师兄在群里问了主从之间出现1032错误后,使用pt-slave-restart跳过后又出现了1062错误,该如何快速处理. 问题解析: ? 1032错误:主库传递过来的binlog中包含了删除某些数据的语句,但在从库中部分数据或者全部这些数据被提前手工删除了,或者根本就不存在. ? 1062错误:主库传递过来的binlog中包含了更新(或插入)某些数据的语句,但在从库中部分数据已经存在,或者被其他的数据占据了唯一性索引的入口. ? 问题出在binlog重放时是以一个事务作为一个

复制错误跳过

关于复制错误跳过建议: 不建议跳过,会造成以后数据可能越来越不一致. 假设数据库经常发生不一致,然后经常使用跳过的方法修复的话,说明主从数据可能不一致了,必须赶紧校验主从数据,最好的方法是补数据. 单个复制 binlog+position stop slave sql_thread; set global sql_slave_skip_counter=1; start slave sql_thread; GTID stop slave sql_thread; set gtid_next='uui

MySQL学习笔记10复制错误处理(一)表已存在的问题

(1)错误情况 在slave上已经有数据表test,而master上并没有这张表,现在在master上新建test表,则slave上的复制过程会出错. MySQL的log记录中相关信息如下: 2017-08-15T04:24:30.337730Z 11 [ERROR] Slave SQL for channel '': Error 'Table 'test' already exists' on query. Default database: 'test'. Query: 'create ta

MySQL学习笔记11复制错误处理(二)删除不存在的行的问题

(1)问题情况 在master上删除某个数据表的某一行,而该行在slave上并不存在,则slave上的复制过程会出错. MySQL的log文件中发现如下错误信息: 2017-08-15T04:52:19.529509Z 13 [ERROR] Slave SQL for channel '': Could not execute Delete_rows event on table test.test; Can't find record in 'test', Error_code: 1032;

MySQL复制错误1837的相关缺陷一例

故障现象 主从gtid报错,复制错误1837,这个复制故障可以说是第一次遇到. Last_Errno: 1837 Last_Error: Error 'When @@SESSION.GTID_NEXT is set to a GTID, you must explicitly set it to a different value after a COMMIT or ROLLBACK. Please check GTID_NEXT variable manual page for detaile

mysql数据库同步跳过临时错误[转]

mysql数据库同步跳过临时错误slave stop;set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;slave start; 几个跟热备有关的mysql命令:(需要在mysql命令行界面或query ) stop slave #停止同步 start slave #开始同步,从日志终止的位置开始更新. show slave status #查看同步状态 SET SQL_LOG_BIN=0|1 #主机端运行,需要super权限,用来开停日志,随意开停,会造成主机从机数据不一