图解MySQL【日志】——Redo Log

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。

Redo Log(重做日志)

为什么需要 Redo Log?

1. 崩溃恢复

  • 数据库崩溃时,系统通过 Redo Log 来恢复尚未写入磁盘的数据。Redo Log 记录了所有已提交事务的操作,系统在重启后会重做这些操作,以保证数据不会丢失。

2. 提高性能

  • 使用 Redo Log 可以避免每次修改都立即写入磁盘(随机写),而是先将修改操作写入 Redo Log(顺序写),然后将数据写入内存,最后再异步地将数据写入磁盘,减少了磁盘 I/O 的次数,提高了性能。

3. 事务一致性

  • 即使数据库在执行过程中崩溃,Redo Log 也可以帮助恢复所有已提交的事务,确保数据库恢复到一致(Consistency)的状态。

Redo Log 是什么?

  • Redo Log 是物理日志,记录了某个数据页做了什么修改,如对 AAA 表空间中的 BBB 数据页 CCC 偏移量的地方做了 DDD 更新,每当执行一个事务,就会产生一条或多条物理日志。
  • 在事务提交时,只要保证 Redo Log 被持久化到磁盘即可,可以不需要等到将缓存在 Buffer Pool 里的脏页数据持久化到磁盘。即使系统崩溃,Redo Log 已完成持久化,等待 MySQL 重启后,可以根据 Redo Log 的内容,将所有数据恢复到最新状态。

WAL(Write-Ahead Logging)技术

核心思想

  • 先写日志:修改数据之前,先将修改操作记录到日志文件中,之后择机再写到磁盘中。
  • 崩溃恢复:这样即使崩溃,数据也能通过日志恢复到一致的状态。
  • 顺序写 VS 随机写:Redo Log 采用顺序循环写的方式,写入磁盘的速度远大于直接写入磁盘的顺序写方式。

过程如图


Redo Log 的持久化过程

1. Redo Log Buffer

  • 在事务执行过程中,产生的 Redo Log 也不是直接刷盘的,而是先写入 Redo Log Buffer,后续再择机刷入磁盘中。
  • 默认大小为 16MB,可通过 innodb_log_Buffer_size 参数动态调整大小,增大时,可以让 MySQL 处理【长事务】时不必写入磁盘,提升写 I/O 性能。

2. Redo Log 什么时候刷盘?

缓存在 Redo Log Buffer 中的 Redo Log 还是在内存中,刷盘时机如下:

  • MySQL 正常关闭时。
  • Redo Log Buffer 中记录的写入量大于总内存空间(由 innodb_log_Buffer_size 控制)的一半时,触发落盘。
  • 超过一半就落盘的原因:在性能数据安全之间找到一个平衡点。
  • InnoDB 的后台线程每隔 1s,将 Redo Log Buffer 持久化到磁盘。
  • 每次提交事务时,将 Redo Log Buffer 持久化到磁盘,由 innodb_flush_log_at_trx_commit 参数控制。

3. innodb_flush_log_at_trx_commit 参数

决定 Redo Log 的刷盘时机。

0 :每次事务提交,将 Redo Log 留在 Redo Log Buffer 中,该模式下,事务提交时不会主动触发落盘操作。

  • 写入磁盘时机:等待 InnoDB 后台线程每隔 1s,先写入 OS 的 Page Cache,后调用 fsync() 持久化到磁盘。
  • 数据安全性:MySQL 崩溃时,会导致上 1s 所有事务数据丢失

1(默认):每次事务提交,将缓存在 Redo Log Buffer 中的 Redo Log 直接持久化到磁盘中。

  • 安全性:该模式可以保证 MySQL 异常重启后,数据不会丢失。

2:每次事务提交时,都只将缓存在 Redo Log Buffer 中的 Redo Log 写到 Redo Log 文件(OS 的 Page Cache,系统文件缓存),而非磁盘。

  • 写入磁盘时机:等待 InnoDB 后台线程每隔 1s,调用 fsync() 将 Page Cache 中的 Redo Log 持久化到磁盘。
  • 数据安全性:MySQL 崩溃时不会导致数据丢失,只有在 OS 崩溃或系统断电的情况下,丢失上 1s 所有事物数据

数据安全性对比:参数 1 > 参数 2 > 参数 0


写入性能对比:参数 1 < 参数 2 < 参数 0


每种参数对应的写入过程

4. Redo Log 怎样写入?

重做日志文件组(Redo Log Group):

  • 默认情况下,InnoDB 存储引擎有一个 Redo Log Group,该重做日志文件组由 2 个 Redo Log 文件组成,且每个 Redo Log File 的大小固定且一致,如下图

循环写:

  • Redo Log Group 是以循环写方式工作的,即从头开始写,写到末尾再循环到开头,相当于环形。

  • 具体过程:Redo Log 是避免防止 Buffer Pool 中的脏页丢失而设计的,但随着系统运行,Buffer Pool 中的脏页逐步被刷新到磁盘中,Redo Log 也需要更新自己的空间,擦除已刷新到磁盘中的旧记录,为新的脏页数据腾出空间。
  • write pos:Redo Log 当前记录写到的位置。
  • check point:表示当前要擦除的位置。
  • write pos~check point(红色部分):用来记录新的更新操作。
  • write pos 追上 check point 时表示 Redo Log 文件已满,这时 MySQL 不能执行新的更新操作,即被阻塞(故大并发量的系统,将 Redo Log 文件大小设置为适当的值很有必要),此时会停下来将 Buffer Pool 中的脏页数据刷新到磁盘中,然后标记 Redo Log 哪些记录可以被擦除,接着对旧 Redo Log 记录进行擦除,等擦除完成并腾出空间后,check point就会往后移动,MySQL 恢复正常,继续执行新的更新操作。
  • check point~write pos(蓝色部分):待落盘的脏数据页记录。
  • 一次 check point 的过程就是脏页数据刷新到磁盘中变成干净页,然后标记 Redo Log 记录中哪些记录可以被覆盖的过程。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
20天前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
1月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
118 13
|
1月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
43 4
|
1月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
141 0
|
1月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
1月前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
348 82
|
5天前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
10天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
9天前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
3月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决

热门文章

最新文章

下一篇
oss创建bucket