mysql binlog之二 三种格式的分析对比

本文深入探讨MySQL Binlog的statement、row与mixed三种格式,分析各自优劣,及对主从同步的影响。statement节省空间,但可能引发一致性问题;row确保数据一致性,适合误操作恢复,但占用空间大;mixed结合两者优点,智能选择格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础材料:

centos7.5  mysql 5.7.24  开启GTID


binlog对于mysql是至关重要的,binlog与undo redo一起保证了数据的完整性,用于数据恢复,崩溃恢复、任一时间点恢复、甚至是任意一条数据的恢复。所有的高可用模式也都是基于binlog进行处理的。

本文主要对binlog的三种存储格式statement、row、mixed进行分析对比其优缺点。


statement格式:

在statement格式下,binlog忠实的记录的执行过的语句,你执行过什么语句它就照搬复制到binlog中。由于其可能造成主从不一致的情况,所以生产环境基本都不会设置为statement。

优势:1、节省空间。由于只是对执行的语句进行记录,所以相比row模式binlog所占的空间很小

           2、提高数据库性能。由于binlog是在事务提交时才进行fsync刷盘操作,而刷盘的操作是最耗费IO的,statement只需要记录一条语句而不是记录所有操作过的数据行。

劣势:可能造成主从不一致

在测试环境执行delete from test limit 10;删除表中的10条数据,观察binlog的内容变化,binlog部分内容如下:

可以看到执行过的语句被原原本本的记录到binlog中,被同步到从库重做。

执行delete from test limit 10;时还会产生一个警告,大意就是使用statement格式时执行limit语句可能造成主从同步不一致。因为limit语句只是指定了删除10条记录,但没有指定具体是哪10条,当mysql在两次执行时选择了不同的索引进行操作时,删除的记录就是不同的。当然还有其他函数也可能会造成主从不一致。


 row格式:

在row格式下,binlog对于DDL操作记录执行的SQL语句,对于DML语句则记录具体操作的数据行。一般生产环境采用该格式。

优势:对于DML操作记录了具体的行数据,保证重放的一致性,同时也可以对一些误操作的数据进行单独恢复提供了可能性

劣势:由于记录了每条数据的内容变更,导致了binlog日志占用了很大的空间,由于fsync时一次写入数据过多,在一定程度上影响了性能。

调整binlog格式为row,执行delete from testxxxx limit 10;观察binlog的内容变化,binlog部分内容如下:

可见binlog修改的每一行数据的具体值都被记录了下来。如果我需要恢复其中的某一条记录只要把delete转换成insert就可以了,这是其他格式做不到的。


mixed格式:

集前两种格式的优点,对于DDL只对SQL语句进行记录。对DML操作则会进行判断,如果mysql判断会造成主从不一致,就会采用row格式记录,反之则用statement格式记录。

优点:节省空间,提高数据库性能,通过判断保证数据重放时的一致性。

缺点:无法对误操作数据进行单独恢复

调整binlog格式为mixed,执行delete from test  limit 1;和delete from test where a =1;观察binlog的内容变化,binlog部分内容如下:

可见对于limit语句可能造成主从不一致的情况下,mysql选择了row格式进行记录,对于后面执行delete语句则采用了statement格式进行记录。


 

### 基于 MySQL Binlog 进行数据恢复的最佳实践 #### 背景介绍 MySQL Binlog 是一种日志文件,用于记录数据库中的所有更改操作(INSERT、UPDATE、DELETE 等)。它不仅支持主从复制,在数据恢复方面也具有重要作用。通过分析应用 binlog 文件的内容,可以实现精确的数据回滚或前滚[^1]。 #### 数据恢复的具体方法 要基于 MySQL Binlog 恢复数据,通常需要以下几个核心步骤: 1. **确认 Binlog 是否启用** 在进行任何操作之前,需确保 MySQL 实例已经启用了 Binlog 功能。可以通过以下命令检查: ```sql SHOW VARIABLES LIKE 'log_bin'; ``` 如果返回 `ON` 则表示已开启[^3]。 2. **定位目标位置** 使用 `SHOW MASTER STATUS;` 查看当前 Binlog 的文件名称及其位置信息。这一步可以帮助我们找到最近一次备份之后的 Binlog 开始点。 ```sql SHOW MASTER STATUS; ``` 3. **提取并解析 Binlog 日志** 可以利用工具如 `mysqlbinlog` 来解析指定范围内的 Binlog 文件内容。例如,如果知道某次误删除发生在特定时间范围内,则可以用如下方式导出该时间段的日志: ```bash mysqlbinlog --start-datetime="YYYY-MM-DD HH:MM:SS" \ --stop-datetime="YYYY-MM-DD HH:MM:SS" \ /path/to/mysql-bin.xxxxxx > extracted_log.sql ``` 4. **执行恢复脚本** 将上述生成的 SQL 文件重新导入到目标数据库中完成数据恢复工作。注意替换正确的用户名、密码以及对应的数据库名称: ```bash mysql -u 用户名 -p 密码 数据库名 < extracted_log.sql ``` 以上即为完整的基于 MySQL Binlog 的数据恢复流程[^2]。 #### 示例代码展示 假设我们需要恢复因错误操作丢失的文章表 (`articles`) 中的部分数据,以下是具体的操作示范: ```sql -- 查询原始状态下的文章列表作为对比依据 SELECT * FROM articles; -- 执行可能引发问题的操作后发现异常情况 DELETE FROM articles WHERE id = 10086; -- 定位相关联的Binlog文件路径与起止时刻 SHOW MASTER STATUS; -- 提取对应时段内的变更记录保存至本地临时文件 mysqlbinlog --start-datetime="2023-09-01 08:00:00" \ --stop-datetime="2023-09-01 09:00:00" \ /var/lib/mysql/mysql-bin.000007 > recovery_script.sql -- 应用这些修改回到生产环境当中去修复损失 mysql -u root -p my_database < recovery_script.sql ``` #### 注意事项 尽管 Binlog 对于灾难恢复极其重要,但在实际部署过程中仍有一些细节需要注意: - 确保定期清理过期无用的历史 Binlogs,以免占用过多存储空间; - 设置合适的 retention period 参数控制保留期限长短; - 结合物理冷备方案共同构建更加完善的高可用架构体系[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值