MySQL binlog中的事件类型详解

MySQL binlog中的事件类型详解

简介

MySQL BINLOG是MySQL数据库的事务日志,用于记录数据库中所有修改数据的SQL语句。它的主要作用是在主从数据库同步时,将主库上的事务日志传输到从库,从而实现数据库的高可用性和异地容灾。备份和数据恢复也依赖于 BINLOG。

BINLOG 是由一系列的事件(Event)构成,每个 Event 记录了MySQL执行中的重要事件。在 MySQL 5.6 中,MySQL BINLOG一共有 13 类事件(Event),每个事件的格式不一样,它们都用特定格式将数据记录到 event 数据库表中。

本文将详细讲解 MySQL BINLOG 中的所有事件类型及其格式,以及如何使用 BINLOG 进行数据库备份和恢复。同时,文章将提供两个示例说明,以帮助读者更好地理解 BINLOG。

MySQL BINLOG 中的事件类型

  1. Query Event
  2. Stop Event
  3. Rotate Event
  4. Intvar Event
  5. Load Event
  6. Slave Event
  7. Create File Event
  8. Append Block Event
  9. Exec Load Event
  10. Delete File Event
  11. New Load Event
  12. Rand Event
  13. User Var Event

1. Query Event

Query Event 记录了在 MySQL 服务器上执行的语句。该事件类型的格式为:

# Query
# 时间戳  ServerId     SQL状态标志         数据库名
# 格式内容 13 38        0       00      00      00      00      06      db01    
# SQL 语句内容
# 格式内容 2f 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74 5f 6d 61 6c 65 20 77 68 65 72 65 20 74 5f 6d 61 6c 65 2e
SELECT * from t_male where t_male.age > 30

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“SQL状态标志”是一个字节的标志,指示执行结果,“数据库名”标记了 SQL 语句的目标数据库。

2. Stop Event

Stop Event 事件是为了记录 MySQL 数据库服务器的停机时间点,在从库中由 I/O 线程使用。当主库停机,从库需要等待某些时间后再尝试重新连接主库。该事件类型的格式为:

# 时间戳  ServerId o
# 格式内容 3b 31
# 空内容

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“空内容”是用于占位的模板内容,表示空的 Stop Event 事件。

3. Rotate Event

Rotate Event 事件会在 MySQL 的日志文件轮换时出现。当 Binary Log 的容量到达某个值,MySQL 服务器会自动保存旧的 Binary Log 并重新启动一个新的 Binary Log 文件。Rotate Event 记录了这个操作,它标志着一个开始写入的新的日志文件的名字和位置。该事件类型的格式为:

# Rotate
# 时间戳  ServerId offset  文件名
# 格式内容 2d 61 01 00  00 00 00 00  2e 2f 76 61 72 2f 6c 6f 67 2f 6d 79 73 71 6c
# 空内容

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“offset”代表下一条事件在当前日志文件的位置,“文件名”标志着新的日志文件的名字。

4. Intvar Event

Intvar Event 记录了一个整数变量的值,包括自增 ID 的编号等等。该事件类型的格式为:

# Intvar
# 时间戳  ServerId     Intvar ID      Intvar Value
# 格式内容 74 44        01 00 00 00   08 00 00 00
# 空内容

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“Intvar ID”指定了整型变量的类型,“Intvar Value”是这个整型变量的值。

5. Load Event

Load Event 十分简单,用于记录由 LOAD DATA INFILE 命令进行的数据文件导入。该事件类型的格式为:

# Load
# 时间戳  ServerId     数据库名        表名
# 格式内容 77 3c        03 74 65 73 74  01 74 01 00 00 00 00 00 00 
# 数据文件引用目录
# 格式内容 2f 76 61 72 2f 6c 6f 67 2f 6d 79 73 71 6c 2f 2e 2e 2f 74 65 73 74 2e 74 78 74
# 空内容

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“数据库名”和“表名”指定了数据录入的位置,“数据文件引用目录”是指向数据文件的位置,“空内容”用于占位。

6. Slave Event

Slave Event 记录了从库执行的操作的结果,以及与主库连接的状态。该事件类型的格式为:

# Slave
# 时间戳          ServerId     处理状态              主库链接达到时间
# 格式内容 22 1f 04 00 00 00 00 00 00                    5f 14 0d 9c b2 c5 05 00 00
# 查询内容
# 格式内容 6d 79 73 71 6c 20 73 6c 61 76 65
# 查询结果
# 格式内容 00 00 00 08

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“处理状态”为一个字节的标志,它记录了从库对主库的回应,“主库链接达到时间”指的是从库与主库的连接时间,“查询内容”是处理的 SQL 语句,“查询结果”表示 SQL 执行后的状态。

7. Create File Event

Create File Event 事件由使用 CREATE TABLESPACE 或者 CREATE LOGFILE GROUP 语句创建文件进行的操作触发。该事件类型的格式为:

