mysql_repl_repair 修复 MySQL 主从复制错误开源项目

我要开发同款
匿名用户2017年09月06日
94阅读

技术信息

开源地址
https://github.com/dumingyou/mysql_repl_repair
授权协议
Apache

作品详情

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

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

原理

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

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

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

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

isert igore ito table set a=xxx,b=xxx,c=xxx

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

限制

支持5.1~5.7,

目前只支持ROW格式bilog且为FULLrowimage格式

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

USAGEpytho mysql_repl_repair.py -hUsage: pytho mysql_repl_repair.py [optios]this script is used to repair mysql replicatio errors(1062, 1032)example:pytho mysql_repl_repair.py -u mysql -p mysql -S /tmp/mysql.sock  -d -vpytho mysql_repl_repair.py -u mysql -p mysql -S /tmp/mysql3306.sock,/tmp/mysql3307.sock -l /tmpOptios:  -h, --help            show this help message ad exit  -u USER, --user=USER  userame for logi mysql  -p PASSWORD, --password=PASSWORD                        Password to use whe coectig to server  -l LOGDIR, --logdir=LOGDIR                        log will output to scree by default,if ru with                        daemo mode, default logdir is /tmp, logfile is                        $logdir/mysql_repl_repair.$port.log  -S SOCKETS, --socket=SOCKETS                        mysql sockets for coectig to server, you ca iput                        multi socket to repair multi mysql istace, each                        socket separate by ','  -d, --daemo          ru as a daemo  -t TIME, --time=TIME  uit is secod, default is 0 mea ru forever  -v, --verbose         debug log mode

功能介绍

mysql_repl_repair.py是一款用于修复mysql主从复制错误的python小工具,该工具可以修复由于主从数据不一致导致的1062(duplicate key), 1032(key...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论