MySQL从3.23版本开始引入了二进制日志,用于的数据复制, 二进制日志根据MySQL的版本不同,目前有4个版本:

https://dev.mysql.com/doc/internals/en/binlog-version.html

Version 1: supported statement based replication events.

Version 2: can be ignored as it was only used in early alpha versions of MySQL 4.1.x

and won't be documented here.

Version 3: added the relay logs and changed the meaning of the log position.

Version 4: added the FORMAT_DESCRIPTION_EVENT and made the protocol extensible.

二进制日志版本是向后兼容的, 后一个版本可以看成是对前一个版本的继承和扩展,需要注意的是,version 2是一个临时版本, 可以忽略。事实上可以只关心v4版本,因为现在跑的MySQL都应该是MySQL 5+了,就如现再讨论Oracle 8i, 9i没什么实际意义。截至当前最新的MySQL 8版本,使用的依然是v4版本。

题外话:

BinlogMiner的解析器为保持代码稳定,做了接口将功能和具体实现分隔, 但实际上目前也只有一个BinlogParser4实现。也许以后会有V5版本,还有一个问题就是开源软件的碎片化,目前主流的有3个分支,本人偏爱Percona版本,Percona版本完全兼容官方版本,而在性能和可维护性上有提高,非常讨人喜欢。国内一些大的互联网企业如腾讯,阿里也有做基于MySQL的数据库,目前还没有研究,不知道兼容性如何。

MySQL的二进制日志文件以事件为单位进行封装,文件的结构如下:

说明:二进制日志可以看成是二进制事件的集合,不同的事件,对应于不同的功能,MySQL包含的事件类型可以参考:

https://dev.mysql.com/doc/internals/en/binlog-event-type.html

A start event (START_EVENT_V3) is the first event of a binlog for binlog-version 1 to 3.

A format description event (FORMAT_DESCRIPTION_EVENT) is the first event of a binlog for binlog-version 4.

v1-v3版本, 二进制日志文件的第一个事件是START_EVENT_V3, 而v4版本开始第一个事件是FORMAT_DESCRIPTION_EVENT,替代掉START_EVENT_V3.

二进制日志的结束事件为STOP_EVENT或者ROTATE_EVENT,出现其中之一就说应二进制文件已经结束, 其中STOP_EVENT说应MySQL服务器已经关闭, 而ROTATE_EVENT则说明二进制达到了max_binlog_size的阈值,或者在线修改了binlog-format,导致了二进制文件的切换。

二进制日志QUERY_EVENT和ROWS_EVENT(包括WRITE_ROWS_EVENT/UPDATE_ROWS_EVENT/DELETE_ROWS_EVENT)来记录数据变化, 所有的DDL,如(create table ...)都是通过QUERY_EVENT记录的, 而DML(inert/update/delete)则根据复制模式的不同(binlog-format)而不同, 基于语句的复制(Statement-Based),DML语句以语句形式记录在QUERY_EVENT中,而基于行的复制(Row-Based Replication),则将受到DML语句影响的行的值,记录在ROWS_EVENT中。显而易见, 基于语句的复制一个明显的优势就是数据量小,delete table xxx,只记录一个语句就可以了,但是行模式则需要记录所有行的值。但如前文说的基于语句的复制不是绝对安全的,当遇到"Nondeterministic"的语句,会由问题,比如SYSDATE(),如果将函数复制到备库执行,得到的结果和主库肯定不一样,又如USER()调用的用户不同,得到的结果也不同。当然可以通过一些选项,在遇到有些函数时转换成函数的结果复制,但并不是说有的函数都能解决,特别是自定义的函数。基于行的赋值,ROWS_EVENT中还包含修改的“前值”,BinlogMiner就是通过这些“前值”达到闪回的效果。

1. magic number

用于表示二进制日志文件, 4个字节长度, 其值为固定的:0xfe 0x62 0x69 0x6e; 紧接着的是一个个的二进制日志事件。二进制日志的每个事件的结构如下:

2. Common Header

通用文件头, 其实定义了一个事件的基本信息, 包含事件的起止位置, 类型, 时间搓和服务器ID等信息, 我们依赖这些信息特别起止位置来遍历整个二进制日志文件,Common Header的结构如下:

https://dev.mysql.com/doc/internals/en/binlog-event-header.html

Binlog header Payload:

4  timestamp

1  event type

4  server-id

4  event-size

if binlog-version > 1:

4 log pos

2 flags

可以看到Common Header的长度是固定的13个字节或者19个字节。只有v1版本是13个字节, 后续的版本都是19个字节, 主要是多了log pos, 也就是当前事件的结束位置, v1版本虽然没有结束位置, 但是是可以通过事件的开始位置 + 事件长度(event-size)计算出来的,之所以称为Common Header,是因为这部分是与具体事件无关的。

3. Post-Header

Common Header后紧跟着的是Post-Header部分, Post-Header是跟具体事件相关的,而且并不是每个事件都有Post-Header(可以为0),Post-Header的长度对于一个MySQL版本是固定的,但不同版本可能不同,每种事件的Post-header的长度在FORMAT_DESCRIPTION_EVENT中有记录。

4. PlayLoad

Post-Header后紧跟着负载(playload), 也就是具体的内容,这部分是不固定长度的,直到事件的结束(也就是Checksum)。

以一个QUERY_EVENT的案例来概览一下Post-header和playLoad:

* QUERY_EVENT: The query event is used to send text querys right the binlog.

*

* References:

