MySQL复制是使用最为广泛的一套组建,上一节已经简单说了一下复制的一些用途和复制的原理,知道了这些我们能够快速的搭建起复制的平台,但是仅知道这些还是不够的,很多时候并不是一帆风顺的,总会有那么一小段时间,或者总会有那么几次会出现各种各样的问题。当出现问题我们应该怎么去解决呢?

下面我们先来看看MySQL复制常见的一些问题,以及对应的解决办法;更进一步的我们是否可以考虑做的更好,提供自动化或者半自动化的工具来帮助我们更快更好的解决问题呢?

OK,首先我们先来看看我们经常在复制中会遇到的问题吧。

其中最经典的两个错误,也是比较麻烦的两个:

ErrorNo

描述

通常解决办法

1062

由于主键或者唯一建冲突导致的

可以把从库上这个记录删掉

1032

找不到记录

解析Binlog前项,补气记录

现在问题来了, 我们现在已经知道了这种问题出现的原因,也知道了如何去应对这种问题。那么要是这种问题经常发生怎么办呢?业务对备库有比较强的依赖,又该怎么办呢?

我们的想法是能不能做个自动或者半自动的工具或者脚步来帮助我们去及时的发现问题并解决问题。仔细想想如果要做这件事情,那么我们首先要做的事情就是怎样正确的找到这条记录,然后怎么去删除掉也好,或者补起前项也好。这是我们要做的事情,找到这些记录后我们就可以 restart slave ;然后复制就可以正常工作了。

再如何找到这些个记录之前我们要结合前面的内容,并开始更进一步的认识binlog(ROW 格式的binlog):

首先每个Event 有 event_header 事件头:

事件头有19个字节,时间戳占4个字节,事件类型1个字节,服务器ID4个字节,事件长度4个字节,下个事件开始位置4个字节以及2个字节的标志位,通俗一点就是:

+---------+---------+---------+------------+-----------+-------+

|timestamp|type code|server_id|event_length|end_log_pos|flags  |

|4 bytes  |1 byte   |4 bytes  |4 bytes     |4 bytes    |2 bytes          |

+---------+---------+---------+------------+-----------+-------+
    关于事件类型请看 binlog_event.h#245 行开始有个枚举类型:

我这里有个 5.7.6 版本的事件头信息,由于这个版本event_type比较多(39个), 我们暂且先关注一下:
  ROTATE_EVENT= 4,

FORMAT_DESCRIPTION_EVENT= 15,

TABLE_MAP_EVENT = 19,

WRITE_ROWS_EVENT = 30,

UPDATE_ROWS_EVENT = 31,

DELETE_ROWS_EVENT = 32,

然后每个 Event 都会有 event_body 事件体:

事件体由三部分组成: header、post-header、payload 组成,不过通常我们把 post-header 和 payload 都归结成为事件体,实际上 post-header 存放的是一些定长的数据,我们平常就不需要特别的care。

所以通俗版的事件体我们描述如下:

+=====================================+

|
event  | fixed part (post-header)                                        |

|
data     +-------------------------------------------------------+

|             | variable part
(payload)                                        |

+=====================================+

我们之所以说
post-header 是定长的, 就是因为在 format
description event 事件中,对于这个长度已经规定好了。也就是在文件开始的第一个event 里边规定的。

最后一个事件是 rotat event 日志轮换事件:

通过前面我们知道 ROTATE_EVENT 的 type_code 是 4,其 那么 post-header 长度 8。

OK, 这些基本信息我们都知道了, 那么接下来我们就开始写个程序解析我们的binlog吧,让我们的程序在处理复制是助我们一臂之力!

关于如何解析我放到下一节吧,内容有点多 ,再写在这里也不太合适了。

附:

EventHeader 描述: https://dev.mysql.com/doc/internals/en/event-header-fields.html

