mysql_repl_repair

修复 MySQL 主从复制错误
授权协议 Apache
开发语言 Python
所属分类 数据库相关、 数据库管理工具
软件类型 开源软件
地区 国产
投 递 者 韩寒
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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 mysql_repl_repair.py是一款用于修复mysql主从复制错误的python小工具,该工具可以修复由于主从数据不一致导致的1062(duplicate key), 1032(key not found)错误。当遇到复制出错,mysql_repl_repair.py会流式读取relay log中的数据,并构造成修复sql,在从库上执行,解决

    • mysql_repl_repair mysql_repl_repair是用于修复mysql主从复制错误的python工具,该工具可以修复由于主从数据不一致导致的1062(duplicate key), 1032(key not found)错误。这里有2个文件 mysql_repl_repair.py 与 mysql_repl_repair2.py, 这两个文件都可以解决复制问题,但他们的用法不一

    • 前言 此文档是基于MySQL 5.7版本进行编写,请大家注意自己的版本,不同版本可能执行出错或者执行结果不一致。 查看MySQL版本: select VERSION(); 本文档主要是讲解Global Status的内容,但是在讲解过程中会涉及到一些其他的知识与其相关的需要解释的也会说一下,感兴趣的同学可以自行百度或者与我探讨。 对于想要相关稳当的同学请移步下载MYSQL 5.7 Global

    • 官网mysql下载源码安装 下载MySQL5.7.20源码包, wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20.tar.gz 下载Boost C++ 1.59.0的开放源码程序库,在后面cmake的时候加上boost的路径 wget https://sourceforge.net/projects/boost/file

    • 备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL用户及权限 一.MySQL用户和权限介绍 MySQL权限系统通过下面两个阶段进行认证: 1.对连接的用户进行身份认证,合法的用户通过验证,不合法的用户拒绝连接 查看mysql.user表的Host、User、 备注:MySQL 进行身份认证的时候,IP地址和用户名联合进行确认,所以root@localhost 和root@i

    •   首先先了解数据库权限   Privilege Grant Table Column Context ALL [PRIVILEGES] Synonym for “all privileges” Server administration ALTER Alter_priv Tables ALTER ROUTINE Alter_routine_priv Stored routines CREATE

    • My SQL 复制过程中,sql post thread如果执行某个SQL出错,则会自动停止并且在日志和show slave status中提示错误信息。 090303 22:36:31 [ERROR] Slave SQL: Could not execute Delete_rows event on table CATY.buyer_info; Can’t find record in ‘buy

    • MySQL 常见优化方案 1 优化数据库结构 1.1 优化表的数据类型 MySQL 支持的数据类型非常多,选择正确的数据类型对获得高性能至关重要 数值 类型 大小(byte) 有符号 无符号 用途 TINYINT 1 [-128, 127] [0, 255] 整数 SMALLINT 2 [-32768, 32767] [0, 65535] 整数 MEDIUMINT 3 [-8388608, 838

    • 变量名 变量说明 Aborted_clients 由于客户端未正确关闭连接而终止的连接数 Aborted_connects 尝试连接到MySQL服务器失败的次数 Binlog_cache_disk_use 使用临时二进制日志缓存但超过binlog_cache_size值并使用临时文件存储来自事务的语句的事务数 Binlog_cache_use 使用二进制日志缓存的事务数 Binlog_stmt_c

    • Centos Mysql忘记密码,修改密码 1.修改MySQL的登录设置: vim /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 2.重新启动mysql service mysql restart 3.登录并修改MySQL的root密码 mysql> use mysql; Database changed mysql> update use

    • 账号控制与账户管理 账户用户名和密码 MySQL将账户存储在mysql系统数据库中的user表中。 账户还可能具有身份验证凭据,例如密码。凭据由帐户身份验证插件处理,MySQL支持多种认证插件。其中一些使用内部认证方法,而另一些使用外部认证方法来启用认证。更多信息请查看 Pluggable Authentication. MySQL用户和密码的使用与操作系统用户和密码的使用有几个区别: 用于MyS

    • 由于业务需要在mysql实例中创建部分库的从库,已有的mysql实例的版本是mysql-5.5.49,是一个非常老的版本。 本文档涉及到服务器中运行多实例和构建实例中部分库的从库。 服务器 mysql端口 功能 服务器1 3306 主库 服务器2 3307 服务器1中部分库的从库 1、服务器2上创建3307实例 首先需要准备源码编译包,这个就不在描述了。由于我服务器2上已经存在了一个同样版本的实例

    • 一.环境: OS:CentOS 6.5 X64 DB Version:Percona Mysql 5.7.15-9-log 路径:/app/mysql57 数据文件路径:/data/mysql57/data DB1:192.168.213.4 DB2:192.168.213.5 二.安装Mysql 1.安装依赖包 yum -y install gcc gcc-c++ ncurses ncurses

    • 昨天晚上在群中和一些网友聊到了MySQL多实例的话题,最早接触MySQL多实例还是在1年前,那会我刚步入运维行业,做过MySQL多实例的相关实验,在后来的工作中也很少用到多实例,一直就淡漠了它,昨天再次提及,故此再次重新整理下以前的笔记,参考一些大牛的观点,也参考我的好友贺总(尊称)的意见,特此写下这篇文章!废话不说,切入正题.... 在同一台物理服务器上部署多个实例,而多实例的部署方式简单,但是

    • 一、安装前准备 同时需要下载与MySQL版本对应的boost,下载地址:http://sourceforge.net/projects/boost/files/boost/ 安装cmake:yum install -y cmake ncurses-devel 创建MySQL用户 groupadd mysql useradd -g mysql -d /usr/local/mysql mysql 二、

     相关资料
    • MySQL主从复制 MySQL主从复制原理过程 主数据库配置步骤 从数据库配置步骤 MySQL主从复制生产标准实践过程 MySQL主从同步配置步骤 定义服务器角色 数据库环境准备 主库上需要执行的操作 编辑主库的配置文件 查看开启结果 建立同步账号密码 从库上需要执行的操作 将全备导入到数据库 登陆从库执行change master语句 开启同步 查看是否同步成功语句 一些常用语句 MySQL主从

    • 2天前,我开始设置y MySQL主从复制。我从主人那里做了输出,然后把它输入到奴隶身上,还有所有这些东西。一切都很顺利。但我在建立从服务器到主机的连接时遇到了一些麻烦。所以我晚上就不做了。现在,大约1.5天后,我修复了这个问题,我的复制正在运行。主人一直在跑。但现在当我运行时,我比master落后了125,000秒。我以为从机会自动从主机下载所有记录的东西,并运行这些东西,使它们同步。但是的值会非

    • 我正在运行MySQL作为Ubuntu实例上的数据库。我正在使用MySQL主从复制,其中主的更改将写入从,而从的更改将不会反映在主上。那很好。我正在使用一个HAProxy负载均衡器来前置MySQL实例,所有请求都将被发送到主MySQL实例。如果主MySQL实例被关闭,从MySQL实例将充当主实例,并且HAProxy将发送所有请求到salve。主动-被动方案。 让我们假设MySQL主机(192.168

    • 尝试了许多解决办法,但都无济于事 参考:在当前主题中找不到样式“协调器LayoutStyle” 但没有帮助 底部App Bar材质设计 应用程序条:底部材质设计

    • 问题内容: 向MySQL发出命令时,出现错误#1064“语法错误”。 这是什么意思? 我该如何解决? 问题答案: 错误#1064表示MySQL无法理解您的命令。要解决这个问题: 阅读错误消息。 它 准确地 告诉您MySQL 在命令中哪里 混淆了。 检查您的命令。 如果您使用的编程语言来创建你的命令,使用,或同等学历,以显示 完整的命令 ,所以你可以看到它。 检查手册。 通过对MySQL的什么比较

    • mysql服务器有可能同时是主服务器和从服务器吗?我希望server1成为db1的主服务器(server2作为db1的从服务器运行)此外,我希望server1成为db2的从服务器(server2作为db2的主服务器)。这能做到吗?

    • 本文向大家介绍使用Docker容器搭建MySql主从复制,包括了使用Docker容器搭建MySql主从复制的使用技巧和注意事项,需要的朋友参考一下 1. 编写主MySQL的Docker文件 新建文件夹,命名为MySQL-master-v1。在文件夹mysql-master-v1中新建文件Dockerfile和master.cnf。笔者推荐使用的编辑器是Visual Studio Code。利用编辑