# Create_file
# 时间戳  ServerId     文件 ID         文件名
# 格式内容 5f 28        01 00 00 00    2f 75 73 72 2f 73 68 61 72 65 2f 6d 79 73 71 6c 2f 65 76 65 6e 74 73 3f 3f 
# 空内容

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“文件 ID”指定了新文件的类型和它所代表的文件 ID,“文件名”为文件在系统中的路径,“空内容”用于占位。

8. Append Block Event

Append Block Event 将日志数据附加到某个已经存在的文件中。该事件类型的格式为:

# Append_block
# 时间戳  ServerId     文件指针         内容长度
# 格式内容 7a 1c        00 00 00 00     10 27 00 00 
# 数据块
# 格式内容 04 fe 00 42 0a dc af a6 d6 fa 01 00 39 ce 07 00 
# 校验和
# 格式内容 8a f2 19 7f 

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“文件指针”指向已经存在的文件的位置,“内容长度”表示附加的数据块长度,“数据块”即为附加的日志数据,“校验和”是一些检验和。

9. Exec Load Event

Exec Load Event 是加载器执行 LOAD DATA 语句后产生的事件。该事件类型的格式为:

# Exec_load
# 时间戳  ServerId     数据库名        表名
# 格式内容 3b 3a        05 6c 6f 67 61 74  01 74 00 00 00 00 00 00 
# 插入行数
# 格式内容 3f 52 14 00 
# 空内容

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“数据库名”和“表名”指定了数据录入的位置,“插入行数”表示 INSERT 操作新增的行数,“空内容”用于占位。

10. Delete File Event

Delete File Event 事件由使用 DROP TABLESPACE 或者 DROP LOGFILE GROUP 语句删除文件进行的操作触发。该事件类型的格式为:

# Delete_file
# 时间戳  ServerId     文件 ID         文件名
# 格式内容 37 20        02 b8 7e 13    2f 75 73 72 2f 73 68 61 72 65 2f 6d 79 73 71 6c 2f 65 76 65 6e 74 73 00
# 空内容

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“文件 ID”指定了将要被删除文件的 ID 和其类型,“文件名”为文件在系统中的路径,“空内容”用于占位。

11. New Load Event

New Load Event 是 LOAD DATA 新添加的 Binlog Event 提高了记录的精度,可以看到 LOAD DATA 的详细过程。该事件类型的格式为:

# New_load
# 时间戳  ServerId     文件名长度      文件名
# 格式内容 00 02 16 40  61 62 63 2e 65 78 74 00
# 数据块长度
# 格式内容 01 00 00 00
# 数据块
# 格式内容 31 32 33 34 35 36 0a 

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“文件名长度”是导入数据的文件名的长度,“文件名”是导入数据的文件名,“数据块长度”是导入数据块的长度,“数据块”为记录实际导入的数据。

12. Rand Event

Rand Event 是用来创建一个随机数种子的事件类型,每次执行必须用随机数种子。该事件类型的格式为:

# Rand
# 时间戳          ServerId     随机数种子
# 格式内容 2f 24 04 00 00 00 00 00  fa b8 eb 6a b3 08 d8 34
# 空内容

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“随机数种子”用于生成下一次的插入操作,“空内容”用于占位。

13. User Var Event

User Var Event 记录了 MySQL 中的自定义变量。该事件类型的格式为:

# User_var
# 时间戳  ServerId     变量名长度      变量名
# 格式内容 3d 5e        03 66 6f 6f    00
# 变量值长度
# 格式内容 03 00 00 00
# 变量值
# 格式内容 62 61 72

其中,“#”是注释符号,“时间戳”代表当前事件发生的时间,“ServerId”是服务器的标识符,“变量名长度”和“变量名”指定了自定义变量,“变量值长度”表示自定义变量值的长度,“变量值”为自定义变量的值。

使用 MySQL BINLOG 进行数据备份和恢复

BINLOG 是 MySQL 的事务日志,主要用于记录数据库中所有修改数据的SQL语句。它可以用于数据备份和恢复等应用场景。

数据备份

在进行数据备份的时候,应该首先停止正在进行的 MySQL 服务,然后将 BINLOG 相关文件(Binary Log files)拷贝至备份目录。BINLOG 文件通常位于 MySQL 数据库存储目录下的 /mysql/data 目录中。

数据恢复

使用 BINLOG 进行数据恢复时,需要先完成以下两步操作:

  1. 重建数据库:首先,应当清空数据存储目录并重建数据库;
  2. 充当主库:然后,将备份资料上传到服务器上,并用此资料来重建主库。

下文给出一个简单的数据恢复示例:

1. 通过 BINLOG 文件找到数据修改语句

找到要恢复的那些数据所在的 BINLOG 文件,然后使用如下命令查找对应的 SQL 语句:

mysqlbinlog --start-position=4 mysql-bin.000001 | grep "UPDATE myuser"