* https://dev.mysql.com/doc/internals/en/query-event.html

* https://dev.mysql.com/doc/internals/en/event-data-for-specific-event-types.html

*

* Post-header :

*   4  slave_proxy_id

*   4  execution time

*   1  schema length

*   2  error-code

* if binlog-version ≥ 4:

*     2  status-vars length

*

* Payload:

*   string[$len] status-vars

*    string[$len] schema

*   1 [00]

*   string[EOF] query

5. Checksum

也就是事件的校验值, 在MySQL 5.6.2版本开始引入,5.6.6版本开始默认开启(CRC32), 这部分在事件的结尾处, 目前只支持CRC算法,检验值为4个字节,校验算法在FORMAT_DESCRIPTION_EVENT事件中通过1个字节记录。

https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html#option_mysqld_binlog-checksum

mysql二进制日志特点_MySQL二进制日志分析-概述篇相关推荐

  1. mysql二进制日志管理_MYSQL二进制日志管理脚本

    MYSQL二进制日志管理脚本脚本原理是每小时对进行flush生成新的二进制日志,将二进制日志备份至NFS,并压缩存放:#!/bin/bash#Purpose:管理二进制日志,每小时刷新二进制日志,并将 ...

  2. mysql二进制日志重置_MySQL二进制日志备份和恢复详解

    原文链接:http://www.showerlee.com/archives/681 ****经实践,该教程ok,特在此分享**** 基本概念 定义: 二进制日志包含了所有更新了数据或者已经潜在更新了 ...

  3. mysql切换二进制日志命令_Mysql二进制日志binlog命令

    第一节: binlog配置: 注意:MySQL默认是没有开启二进制日志的. 基础参数查看: 开关: [(none)]>select @@log_bin; 日志路径及名字 [(none)]> ...

  4. mysql宕机日志查询_mysql宕机分析(事务日志损坏)

    mysql宕机分析(事务日志损坏) 一.情景概述. 1.服务器配置 a)  1CPU 8核 b)  16G内存 c)  2T 硬盘 2. Mysql 在一个普通硬盘中长时间处于大量写的状态(长时间大概 ...

  5. linux中mysql数据库启用日志记录_MYSQL启用日志,和查看日志

    mysql有以下几种日志: 错误日志:     -log-err 查询日志:     -log 慢查询日志:   -log-slow-queries 更新日志:     -log-update 二进制 ...

  6. 开启mysql日志记录_Mysql开启日志记录

    vim /etc/my.conf.d/server.cnf: #lower_case_tables_name = 1 #错误日志 log_error = /var/log/mysql_error.lo ...

  7. wdcp mysql日志文_mysql的日志简单总结

    事务日志 redo log mysql的innodb引擎在开启事务后,中间的操作都会先在内存中进行.然后将这些数据先写入到redo log中--"日志先行"(Write-Ahead ...

  8. mysql 重做日志 镜像_MySQL重做日志

    MySQL重做日志 故障的类型 事物内部故障 系统故障 介质故障 计算机病毒 日志类型 redo log(重做日志) 处理系统故障 undo log 处理事务故障 (回滚) 重做日志 用来实现事物的持 ...

  9. mysql重做日志文件_MySQL 重做日志文件

    一.innodb log的基础知识 · innodb log顾名思义:即innodb存储引擎产生的日志,也可以称为重做日志文件,默认在innodb_data_home_dir下面有两个文件ib_log ...

最新文章

  1. 上周新闻回顾:微软补丁个个紧急 奥运网络百花齐放
  2. 带修莫队 ---- 离散化 + 暴力 + 带修莫队 F. Machine Learning
  3. web实现QQ第三方登录 开放平台-web实现QQ第三方登录
  4. python循环语句-python循环语句
  5. Scala类中的+方法
  6. 2016 亚洲共识指南:肺结节的评估
  7. P3586-[POI2015]LOG【线段树】
  8. XADD和NEG命令
  9. 【华为机试题 HJ72】百钱买百鸡问题
  10. 杰理AD14N/AD15N---串口中断问题
  11. Linux mmc驱动框架(4)——卡检测及初始化
  12. c语言中平方根函数(sqrt)
  13. python实数符号_下列格式化符号中,用来表示浮点实数的是()。 (6.0分)_学小易找答案...
  14. 学习游戏服务器编程提高篇
  15. android 4 时间限制,Android触摸精灵
  16. 黑马程序员_IO输入输出流
  17. 楷书书法规则_写好楷书的五条规律,不懂这些,书法就很难入门
  18. 35岁的程序员:第8章,魏建国
  19. 基于WFP的windows驱动对TCP数据的抓取,修改以及注意事项
  20. 清空数据库表结构的几种方式

热门文章

  1. Python分析年度爆款“网抑云”热评,看看哪些文案触动了你的内心世界?
  2. MFC开发IM-第十三篇、MFC改变字体重影的问题
  3. 男女择偶基本心理类型
  4. 知乎:全球发售2600万股销售股份 每股发售价51.8港元
  5. 苹果喊你升!iOS 15.4支持戴口罩解锁 新增“怀孕男人”表情 网友:不要男妈妈...
  6. 苹果春季新品发布会来了:将推iPhone13 Pro系列紫色版
  7. 真首发!雷军预热小米12:第一时间把最新最酷的科技带给用户
  8. 100亿估值的文和友,为何难以“走出”长沙?
  9. 罗永浩又接代言了!担任省钱顾问
  10. 阿里巴巴港股股价创历史新高 市值超6.1万亿港元