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. Python码农福音,GitHub增加Python语言安全漏洞告警

    在 2017 年 GitHub 开始对托管在其网站的代码仓库和依赖库开始提供安全漏洞检查和告警,开始时候只支持 Ruby 和 JavaScript 语言的项目.根据 GitHub 官方数据显示截止目前 ...

  2. Memached、Redis、Mongodb的区别

    性能 ​ • 性能都很高,redis和memached差不多 > Mongodb 操作 ​ • Memached:数据结构单一,只有key/value数据结构 ​ • Redis有五种数据类型 ...

  3. Python 函数修饰符(装饰器)的使用

     Python 函数修饰符(装饰器)的使用 1.  修饰符的来源修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 修饰符是解决这类问题的绝佳设计, ...

  4. XSS分类&危害&防御

    XSS(跨站脚本)漏洞是什么? 在网页中插入恶意的js脚本,由于网站没对其过滤,当用户浏览时,就会触发脚本,造成XSS攻击 XSS分类? 1.反射型 用户输入的注入代通过浏览器传入到服务器后,又被目标 ...

  5. 解决网速慢时maven仓库访问慢

    构建maven项目时会下载很多依赖,会从官网地址下载是个外国网站,访问速度会很慢,但可以通过修改maven的settings.xml文件换成国内的镜像地址就可以加快访问速度: 一.找到settings ...

  6. 2019网易笔试题C++--丰收

    题目描述 又到了丰收的季节,恰好小易去牛牛的果园里游玩. 牛牛常说他多整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛. 在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第 ...

  7. python3之三级菜单

    city = { "江苏省": { "南京市": { "栖霞区": ["aa", "bb"], &q ...

  8. Codeforces Round #515 (Div. 3) 解题报告(A~E)

    题目链接:http://codeforces.com/contest/1066 1066 A. Vova and Train 题意:Vova想坐火车从1点到L点,在路上v的整数倍的点上分布着灯笼,而在 ...

  9. Windows环境下,从零开始搭建Nodejs+Express+Ejs框架(二)---安装Express,ejs

    安装Express,ejs的前提是一定要先安装nodejs,具体安装方法请查看 http://www.cnblogs.com/tfiremeteor/p/8973105.html 安装Express和 ...

  10. python判断文件和文件夹是否存在、没有则创建文件夹

    原文出处:https://www.cnblogs.com/hushaojun/p/4533241.html >>> import os >>> os.path.ex ...