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 Socket手撸一个http服务器

    原文连接:使用Java Socket手撸一个http服务器 作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomc ...

  2. 修复bug有哪些更快的技术?做好这6点就够了

    你有没有想过为什么有时修复错误似乎比它应该花费更长的时间?当你终于找到问题时,事实证明你所需要的只是一个小小的改变.然而,花了很多时间才能找到正在发生的事情.这种情况比我想象的更频繁. 另一方面,当您 ...

  3. easyx图形库做贪吃蛇游戏

    编程总是对着一个黑窗口,可以说是非常乏味了,于是喵喵就翻出来了以前用easyx图形库做图形界面的贪吃蛇游戏. 不过大家只是当做提高编程的乐趣来学习吧,想进一步做的话可以学习QT,还有其他的框架. 这是 ...

  4. pytorch中的Linear Layer(线性层)

    LINEAR LAYERS Linear Examples: >>> m = nn.Linear(20, 30) >>> input = torch.randn(1 ...

  5. 【Docker】第三篇 Docker容器管理

    一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...

  6. 为centos虚拟机配置固定ip

    在virtual上安装centos虚拟机以后,发现虚拟机没有ip,无法联网 将虚拟机的网络适配器改为桥接模式,桥接到物理机的无线网卡 为虚拟机配置固定IP(vi /etc/sysconfig/netw ...

  7. Python交互数据库(Mysql | Mongodb | Redis)

    数据库 Mysql Mysql MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗下产品 MyS ...

  8. Scrum立会报告+燃尽图(Final阶段第六次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2485 项目地址:https://coding.net/u/wuyy694 ...

  9. MySQL课堂练习 20162315

    练习内容 1.参考教材相关代码,提交能连接到world的截图(有学号水印) 2.查询world数据库,获得人口超过500万的所有城市的列表. 3.查询world数据库,获得New Jersey州所有城 ...

  10. Task 6.4 冲刺Two之站立会议7

    今天又重新对服务器部分加以分析改进,由于用户登录时必须得连接服务器,所以作为整个软件最核心的服务器的部分,只有保障了这个内容才能保证软件的正常运行.