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

在5.1.4版本以前,binlog格式只能是 statement -based replication ,在以后的版本中引入了 row-based replication 以及 mixed-based replication。

下面我会简单的介绍一下SBR、RBR、MBR 这三种格式下binlog是如何组织的,更重要的是在这三种格式下,replication是如何进行工作的。当然我主要介绍 RBR模式下的复制,因为RBR模式下我们的复制是认为是最安全的方式,即使是使用MBR也会有可能踩到坑。

在MySQL中,Binlog有两类文件,一类文件用于记录数据变更,一类文件用于记录binlog list。

Binlog list文件就是 ${HOSTNAME}-bin.index  ;用于记录当前有哪些binlog

binlog的数据文件名字类似于 ${HOSTNAME}-bin.00001,这类文件是我们重点关注的对象。

先来大概的看看binlog 的文件内容:

svan-mac:mydata xiean$ mysqlbinlog -vvvv mysql-bin.000010

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#151218 15:19:30 server id 5331  end_log_pos 123 CRC32 0xd483743a         Start: binlog v 4, server v 5.7.9-log created 151218 15:19:30

# Warning: this binlog is either in use or was not closed properly.

BINLOG '

grNzVg/TFAAAdwAAAHsAAAABAAQANS43LjktbG9nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA

ATp0g9Q=

'/*!*/;

# at 123

#151218 15:19:30 server id 5331  end_log_pos 154 CRC32 0x622c3733         Previous-GTIDs

# [empty]

SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;

DELIMITER ;

# End of log file

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

抽一段binlog出来看看:

# at 141

#151218 15:19:30    server id 5331      end_log_pos 245

Query thread_id=3350  exec_time=11  error_code=0

at 141

当前事件在文件中的起始位置,单位bytes

#151218 15:19:30

当前事件开始时间

Server id

当前事件在哪个Server 执行的

End_log_pos

下一个事件在文件中的开始位置,即当前事件内容为  4~end_log_pos-1范围

exec_time

执行所花费的时间(如果是Master );

error_code

执行该事件时的结果

我们把Binlog 文件拆分成3个部份

简单描述 -->

{

"header": "desc …",
    "event": "xxxxxxx",
    "footer": "log rotat"
}

第一部份: 由 4-bytes 开始,这4-bytes 表明它是一个MySQL binlog 文件(由log_event.h 这个文件常量:BINLOG_MAGIC (0xfe 0x62 0x69 0x6e = 0xfe 'b''i''n') 表示),这也就能解释我们的第一个event 为什么 起始位置是 4 了原因了。

第二部份: 一个一个的 event ,每个event 根据binlog版本不同,解释出来的含义有所不同(在MySQL 5.0+ binlog版本都使用的是 V4版本)

第三部份:也就是文件最后event用于记录log-rotation 事件,表明了接下来的日志将写入哪个文件。

Event 是binlog 记录的最小单位,event 的上一级是event group ,复制或者恢复的时候基于 event group 来重放日志。对于一个组来说,要么都执行, 要么都不执行。而对于DML来说一个 event 包含多个event,而对于DDL 来说,一个event 就是一个 event group。对于每个Event里边有哪些东西,以及event group 是如何划分的我们将在下面讨论。

触发器,存储过程,函数在MySQL里边是如何处理的呢?

触发器,存储过程,函数 在创建的时候都会记录Binlog

触发器在执行的时候 Master、Slave 都会被调用,Master上的触发器将会在Master上被调用,Slave上的触发器将会在Slave上被调用。

存储过程在执行的时候,Master上会被转化成具体的SQL语句存储在Binlog里边,因此在binlog里边是看不到任何 call 来调用存储过程的event 。

函数在执行的时候并不会被解析成为具体的语句,相反函数执行时和触发器比较相像,在Master上和Slave都会被调用。

三种模式下Binlog 是如何记录的

基于语句的复制 : 是MySQL 5.7.7 版本以前默认配置,它将SQL语句(而不是实际的数据变化)从主服务器复制到从服务器。

优点 :在某些情况下,最终写入日志文件的数据更少,例如更新或者删除许多行时。对于只影响几行数据的简单语句,基于行的复制占用的空间更少。

缺点 : 最明显的是它不支持不确定性的语句,例如当前时间函数。

基于行的复制 : 使用单个的表行记录变化,而不是语句。主服务器将消息,也就是事件写入二进制日志,表示单个表行的变化。这与其他RDBMS中更加传统的复制方式类似。

优点:需要更少的锁定,意味着能够达到更高的并发。

缺点:它会产生更多需要记录的数据,占用的空间大。

混合模式日志 : 可以根据要记录的事件实时改变二进制日志格式。使用混合模式复制时,默认采用基于语句的复制,但是在某些情况下自动切换到基于行的复制

PPT下载地址:http://pan.baidu.com/s/1mgZrvLI

MySQL复制 -- Binlog (1)的更多相关文章

  1. MySQL复制 -- binlog(2)

    MySQL复制是使用最为广泛的一套组建,上一节已经简单说了一下复制的一些用途和复制的原理,知道了这些我们能够快速的搭建起复制的平台,但是仅知道这些还是不够的,很多时候并不是一帆风顺的,总会有那么一小段 ...

  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. WPF DataGrid使用简介

    1)自动生成列 <DataGrid AutoGenerateColumns="True" Name="datagrid" CanUserAddRows=& ...

  2. 将 Python3 文件打包成 exe 文件

    我们用 Python 写好的代码,如何给别人在没有配置 Python 环境的情况下直接使用呢?尤其是面向 windows 众. 因为 Python 是一门解释性的语言,离开了 Python 解释器,P ...

  3. Scrapy爬取美女图片第四集 突破反爬虫(上)

     本周又和大家见面了,首先说一下我最近正在做和将要做的一些事情.(我的新书<Python爬虫开发与项目实战>出版了,大家可以看一下样章) 技术方面的事情:本次端午假期没有休息,正在使用fl ...

  4. C#反射的简单示例

    反射(Reflection)可以在运行时获 得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等反正说白了就 ...

  5. Python闭包相关问题

    闭包的概念一直是似懂非懂,看过了原理,却不知道怎么实际应用. 刚好看到Python的late binding问题,记录如下,以备后续增补. >>> def create_multip ...

  6. KEIL5的安装

    安装注意事项 1.最好不要安装在带有中文路径的文件夹. 2.试用版的Keil MDK只能编译32K以下的代码,代码大于32K只能使用正版或破解版才能编译通过. 安装MKD 这里选择MKD512A版本安 ...

  7. HWI的安装

    一.安装的过程 hwi的安装过程: 1.解压src源码包:tar -zvxf apache-hive-1.2.2-src.tar.gz 2.进到HWI目录下:cd /home/bigdata/apac ...

  8. mysql 无法启动,错误1067,进程意外终止

    在做项目启动mysql数据库时,经常出现 这个错误,今天总结一下 //查看了网上很多的方法,都不适用,但或许对你适用.ps:网上只提供了怎么解决这个问题,但是没有将怎么去发现问题,对症下药才是王道.而 ...

  9. 我想这次我真的理解了 JavaScript 的单线程机制

    今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触 ...

  10. website for personal research

    YOLO https://pjreddie.com/darknet/yolo/ Low Rank Matrix Recovery and Completion via Convex Optimizat ...