MySQL更新数据时,日志(redo log、binlog)执行流程

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL更新数据时,日志(redo log、binlog)执行流程项目需要做Es和数据库的同步,而手动在代码中进行数据同步又是Es的一些不必要的数据同步操作和业务逻辑耦合,所以使用的了读取mysql的binlog日志的方式进行同步Es的数据。

MySQL更新数据时,日志(redo log、binlog)执行流程

1-4.jpg

1:背景

项目需要做Es和数据库的同步,而手动在代码中进行数据同步又是Es的一些不必要的数据同步操作和业务逻辑耦合,所以使用的了读取mysql的binlog日志的方式进行同步Es的数据。

问题1:根据binlog同步数据的时候会不会出现业务逻辑利用事务操作数据的时候,当事务还没有提交的时候,是否能够读到binlog,也就是binlog的写入时机(是事务提交的之前写,还是事务提交后写)。

问题2:如果事务提交之前写入binlog,那么事务提交之前,事务回滚,那么binlog又会出现什么情况?

 

 

首先我们做一下实验(前提是必须要打开binlog),SQL初始化语句

create table user

(

id     bigint     not null auto_increment

primary key,

name   varchar(64) null,

status tinyint(1) null

);

insert into user (name,status)values ('张三',1);

set autocommit = 0;

2.1:事务提交对binlog的影响

我们先确定一下MySQL执行更新SQL语句之后,执行commit命令前后,binlog会有什么变化。

然后我们先使用 show master status 看一下binlog的位置

 

 

然后我们执行一下更新语句

update user set status = status + 1;

再次使用 show master status 查看发现并没有Position并没有变,执行commit命令之后,发现Position由141169变为了141506,说明从库只有在主库提交之后才能读到主库写入的binlog日志。

 

 

2.2:事务回滚对binlog的影响

我们再确定一下MySQL执行更新SQL语句之后,执行rollback命令前后,binlog会有什么变化。

然后我们先使用 show master status 看一下binlog的位置

 

 

然后我们执行一下更新语句

update user set status = status + 1;

再次使用 show master status 查看发现并没有Position并没有变,执行rollback命令之后,发现Position仍然没有变化,说明事务回滚之后binlog并不会写入磁盘。

 

 

难道binlog是在事务提交之后才写入磁盘的嘛?那redo log 又是什么时候写入磁盘的呢?有上面的问题又引发一系列的问题,带着这些问题,我们来进行mysql日志的深入学习。

3:MySQL更新数据的执行流程

首先我们要先了解一下当我们做一条数据的更新操作的时候,数据库的底层到底是如何执行的?

MySQL更新数据执行流程:

1:判断数据页是否在内存中,若为否,则从磁盘读取数据到内存中,返回数据行

2:若是数据页在内存中,则直接返回数据行

3:执行数据更新操作

4:数据写入内存,同时redolog写入到内存

5:执行commit操作(此commit是SQL命令操作,而不是数据的commit状态)

6:执行commit命令之后,则进行两段提交操作。

6.1:写入内存中的redolog到磁盘中,此时redolog处于prepare状态

6.2:写入binlog到磁盘

6.3:提交事务,此时事务处于commit状态

7:结束。

注:以上操作为参数innodb_flush_log_at_trx_commit 为1和sync_binlog为1的时候。

对应MySQL的更新语句执行流程图,如图1-1。

 

 

redo log:被称之为重做日志,是在数据库发生意外时,进行数据恢复,redo log会备份是事务执行过程中的修改数据。

binlog: 被称为归档日志,是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,格式分为(statement、row、mixed)

redo log 和binlog的差异如下表:

redo log binlog
InnoDB引擎 MySQL Serve
物理日志 逻辑日志
循环写入 追加写入

MySQL执行commit命令之后是使用两段提交的办法来保证事物的原子行的,至于为什么使用两段提交,而不是其他的提交方式,由于篇幅有限,不做多余解释,请参考自行查询资料。

到目前为止,关于上面binlog的问题也就迎刃而解了,

对于问题一:MySQL中binlog在事务提交之前会写入redo log和binlog到内存中,在执行commit命令之后进行两段提交操作,将redo log和binlog写入磁盘,因此在事务提交之前不能读取到binlog日志(前提binlog没有进行被动刷盘)。

对于问题二:binlog是在执行commit命令之后进行的刷盘,但是是在事务在commit状态之前写入的磁盘。根据上面的实验可以看出,事务回滚对于binlog并没有什么影响。

小结:在执行commit命令前,执行更新数据到内存之后,那么就会写入redo log和binlog到 redo log buffer和binlog buffer中,当执行了commit命令之后,就是进行两段提交操作,然后进行redo log和binlog写入磁盘操作。

关于MySQL的日志刷盘机制是由参数innodb_flush_log_at_trx_commit 和sync_binlog控制的,具体请参考下一篇文章。

4:commit命令和commit状态区别解释

我们上面说的commit命令是指MySQL语法中的commit命令,用于提交事务,一般跟 begin/start transaction 配对使用。

而我们图中用到的这个“commit 步骤”,指的是事务提交过程中的一个小步骤,也是最后一步。当这个步骤执行完成后,这个事务就提交完成了。

“commit 命令”执行的时候,会包含“commit 步骤”。

 

 

__EOF__

网络异常,图片无法展示
|

本文作者Liekkas

本文链接:https://www.cnblogs.com/wkynf/p/15855073.html

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
35 6
|
11天前
|
存储 安全 关系型数据库
Mysql 的binlog日志的优缺点
MySQL的binlog(二进制日志)是一个记录数据库更改的日志文件,它包含了所有对数据库执行的更改操作,如INSERT、UPDATE和DELETE等。binlog的主要目的是复制和恢复。以下是binlog日志的优缺点: ### 优点: 1. **数据恢复**:当数据库出现意外故障或数据丢失时,可以利用binlog进行点恢复(point-in-time recovery),将数据恢复到某一特定时间点。 2. **主从复制**:binlog是实现MySQL主从复制功能的核心组件。主服务器将binlog中的事件发送到从服务器,从服务器再重放这些事件,从而实现数据的同步。 3. **审计**:b
|
15天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
20天前
|
SQL 关系型数据库 MySQL
mysql的binlog恢复数据
mysql的binlog恢复数据
20 0
|
22天前
|
SQL 关系型数据库 MySQL
MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复
对于MySQL数据库,可以使用二进制日志(binary log)进行时间点恢复。二进制日志是MySQL中记录所有数据库更改操作的日志文件。要进行时间点恢复,您需要执行以下步骤: 1. 确保MySQL配置文件中启用了二进制日志功能。在配置文件(通常是my.cnf或my.ini)中找到以下行,并确保没有被注释掉: Copy code log_bin = /path/to/binary/log/file 2. 在需要进行恢复的时间点之前创建一个数据库备份。这将作为恢复的基准。 3. 找到您要恢复到的时间点的二进制日志文件和位置。可以通过执行以下命令来查看当前的二进制日志文件和位
|
22天前
|
关系型数据库 MySQL
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
20 0
|
25天前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
20 1
|
25天前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
21天前
|
关系型数据库 MySQL
MySQL查询当天昨天明天本月上月今年等数据
MySQL查询当天昨天明天本月上月今年等数据
19 2
|
11天前
|
关系型数据库 MySQL 数据库
mysql卸载、下载、安装(window版本)
mysql卸载、下载、安装(window版本)