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

本文涉及的产品
云数据库 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格式进行记录。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
16 0
|
1月前
|
存储 安全 关系型数据库
Mysql 的binlog日志的优缺点
MySQL的binlog(二进制日志)是一个记录数据库更改的日志文件,它包含了所有对数据库执行的更改操作,如INSERT、UPDATE和DELETE等。binlog的主要目的是复制和恢复。以下是binlog日志的优缺点: ### 优点: 1. **数据恢复**:当数据库出现意外故障或数据丢失时,可以利用binlog进行点恢复(point-in-time recovery),将数据恢复到某一特定时间点。 2. **主从复制**:binlog是实现MySQL主从复制功能的核心组件。主服务器将binlog中的事件发送到从服务器,从服务器再重放这些事件,从而实现数据的同步。 3. **审计**:b
|
1月前
|
关系型数据库 MySQL 数据挖掘
轻松入门MySQL:利用MySQL时间函数优化产品销售数据统计与分析(9)
轻松入门MySQL:利用MySQL时间函数优化产品销售数据统计与分析(9)
|
2月前
|
SQL 关系型数据库 MySQL
mysql的binlog恢复数据
mysql的binlog恢复数据
32 0
|
1月前
|
SQL 关系型数据库 MySQL
Mysql 的binlog日志的原理【4月更文挑战第1天】
【4月更文挑战第1天】 MySQL的binlog(二进制日志)是一个记录数据库更改的日志文件,它主要用于复制和恢复操作。以下是binlog日志的工作原理的简要概述: **事件写入**:当MySQL服务器执行一个事务时,它会将该事务中所有对数据库的修改操作(如INSERT、UPDATE和DELETE等)记录为一个事件(event)。这些事件包含了修改操作的相关信息,如操作类型、涉及的表、修改的行等。
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
102 0
|
1月前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
101 1
|
1月前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
11天前
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之在DataWorks中,如何通过PolarDB for MySQL来查看binlog日志
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
28 1
|
12天前
|
存储 关系型数据库 MySQL
MySQL 8 索引原理详细分析
了解索引的详细原则,不仅有助于优化,能把索引搞清楚的,面试中优势也会很突显。 关于数据库优化的话题,V哥觉得还有很多地方可以聊,如果你有兴趣,欢迎关注一起讨论。
MySQL 8 索引原理详细分析