一、binlog格式
MySQL支持3种不同格式的Binlog:
- Statement-Based(基于语句)
- Row-Based(基于行)
- Mixed(混合)
Statement-Based通过记录SQL语句来记载更改,例如在执行`INSERT INTO table1 VALUES (1, 2, 3);`时,Binlog会记录下对应的SQL语句。但是,Statement-Based在某些情况下并不适用,例如当某个更改引起自增ID变化时,恢复时可能会出现问题。在这种情况下,Row-Based会更加适用。Row-Based通过记录更改前后的值来达到记录更改的目的。Mixed则是两种方式的混合,它会根据具体情况来选择使用哪种方式。
二、binlog文件结构
在了解Binlog文件结构之前,我们需要明确一个概念——一个Binlog文件并不包含完整的数据库操作历史,一个Binlog文件只包含从文件创建时刻到文件关闭时刻之间的所有操作。如果需要获得完整的操作历史,需要将多个Binlog文件拼接起来。
Binlog文件结构如下:
|----------------------|----------------------|-------|------------| | Header | Event Data | Eof | Checksum | |----------------------|----------------------|-------|------------| Header:头信息,包含一些基本信息,例如文件大小、Binlog版本等。 Event Data:事件信息,每个事件包含一些操作信息,例如SQL语句、更改前后数据等。 Eof:文件结束标识。 Checksum:对Event Data进行校验的校验和。
下面是一个简单的示例,展示了一个查询Binlog信息的过程:
mysqlbinlog --short-form --verbose --base64-output=decode-rows binlog.000001 /*!50021 SET @@SESSION.SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40019 SET @@SESSION.TIME_ZONE='+00:00' */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #200625 9:43:12 server id 1 end_log_pos 124 CRC32 0x5ebe2294 Start: binlog v 4, server v 5.7.30-0ubuntu0.18.04.1-log created 200625 9:43:12 at startup ROLLBACK/*!*/; # at 124 #200625 9:45:53 server id 1 end_log_pos 147 CRC32 0xa9e5c5bb previous-gtids-set我们使用mysqlbinlog命令查询binlog.000001文件,并且添加了--short-form、--verbose、--base64-output=decode-rows三个参数。
三、mysqlbinlog命令详解
mysqlbinlog是官方提供的一个命令行工具,用于解析Binlog文件并输出对应的SQL语句。下面我们将逐一介绍mysqlbinlog命令的各个参数。--start-position
--start-position可以指定从哪个位置开始读取Binlog文件,默认值为4,即从头开始读取。
下面是一个示例:mysqlbinlog --start-position=154 binlog.000001
上面的命令将从binlog.000001文件中的154位置开始读取。
--stop-position
--stop-position可以指定读取到哪个位置停止,默认值为文件底部。
下面是一个示例:mysqlbinlog --stop-position=324 binlog.000001
上面的命令将从binlog.000001文件中的开始位置,读取到324位置,并停止。
--start-datetime and --stop-datetime
--start-datetime和--stop-datetime可以指定读取的时间范围。需要注意的是,时间范围需要使用“YYYY-MM-DD HH:MM:SS”这种格式。
下面是一个示例:mysqlbinlog --start-datetime="2022-01-01 00:00:00" \ --stop-datetime="2022-01-02 00:00:00" binlog.000001
上面的命令将从binlog.000001文件中的开始位置,读取在2022年1月1日0时0分0秒到2022年1月2日0时0分0秒之间的操作记录。
--database and --table
--database和--table可以指定要读取的数据库和数据库表。
下面是一个示例:mysqlbinlog --database=example --table=users binlog.000001
上面的命令将从binlog.000001文件中读取example数据库下的users表的操作记录。
--result-file
--result-file可以将解析出的SQL语句保存到指定的文件中。
下面是一个示例:mysqlbinlog --result-file=/tmp/result.sql binlog.000001
上面的命令将从binlog.000001文件中解析出的SQL语句保存到/tmp/result.sql文件中。
--verbose
--verbose用于增加输出详情。
下面是一个示例:mysqlbinlog --verbose binlog.000001
上面的命令将显示详细的解析信息。
--base64-output
--base64-output可以指定输出解析结果中二进制字段的返回格式。默认情况下,MySQL会将二进制字段以base64编码的形式返回。
下面是一个示例:mysqlbinlog --base64-output=decode-rows binlog.000001
上面的命令将以二进制解码的形式返回结果。
总结
本文介绍了MySQL Binlog的基本概念、文件结构以及mysqlbinlog命令的详细使用方法。在实际应用中,根据需要灵活使用mysqlbinlog命令可以在数据恢复、数据库备份以及Master-Slave复制等场景下发挥非常重要的作用。