其中,“--start-position=4”代表从第 4 个字节处(即忽略的开头)开始读取 BINLOG 文件,“mysql-bin.000001”为 BINLOG 文件名,“grep”为命令过滤器。在这个例子中,我们用 grep 查找对 myuser 表做的更新操作。

2. 执行 SQL 语句

找到 SQL 语句后,使用 MySQL 命令行工具执行 SQL 语句即可完成数据的恢复。

# 进入MySQL命令行模式
mysql -u root -p
# 执行 SQL 语句
mysql> UPDATE myuser SET Name = 'Mike' WHERE ID = 1;

结论

本文详细讲解了 MySQL BINLOG 中的所有事件类型及其格式,以及如何使用 BINLOG 进行数据库备份和恢复。同时,文章提供了两个示例,帮助读者更好地理解 BINLOG。

在使用 MySQL 时,特别是在进行数据库备份和恢复工作时,BINLOG 的重要性不言而喻。相信通过这篇文章的介绍,读者对 BINLOG 的理解已经更加透彻了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL binlog中的事件类型详解 - Python技术站

(0)
上一篇 2023年6月13日
下一篇 2023年6月13日

相关文章

  • Python脚本打包成可执行文件过程解析

    Python脚本打包成可执行文件过程解析 在Python开发中,我们经常需要将Python脚本打包成可执行文件,以便在没有Python环境的机器上运行。本文将介绍Python脚本打包成可执行文件的过程,并提供两个示例。 安装pyinstaller 在将Python脚本打包成可执行文件之前,我们需要安装pyinstaller。pyinstaller是一个Pyt…

    python 2023年5月15日
    00
  • Python实现读取并写入Excel文件过程解析

    在Python中,可以使用第三方库openpyxl来读取和写入Excel文件。以下是读取并写入Excel文件的详细攻略: 安装依赖库 要读取和写入Excel文件,需要安装openpyxl库。可以使用以下命令安装: pip install openpyxl 读取Excel文件 要读取Excel文件,可以使用openpyxl库的load_workbook()函数…

    python 2023年5月14日
    00
  • python保留小数位的三种实现方法

    当我们使用Python编程时,经常需要对数字进行精确的精度处理,包括保留小数位数,下面给出三种Python保留小数位的实现方法。 方法一:使用round函数 round函数是Python内置的用于数值四舍五入操作的函数,可以实现保留小数位的功能。对于任意一个数值a,使用round(a,n)函数可以保留a的小数点后n位。例如,对于数字1.23456789使用r…

    python 2023年6月5日
    00
  • 实用自动化运维Python脚本分享

    为了让读者能够更好地了解如何实用自动化运维Python脚本,我准备了以下的攻略: 实用自动化运维Python脚本分享 前言 Python 是一门非常强大的编程语言,对于自动化运维来说,使用 Python 编写脚本可以大大提升效率。在本文中,我将分享一些实用的自动化运维 Python 脚本,并且详细讲解每个脚本的作用和使用方法。 环境准备 在使用本文中的 Py…

    python 2023年5月19日
    00
  • Python+xlwings制作天气预报表

    下面是关于 “Python+xlwings制作天气预报表”的完整实例教程。 介绍 Python 是一种广泛应用于数据处理、数据分析和机器学习的高级编程语言,而 xlwings 是一个用于在 Excel 中使用 Python 的工具。本教程将向你展示如何使用 Python 和 xlwings 制作一个天气预报表。 前置条件 在开始之前,你需要事先安装好 Pyt…

    python 2023年5月13日
    00
  • python放大图片和画方格实现算法

    下面是针对“python放大图片和画方格实现算法”的攻略。 放大图片 如果要放大一张图片,可以使用pillow库的Image模块,通过resize()方法将图片放大到目标尺寸。 from PIL import Image # 打开原始图片并放大到目标尺寸 image = Image.open("原始图片路径") target_size =…

    python 2023年5月18日
    00
  • 使用pandas的box_plot去除异常值

    使用pandas的box_plot去除异常值是一种常用的数据预处理方法,可以有效地去除一些可能会影响数据分析的异常点。以下是使用pandas的box_plot去除异常值的完整攻略: 1. 数据导入 首先需要导入要进行异常值去除的数据。可以使用pandas的read_csv函数读取CSV、TXT、TSV等格式的数据文件。例如,读取名为”data.csv”的CS…

    python 2023年5月13日
    00
  • Python字典底层实现原理详解

    Python字典底层实现原理详解 什么是字典 Python 中的字典是一种非常常用的数据类型,它可以存储键值对。字典的实现方式比较特殊,它使用了哈希表的数据结构,可以高效地进行键值对的存储和查询。 字典规则 字典的键必须是不可变的对象(比如字符串、数字或元组),而值可以是任意对象。字典中的键是唯一的,如果重复赋值会覆盖掉原有的键值对。 字典实现原理 Pyth…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部