微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql_repl_repair 修复 MySQL 主从复制错误的 Python 小工具

程序名称:mysql_repl_repair

授权协议: Apache

操作系统: 跨平台

开发语言: Python

mysql_repl_repair 介绍

MysqL_repl_repair

MysqL_repl_repair.py是一款用于修复MysqL主从复制错误的python小工具,该工具可以修复由于主从数据不一致导致的1062(duplicate
key), 1032(key not found)错误。当遇到复制出错,MysqL_repl_repair.py会流式读取relay
log中的数据,并构造成修复sql,在从库上执行,解决sql线程apply时遇到的问题。MysqL_repl_repair.py非常轻巧,即使在遇到大事务时也不会对服务器造成性能影响,MysqL_repl_repair.py支持以daemon方式后台运行,支持单机多实例下同时修复多个实例

目前网易内部的使用方法:监控服务定期监控MysqL主从复制状态,如遇1062,1032 则执行MysqL_repl_repair.py进行修复

原理

1. 当从库sql
apply线程遇到1062错误时,说明slave上已经存在需要insert的数据,并且需要insert的数据上有唯一约束,从而导致插入失败,那么需要按照
唯一约束建们 来删除该事务中相关insert语句(对应WRITE_ROWS_EVENT)。最终构造的sql

delete from table where (pk_col = xxx ) or (uk1_col1 = xxx and uk1_col2=yyy)

如果事务中存在多条insert, 那么对应多条delete语句,而事务中有delete或者update的话,将忽略

2. 当从库sql apply线程遇到1032错误时,说明slave
sql线程在执行update或者delete时找不到对应需要变更的数据,那么需要先写入这条数据才行,因为binlog为row模式时变更语句(对应DELETE_ROWS_EVENT或UPDATE_ROWS_EVENT)中包含变更前数据,因此可以构造出这条数据。最终构造的sql

insert ignore into table set a=xxx,b=xxx,c=xxx

如果事务中包含多条delete/update语句,那么最终需要执行多次 insert操作,而事务中有insert的话,将忽略

限制

  • 支持5.1 ~ 5.7,

  • 目前只支持ROW格式binlog且为FULL row image格式

  • json,空间数据类型的表造成的复制异常目前版本暂不支持,如有强烈需求,我们将考虑支持一下

USAGE

python MysqL_repl_repair.py -h

Usage: 
python MysqL_repl_repair.py [options]

this script is used to repair MysqL replication errors(1062, 1032)

example:
python MysqL_repl_repair.py -u MysqL -p MysqL -S /tmp/MysqL.sock  -d -v
python MysqL_repl_repair.py -u MysqL -p MysqL -S /tmp/MysqL3306.sock,/tmp/MysqL3307.sock -l /tmp


Options:
  -h, --help            show this help message and exit
  -u USER, --user=USER  username for login MysqL
  -p PASSWORD, --password=PASSWORD
                        Password to use when connecting to server
  -l LOGDIR, --logdir=LOGDIR
                        log will output to screen by default,if run with
                        daemon mode, default logdir is /tmp, logfile is
                        $logdir/MysqL_repl_repair.$port.log
  -S SOCKETS, --socket=SOCKETS
                        MysqL sockets for connecting to server, you can input
                        multi socket to repair multi MysqL instance, each
                        socket separate by ','
  -d, --daemon          run as a daemon
  -t TIME, --time=TIME  unit is second, default is 0 mean run forever
  -v, --verbose         debug log mode

mysql_repl_repair 官网

https://github.com/dumingyou/mysql_repl_repair

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