MySQL复制 -- binlog(2)的更多相关文章

  1. MySQL复制 -- Binlog (1)

    复制之所以工作得益于MySQL把对数据库的变更都记录在 binlog中,然后主库把它读出来,放到从库上去应用.当然binlog 的用途不仅限于此,比如 PITR等 在5.1.4版本以前,binlog格 ...

  2. mysql复制那点事(2)-binlog组提交源码分析和实现

    mysql复制那点事(2)-binlog组提交源码分析和实现 [TOC] 0. 参考文献 序号 文献 1 MySQL 5.7 MTS源码分析 2 MySQL 组提交 3 MySQL Redo/Binl ...

  3. MySQL复制(二)--基于二进制日志文件(binlog)配置复制

    基础环境:   主库 从库 服务器IP地址 192.168.10.11 192.168.10.12 版本 5.7.24 5.7.24 已存在的数据库 mysql> show databases; ...

  4. 浅析MySQL复制

    MySQL的复制是基于binlog来实现的. 流程如下 涉及到三个线程,主库的DUMP线程,从库的IO线程和SQL线程. 1. 主库将所有操作都记录到binlog中.当复制开启时,主库的DUMP线程根 ...

  5. MySQL复制环境(主从/主主)部署总结性梳理

    Mysql复制概念说明Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves) ...

  6. MYSQL复制

    今天我们聊聊复制,复制对于mysql的重要性不言而喻,mysql集群的负载均衡,读写分离和高可用都是基于复制实现.下文主要从4个方面展开,mysql的异步复制,半同步复制和并行复制,最后会简单聊下第三 ...

  7. mysql开启binlog

    mysql开启binlog,至于为什么要开启binlog,可以google下. ## 设置server_id,一般设置为IP server_id= ## 复制过滤:需要备份的数据库名,多个库以逗号分隔 ...

  8. 转mysql复制主从集群搭建

    最近搭了个主从复制,中间出了点小问题,排查搞定,记录下来 1环境:虚拟机:OS:centos6.5Linux host2 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 ...

  9. 不小心删除数据--利用MySQL的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

随机推荐

  1. 从零开始自学 Java Web

    目录: 1.Java JDK下载安装及配置 2.eclipse下载与安装并测试 3.eclipse快捷键 4.Tomcat 下载与安装 5.Tomcat部署Web应用 6.Eclipse中配置Tomc ...

  2. 【DOS】COPY命令

    一:文件复制COPY 指令说明:复制一个或更多文件到指定位置,可以合并文件 语法:COPY [/A/B] source[/A|/B] [+source [/A|/b] [+...]][destinat ...

  3. PageHelper分页插件使用

    mybatis的分页插件jar包: 配置方法: 在mybatis配置文件中加下面代码 <plugin interceptor="com.github.pagehelper.PageIn ...

  4. TensorFlow Python3.7环境下的源码编译(二)安装配置

    源代码树的根目录中包含了一个名为 configure 的 bash 脚本. $ ./configure 接下来,配置系统会给出各种询问,以确认编译时的配置参数.   一.重要参数解释 Please s ...

  5. vue-scroller实现vue单页面的上拉加载和下拉刷新问题

    在vue中如何简单的实现页面的上拉加载和下拉刷新,在这里我推荐使用vue-scrolle插件. vue-scrolle的基本使用方法: 1.下载 npm i vue-scroller -D 2.导包 ...

  6. HDFS文件系统基础

    HDFS架构实现 Hadoop当前稳定版本是Apache Hadoop 2.9.2,最新版本是Apache Hadoop 3.1.1. http://hadoop.apache.org/docs/ H ...

  7. golang--性能测试和分析

    前言 测试分为:压力测试.负载测试.性能测试,功能测试等等,其中在开发过程中开发人员经常要写一些test case unit 自己的模块进行功能测试测和性能.在分析出模块的性能瓶颈后开发人员就需要针对 ...

  8. centos7.6 安装配置rabbitmq

    IP地址:192.168.200.108 安装erlang 和 依赖环境 yum install -y socat yum install -y erlang 安装rabbitmq yum insta ...

  9. Virtual DOM的简单实现

    了解React的同学都知道,React提供了一个高效的视图更新机制:Virtual DOM,因为DOM天生就慢,所以操作DOM的时候要小心翼翼,稍微改动就会触发重绘重排,大量消耗性能. 1.Virtu ...

  10. 奔跑吧DKY——团队Scrum冲刺阶段-Day 4

    今日完成任务 谭鑫:主要解决之前存在的控件不灵敏问题,导致界面跳转不顺利. 黄宇塘:制作新的游戏背景图,对主界面图进行调整. 赵晓海:主要解决之前存在的控件不灵敏问题,导致界面跳转不顺利. 方艺雯:制 ...