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

Apache
Python 查看源码»
跨平台
2017-09-06
dukope

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
    的码云指数为
    超过 的项目
    加载中

    评论(0)

    暂无评论

    暂无资讯

    暂无问答

    How To Repair Corrupted MySQL Tables Using myisamchk

    How To Repair Corrupted MySQL Tables Using myisamchk MyISAM is the default storage engine for MySQL database. MyISAM table gets corrupted very easily. In this article, I’ll ex...

    2018/09/13 12:03
    7
    0
    MySQL实现批量检查表并进行repair与optimize的方法

    这篇文章主要介绍了MySQL实现批量检查表并进行repair与optimize的方法,结合实例形式分析了MySQL批量修复与优化表的相关技巧,需要的朋友可以参考下 本文实例讲述了MySQL实现批量检查表并进行r...

    2019/03/12 11:19
    19
    0
    生活在REPL中,工具与程序一体

    最近对《On Lisp》中提到的“自底向上程序设计”——通过改造语言来接近问题领域——有了新的体会:生活在REPL中,工具与程序一体。

    2016/01/31 19:44
    106
    1
    MySQL check table/optimize table/analyze table/REPAIR TABLE

    MySQL check table/optimize table/analyze table/REPAIR TABLE 关键词:optimize table,analyze table 转自:https://www.cnblogs.com/datastack/p/3826560.html 注意,这几个操作都会锁表,...

    2019/03/08 17:18
    91
    0
    mgr安装-启动主节点报错-[ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Unable to ...

    mysql> START GROUP_REPLICATION; ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log. mysql> 查看日...

    2019/10/28 14:58
    56
    0
    mysql (ab复制 mysql中间件)

    原理图: mysql ab复制 A->B master: vim /etc/my.cnf 添加 log-bin=mysql-bin server_id=1 show master status grant replication slave on *.* to repl@'%' identified by 'repl' mysql-b...

    2016/11/10 20:44
    50
    0
    mysql数据库表的检测和修复

    Mysql数据库修复方法有下面3种: 1. mysql原生SQL命令: repair   即执行REPAIR TABLE SQL语句   语法:REPAIR TABLE tablename[,tablename1...] [options]   示例: mysql> use database...

    2015/09/25 22:55
    308
    0
    repair mysql replication

    master : my.cnf [mysqld] log-bin = mysql-bin server-id=1 binlog-ignore-db=mysql start_master.sh mysql -u root -e "grant all on *.* to slave@'slave_ip' identified by'123';flush p...

    2010/12/06 16:33
    437
    0
    node --REPL

    REPL(Read Eval Print Loop:交互式解释器),它类似于windows系统的终端,我们可以在终端中输入命令,并接受系统的响应。 node自带了交互式解释器,可以执行如下任务: 1>读取:读取用户输入,...

    2016/07/08 15:46
    19
    0
    linux 下配置mysql主从同步的步骤

    一、主机环境 主机: master操作系统:rhel6.0 IP:172.16.0.100 MySQL版本:5.1.47 从机: slave操作系统:rhel6.0 IP:172.16.0.200 MySQL版本:5.1.47 二、创建数据库 分别登录master机和...

    2012/07/20 15:10
    86
    1

    没有更多内容

    加载失败,请刷新页面

    返回顶部
    顶部