mysql binlog之二 三种格式的分析对比 - 一梦如是的博客 - CSDN博客

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql binlog之二 三种格式的分析对比

基础材料:

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部分内容如下:

#190312 21:29:43 server id 98 end log_pos 1800 crc32 0x14f1f4f3 GTID  last_committed=6  
nce_number=7  rbr_only=no 
SET@@SESSION.GTID_NEXT='f00ee5e5-ece0-11e8-9e64-000c294b8e72:21'/*!*;# at 1800
#190312 21:29:43 server id 98 end loq_pos 1879 crc32 0x6817975b Query thread_id=2 
rror_code=0
SET TIMESTAMP=1552397383/*!*/; BEGIN/*!*/;# at 1879
rror_code=0#190312 21:29:43 server id 98 end 1og_pos 1978 crc32 0xb5dc29fb Query thread_id=2 SET TIMESTAMP=1552397383/*!*/; delete from test limit 10 j*!*/;
# at 1978
#190312 21:29:43 server id 98 end_1og_pos 2058 crc32 0xfb287e31 Query thread_id=2 
rror code=0
SET TIMESTAMP=1552397383/*!*/: COMMIT

可以看到执行过的语句被原原本本的记录到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部分内容如下:

### DELETE FROM test,testxxxx 
### WHERE 
### @1=101  /*  INT meta=0 nullable=0 is_nu1l=0 
### @2=101  /*  INT meta=0 nullaple=1 is nul]=0 
### @3=101 /* INT meta=0 nullable=1 is_nul7=0 
### DELETE FROM test,testxxxx 
### WHERE 
### @1=102  /*  INT meta=0 nullable=0 is_null=0 
### @2=102  /*  INT meta=0 nullable=1 is_nul7=0 
### @3=102  /*  INT meta=0 nullable=1 is_nul1=0 
### DELETE FROM test,testxxxx 
### WHERE 
### @1=103  INT meta=0 nullable=0 is_null=0 
### @2=103  INT meta=0 nullable=1 is_nul]=0 
### @3=103  /*  INT meta=0 nullable=1 is_nu17=0 
### DELETE FROM test,testxxxx 
### WHERE 
### @1=104  * INT meta=0 nullable=0 is nu1]=0 )*  
### @2=104  INT meta=0 nullable=1 is_nul1=0 * 
### @3=104  INT meta=0 nullabiteplogicgenme 

可见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部分内容如下:

### DELETE FROMtest.test
### WHERE 
### @1=1 /* INT meta=0 nullable=1 is_nu11=0 */  
### @2=2 /* INT meta=0 nullable=1 is_nu11=0 */  
# at 1257
#190312 23:24:17 server id 98 end_log_pos 1288 CRC32 COMMIT/*!*/;# at 1288
#190312 23:24:32 server id 98 end_log_pos 1353 CRC32 nce_number=5rbr_only=no
SET @@SESSION.GTID_NEXT='f00ee5e5-ece0-11e8-9e64-000c# at 1353
#190312 23:24:32 server id 98 end log.pos 1432 cRc32 rror_code=0
SET TIMESTAMP=1552404272/*!*/; BEGIN/*!*/;# at 1432
#190312 23:24:32 server id 98 end_log_pos 1532 CRC32 rror_code=0
SET TIMESTAMP=1552404272/*!*/ delete from test where a=1
/*!*/;  

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


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
375 4
|
2月前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
248 2
|
13天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1576 12
|
16天前
|
SQL 关系型数据库 MySQL
MySQL 更新1000万条数据和DDL执行时间分析
MySQL 更新1000万条数据和DDL执行时间分析
34 4
|
15天前
|
SQL 自然语言处理 关系型数据库
Vanna使用ollama分析本地MySQL数据库
这篇文章详细介绍了如何使用Vanna结合Ollama框架来分析本地MySQL数据库,实现自然语言查询功能,包括环境搭建和配置流程。
76 0
|
27天前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
161 11
|
27天前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
106 2
|
1月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
78 6
|
17天前
|
SQL 关系型数据库 MySQL
MySQL EXPLAIN该如何分析?
本文将详细介绍MySQL中`EXPLAIN`关键字的工作原理及结果字段解析,帮助优化查询性能。`EXPLAIN`可显示查询SQL的执行计划,其结果包括`id`、`select_type`、`table`等字段。通过具体示例和优化建议,帮助你理解和应用`EXPLAIN`,提升数据库查询效率。
24 0
|
18天前
|
存储 关系型数据库 MySQL
Mysql行格式DYNAMIC和COMPACT区别
总之,选择哪种行格式取决于具体的应用场景,如数据类型分布、读写比例、存储与性能需求等。在处理大量文本或二进制数据且对存储空间敏感的应用中,DYNAMIC格式可能是更好的选择;而对于混合型数据且对读取性能有一定要求的场景,COMPACT格式可能更合适。在设计数据库时,评估这些因素并进行适当测试,可以帮助确定最适合的行格式。
43 0