修复 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)

    暂无评论

    暂无资讯

    暂无问答

    mysql 主主复制

    1. 环境:Red Hat 4.1.2-52,MySQL5.5.20 2. 两台机器: master1:192.168.76.7 master2:192.168.76.10 3. 单独编译安装MySQL,并测试连接成功。 4. 两台机器上都建立用户,并赋予复制权限: ...

    2013/03/20 15:16
    90
    0
    mysql

    当数据库出现 (table) is marked as crashed and should be repaired 解决办法: check table stat_active_201110; repair table stat_active_201110; How to repair a crashed MySQL tab...

    2012/03/27 09:56
    31
    0
    MySQL复制中启动从库,日志中提示用户名及密码问题

    MySQL复制中的错误日志中提示 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommmended.Please consi...

    2016/08/28 15:41
    178
    0
    mysql 主从库配置

    MySQL从库上有一个IO线程负责从主库取binlog到写到本地。另外有一个SQL线程负责执行这些本地日志,实现命令重放; 一、环境 主机: master操作系统:centos 5.3 IP:192.168.1.222 MySQL版本...

    2015/07/03 12:09
    237
    0
    mysql 主从库配置

    MySQL从库上有一个IO线程负责从主库取binlog到写到本地。另外有一个SQL线程负责执行这些本地日志,实现命令重放; 一、环境 主机: master操作系统:centos 5.3 IP:192.168.1.222 MySQL版本...

    2015/07/03 14:05
    13
    1
    mysql数据库表的检测和修复

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

    2015/09/25 22:55
    105
    0
    mysql主从配置

    mysql主从库配置

    2015/04/29 13:09
    12
    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
    75
    1
    如何配制MySql的Replication

    1.建立专门用于Replication的账户 首先Replication操作会涉及到的两个重要权限,这里先做一下说明: The REPLICATION CLIENT privilege enables the use of SHOW MASTER STATUS and SHOW SL...

    2014/10/12 11:48
    8
    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/18 13:05
    113
    0

    没有更多内容

    加载失败,请刷新页面

    返回顶部
    顶部