在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”

MySQL Replication--跳过复制错误的更多相关文章

  1. mysql主从复制跳过复制错误【转】

    跳过复制错误 mysql因为binlog机制问题,有些时候会出现从库重放sql执行失败的情况,特别是旧的STATEMENT模式最容易出现这种情况(因为函数和存储过程等原因),这也是为什么强调使用mix ...

  2. 跳过复制错误——sql_slave_skip_counter

    昨天不少同学讨论<小心,前方有雷 —— sql_slave_skip_counter>,有说作者在玩文字游戏,扯了那么多sql_slave_skip_counter=1不还是跳过一个事务嘛 ...

  3. MySQL-Utilities:mysqldbcompare及跳过复制错误

    mysqldbcompare也是MySQL-Utilities工具集的一个脚本.mysqldbcompare从两个数据库比较对象和数据的不同.数据库中的对象包括:表.视图.触发器.存储过程.函数和事件 ...

  4. 跳过复制错误——slave_skip_errors、slave_exec_mode

    这一篇写写复制错误处理相关的另两个参数slave_skip_errors.slave_exec_mode,基本环境参考<复制错误处理——sql_slave_skip_counter> 一. ...

  5. MySQL Replication主从复制

    MySQL Replication:NySQL复制,MySQL的复制默认为异步工作模式   mysql的复制功能是mysql内置的,装上它之后就具备了这个功能,而mysql复制是mysql实现大规模高 ...

  6. mysql 5.6在gtid复制模式下复制错误,如何跳过??

    mysql 5.6在gtid复制模式下复制错误,如何跳过?? http://www.xuchanggang.cn/archives/918.html

  7. MySQL复制错误 The slave I/O thread stopsbecause master and slave have equal MySQL server UUIDs; these UUIDs must bedifferent for replication to work 解析

    在搭建Mysql主从复制时候,在执行完相关操作以后,通过命令查看是否主从复制成功的时候 show slave status\G; 在"Slave_SQL_Running_State" ...

  8. mysql replication常见错误整理

    这篇文章旨在记录MySQL Replication的常见错误,包括自己工作中遇到的与网友在工作中遇到的,方面自己及别人以后进行查找.每个案例都是通过Last_IO_Errno/Last_IO_Erro ...

  9. mysql replication错误常见处理

    大部分的错误,都是日志错误 日志本身的错误 主日志和中继日志都可能出错,可以使用mysqlbinlog来读一下mysqlbinlog mysql-bin.000007>/dev/null ##只 ...

随机推荐

  1. centos7 新装系统网络配置

    [root@localhost ~]# cat /etc/sysconfig/grub GRUB_TIMEOUT= GRUB_DISTRIBUTOR="$(sed 's, release . ...

  2. B2C B2B C2C O2O模式的介绍

                    b2c:天猫 商家对客户                 c2c:淘宝 客户到客户(卖家也是阿里公司的客户)                 o2o:美团 线上花费,下 ...

  3. cookie的参数

    def set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, ...

  4. Python的string模块

    如果要使用string模块,需要先导入该模块 import string string.ascii_lowercase  #打印所有的小写字母 string.ascii_uppercase  #打印所 ...

  5. leetcode56:合并区间

    给出一个区间的集合,请合并所有重叠的区间.(解题思想来源于:https://blog.csdn.net/qq_34364995/article/details/80788049 ) 示例 1: 输入: ...

  6. ios遮罩层的简单使用

    /** 大图 */ - (IBAction)bigImg { //1.添加按钮遮罩层 UIButton *cover=[[UIButton alloc] init]; cover.frame=self ...

  7. Pandas分组统计函数:groupby、pivot_table及crosstab

    利用python的pandas库进行数据分组分析十分便捷,其中应用最多的方法包括:groupby.pivot_table及crosstab,以下分别进行介绍. 0.样例数据 df = DataFram ...

  8. DOM中offsetLeft与style.left的区别

    offsetLeft 获取的是相对于父对象的左边距 left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距 如果父div的position定义为relat ...

  9. [转]内存分配malloc, new , heapalloc

    malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较 http://www.cppblog.com/woaidongmao/archive/2011/08/12/1531 ...

  10. JAVA (StringBuffer/StringBuilder)常用API

    public class Copy3 { public static void main(String[] args) { //构造实例化 StringBuffer strbu = new Strin ...