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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
29 0
|
7天前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
21 0
|
13天前
|
存储
【Azure Log A workspace】Azure上很多应用日志收集到Log A workspace后如何来分别各自的占比呢?
【Azure Log A workspace】Azure上很多应用日志收集到Log A workspace后如何来分别各自的占比呢?
|
13天前
|
API
【Azure 应用服务】当在Azure App Service的门户上 Log Stream 日志无输出,需要如何操作让其输出Application Logs呢?
【Azure 应用服务】当在Azure App Service的门户上 Log Stream 日志无输出,需要如何操作让其输出Application Logs呢?
|
16天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
69 2
|
11天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
15天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
12天前
|
人工智能 小程序 关系型数据库
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
本文以热门游戏《黑神话:悟空》为契机,深入浅出地解析了数据库事务的四种隔离级别:读未提交、读已提交、可重复读和串行化。通过具体示例,展示了不同隔离级别下的事务行为差异及可能遇到的问题,如脏读、不可重复读和幻读等。此外,还介绍了在MySQL中设置隔离级别的方法,包括全局和会话级别的调整,并通过实操演示了各隔离级别下的具体效果。本文旨在帮助开发者更好地理解和运用事务隔离级别,以提升数据库应用的一致性和性能。
78 2
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
|
17天前
|
数据可视化 关系型数据库 MySQL
Mysql8 如何在 Window11系统下完成跳过密钥校验、完成数据库密码的修改?
这篇文章介绍了如何在Windows 11系统下跳过MySQL 8的密钥校验,并通过命令行修改root用户的密码。
Mysql8 如何在 Window11系统下完成跳过密钥校验、完成数据库密码的修改?
|
15天前
|
SQL 关系型数据库 MySQL
【MySQL 慢查询秘籍】慢SQL无处遁形!实战指南:一步步教你揪出数据库性能杀手!
【8月更文挑战第24天】本文以教程形式深入探讨了MySQL慢SQL查询的分析与优化方法。首先介绍了如何配置MySQL以记录执行时间过长的SQL语句。接着,利用内置工具`mysqlslowlog`及第三方工具`pt-query-digest`对慢查询日志进行了详细分析。通过一个具体示例展示了可能导致性能瓶颈的查询,并提出了相应的优化策略,包括添加索引、缩小查询范围、使用`EXPLAIN`分析执行计划等。掌握这些技巧对于提升MySQL数据库性能具有重要意义。
46 1
下一篇
DDNS