【Mysql系列】(二)日志系统:一条更新语句是如何执行的(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【Mysql系列】(二)日志系统:一条更新语句是如何执行的

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

这篇文章是从Github ReadMe拷贝的,内容实践下载是没问题的,能够正常发送短信,而且也不需要服务器,本地也能跑起来

首发博客地址

系列文章地址


上篇文章我们介绍了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。

那么,一条语句的更新流程是什么样的?

MySQL可以恢复到半个月内任意一秒的状态,是怎么做到的?

我们先复习下查询流程

这里我们需要注意的是,更新语句的流程和查询流程有两个区别,更新流程涉及两个重要的日志模块:

  • redo log(重做日志)
  • binlog(归档日志)

相信大家在这个面试,学习MySQL的过程中都反复听到这两个词

WAL技术

在MySQL中,WAL(Write-Ahead Logging)技术是一种常用的持久化数据的机制,用于确保数据库的事务操作能够持久化到磁盘并保持数据的一致性。WAL技术的核心思想是在事务进行修改之前,「先将修改操作记录到日志中,然后再将修改应用到数据库中」

具体来说,MySQL中的WAL技术主要包括以下几个组件和步骤:

  1. Redo Log(重做日志):Redo Log是一种事务日志,用于记录数据库中发生的修改操作。在事务提交之前,MySQL会将修改操作写入Redo Log,而不是直接写入磁盘。这样可以提高性能,因为磁盘写入是相对较慢的操作。
  2. Write-Ahead Logging(预写式日志):WAL技术要求在事务提交之前,Redo Log必须先写入磁盘,然后再将修改操作应用到数据库中。这样即使在事务提交后发生系统崩溃,MySQL也可以通过Redo Log来恢复数据。
  3. Redo Log Buffer(重做日志缓冲区):Redo Log Buffer是一个内存缓冲区,用于暂存待写入Redo Log的修改操作。当事务提交时,Redo Log Buffer中的内容会被刷新到磁盘的Redo Log文件中。
  4. Checkpoint(检查点):Checkpoint是一个标记点,表示在这个点之前的所有事务已经持久化到磁盘。MySQL会定期将Checkpoint的位置更新到磁盘,以确保已经持久化的数据不会丢失。
  5. Crash Recovery(崩溃恢复):当数据库发生崩溃或重启时,MySQL会通过读取Redo Log来恢复数据的一致性。它会按照Redo Log中的顺序,将每个事务的修改操作重新应用到数据库中,以还原数据的最新状态。

WAL技术的优点是可以提高数据库的性能和可靠性。通过将修改操作先记录到Redo Log中,可以避免频繁地写入磁盘,从而提高性能。同时,WAL技术还可以确保数据的持久性和一致性,即使在系统崩溃或断电的情况下也能够恢复数据。

MySQL中的WAL技术通过使用Redo Log和预写式日志的机制,确保事务的修改操作能够持久化到磁盘并保持数据的一致性。它是一种提高性能和可靠性的重要技术。

Redo log执行流程

  1. 当一个事务开始时,MySQL会为该事务分配一个唯一的事务ID,并将该事务的相关信息存储在内存中的事务控制块(Transaction Control Block,TCB)中。
  2. 在事务执行过程中,所有的修改操作都会被写入redo log缓冲区。这些修改操作包括插入、更新和删除等操作。
  3. 当事务提交时,MySQL会将该事务的所有修改操作按照顺序写入redo log文件中。这些修改操作会被写入到redo log缓冲区,然后通过后台线程定期将缓冲区中的内容刷新到磁盘上的redo log文件中。这个过程称为redo log的刷新。
  4. 在事务提交之前,MySQL会将redo log的刷新操作和数据页的刷新操作进行协调,以保证数据的一致性。这是通过使用write-ahead logging(预写式日志)的机制来实现的。即在事务提交之前,redo log必须先写入磁盘,然后再将修改操作应用到数据库中。
  5. 当数据库发生崩溃或重启时,MySQL会在启动过程中读取redo log文件,并将其中的修改操作重新应用到数据库中,以恢复数据的一致性。这个过程称为崩溃恢复。

Write Pos和CheckPoint

在MySQL的redo log中,有两个重要的概念:write pos(写入位置)和checkpoint(检查点)。

  1. Write Pos(写入位置):Write Pos是指当前事务写入redo log的位置。当一个事务提交时,其修改操作会被写入redo log中的某个位置,Write Pos指向这个位置。下一个事务的修改操作将会从Write Pos指向的位置开始写入。
  2. Checkpoint(检查点):Checkpoint是指一个标记点,表示在这个点之前的所有事务已经持久化到磁盘。当一个事务提交时,它的修改操作会被写入redo log,并且会更新Checkpoint的位置。这样,在Checkpoint之前的redo log中的操作可以被认为是已经持久化到磁盘的。

Checkpoint的作用是用于数据库的恢复和崩溃恢复。当数据库发生崩溃或重启时,MySQL会从Checkpoint的位置开始,读取redo log中的操作,并将其应用到数据库中,以还原数据的一致性。

Write Pos和Checkpoint之间的关系是,Write Pos会不断向前移动,指向最新的写入位置,而Checkpoint会根据一定的策略进行更新,以标记已经持久化到磁盘的操作。

需要注意的是,Write Pos和Checkpoint的位置是相对于redo log文件的偏移量,而不是绝对的字节位置。它们的值通常以字节为单位,表示相对于redo log文件起始位置的偏移量。

Write Pos表示当前事务写入redo log的位置,Checkpoint表示已经持久化到磁盘的操作的位置。Write Pos会不断向前移动,而Checkpoint会根据一定的策略进行更新,用于数据库的恢复和崩溃恢复。

Redo log是固定大小的,超出会发生什么

当redo log的固定大小不足以容纳新的修改操作时,MySQL会触发一个称为"redo log空间不足"的错误。在这种情况下,MySQL会停止新的事务提交,直到有足够的空间来写入redo log。

为了解决redo log空间不足的问题,可以采取以下几种方法:

  1. 增加redo log的大小:可以通过修改MySQL的配置参数innodb_log_file_size来增加每个redo log文件的大小。增加redo log的大小可以提供更多的空间来存储修改操作,从而延长redo log的使用寿命。
  2. 增加redo log文件的数量:可以通过修改MySQL的配置参数innodb_log_files_in_group来增加redo log文件组中的文件数量。增加文件数量可以增加redo log的总大小,从而提供更多的空间来存储修改操作。
  3. 提交事务并清空redo log:如果当前的事务已经提交,但redo log空间不足,可以尝试手动提交其他未提交的事务,以释放redo log空间。这可以通过执行COMMIT语句来提交事务。
  4. 优化事务的写入操作:可以通过优化事务的写入操作,减少对redo log的写入量。例如,可以合并多个小事务为一个大事务,减少redo log的写入次数。

需要注意的是,增加redo log的大小或数量可能会增加系统的负载和崩溃恢复的时间。因此,在调整redo log大小时,需要综合考虑系统的性能和可靠性需求,并进行充分的测试和验证。

什么是binlog日志

Binlog(二进制日志)是MySQL的服务器层产生的一种日志,用于记录数据库中的所有修改操作,包括数据定义语言(DDL)和数据操作语言(DML)等操作。

Binlog以二进制格式记录了对数据库的逻辑修改操作,而不是直接记录对数据页的具体修改。它包含了一系列的事件(Event),每个事件都代表了一个数据库操作,如插入、更新、删除等。

Binlog的主要作用是用于「数据复制和恢复」。通过将Binlog传递给其他MySQL实例,可以实现数据的复制和同步。其他MySQL实例可以读取Binlog中的事件,并将其中的修改操作应用到自己的数据库中,从而实现数据的复制和同步。

此外,Binlog也可以用于数据恢复。在误操作、数据丢失或灾难恢复的情况下,可以通过读取Binlog来还原数据。通过逐个回放Binlog中的事件,可以将数据库恢复到特定的时间点或特定的操作之前的状态。

Binlog是追加写入的,不会被重复使用,以保留完整的修改历史。它可以通过配置参数进行启用和配置,包括指定Binlog的存储位置、设置Binlog的大小和保留时间等。

为什么MySQL会有两个日志,redo log和binlog?

MySQL之所以同时使用redo log和binlog两个日志,是因为它们具有不同的功能和用途。

  1. Redo Log(重做日志):
  • 功能:Redo log是InnoDB存储引擎特有的日志,用于保证事务的持久性和一致性。它记录了数据库中发生的修改操作,包括插入、更新和删除等操作。
  • 作用:在数据库崩溃或重启时,通过读取redo log来恢复数据的一致性。它可以将未持久化到磁盘的修改操作重新应用到数据库中,以还原数据的最新状态。
  • 特点:redo log是 「物理日志」,记录了对数据页的具体修改操作。它是循环写入的,可以重复使用,以减少磁盘IO的开销。
  1. Binlog(二进制日志):
  • 功能:Binlog是MySQL的服务器层产生的日志,记录了数据库中的所有修改操作,包括数据定义语言(DDL)和数据操作语言(DML)等操作。
  • 作用:Binlog主要用于数据复制和恢复。它可以被其他MySQL实例读取,并将其中的修改操作应用到自己的数据库中,实现数据的复制和同步。同时,Binlog也可以用于数据恢复,例如在误操作或数据丢失时,可以通过读取Binlog来还原数据。
  • 特点:Binlog是 「逻辑日志」,记录了对数据的逻辑修改操作。它是追加写入的,不会被重复使用,以保留完整的修改历史。

redo log保证了事务的持久性和一致性,而binlog则提供了数据复制和恢复的功能。它们共同工作,确保了MySQL数据库的数据安全和可靠性。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
207 90
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
37 16
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
38 10
图解MySQL【日志】——两阶段提交
两阶段提交是为了解决Redo Log和Binlog日志在事务提交时可能出现的半成功状态,确保两者的一致性。它分为准备阶段和提交阶段,通过协调者和参与者协作完成。准备阶段中,协调者向所有参与者发送准备请求,参与者执行事务并回复是否同意提交;提交阶段中,若所有参与者同意,则协调者发送提交请求,否则发送回滚请求。MySQL通过这种方式保证了分布式事务的一致性,并引入组提交机制减少磁盘I/O次数,提升性能。
62 4
图解MySQL【日志】——两阶段提交
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
50 5
图解MySQL【日志】——Redo Log
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
28 4
MySQL日志
本文介绍了MySQL中三个重要的日志:binlog、redolog和undolog。binlog记录数据库更改操作,支持数据恢复、复制和审计;redolog保证事务的原子性和持久性,实现crash-safe;undolog用于事务回滚及MVCC的实现。每个日志都有其独特的作用和应用场景,确保数据库的稳定性和数据一致性。
图解MySQL【日志】——磁盘 I/O 次数过高时优化的办法
当 MySQL 磁盘 I/O 次数过高时,可通过调整参数优化。控制刷盘时机以降低频率:组提交参数 `binlog_group_commit_sync_delay` 和 `binlog_group_commit_sync_no_delay_count` 调整等待时间和事务数量;`sync_binlog=N` 设置 write 和 fsync 频率,`innodb_flush_log_at_trx_commit=2` 使提交时只写入 Redo Log 文件,由 OS 择机持久化,但两者在 OS 崩溃时有丢失数据风险。
59 3
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等