【MySQL 数据宝典】【磁盘结构】- 004 redolog 重做日志

一、背景介绍

  • 持久性要求: 对于已提交的事务,即使系统发生崩溃,其对数据库的更改也不能丢失。
  • 问题:
    • 在事务提交前将所有修改的页面刷新到磁盘浪费资源。
    • 随机IO导致刷新速度慢。
  • 解决方案:
    • 【数据副本】记录事务执行过程中所做的修改,称为 Redo 日志。
    • 【顺序写入】Redo Log 就是 WAL
  • 什么是 WAL:
    • WAL 的全称是 Write-Ahead Logging,中文称为预写式日志,是一种数据安全写入机制。在 MySQL 中,redo log 就是采用了 WAL 机制。
    • 为什么使用WAL?
      • 磁盘的写操作是随机 IO,比较耗性能。通过将每一次的更新操作先写入日志中,然后再写入磁盘,就可以将随机写操作转变为顺序写操作,从而提高性能。WAL 的核心在于将随机写转变为了顺序写,降低了客户端的延迟,提升了系统的吞吐量。

二、基本概念

InnoDB 引擎对数据的更新,是先将更新记录写入 redo log 日志,然后在系统空闲的时候或者是按照设定的更新策略再将日志中的内容更新到磁盘之中。这种技术可以大大减少 IO 操作的频率,提升数据刷新的效率。

  • redo log:被称作重做日志,包括两部分:
    • 一个是内存中的日志缓冲:redo log buffer
    • 另一个是磁盘上的日志文件: redo log file
  • 当故障发生致使内存数据丢失后,InnoDB会在重启时,经过重放 redo,将Page恢复到崩溃之前的状态 通过Redo log可以实现事务的持久性 。

三、核心流程

3.1 脏页落盘流程

  • mysql 每执行一条 DML 语句,先将记录写入 redo log buffer ( redo日志记录的是事务对数据库做了哪些修改 ) 。后续某个时间点再一次性将多个操作记录写到 redo log file

22.jpg
当进行数据页的修改操作时:

  • 首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。
  • 页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为CheckPoint的机制刷新回磁盘。

3.2 CheckPoint

如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘。因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时刻。

image.png

  • 文件结构:
    • 可以配置为一组文件,例如,4 个文件,每个文件大小为 1GB,总共可记录 4GB 的操作。
    • 写入时从头开始写,写到末尾后又回到开头,形成循环写的机制。
    • Write Position: 写入偏移量
    • Checkpoint: 检查点
  • 作用:
    • 提速: 缩短数据库的恢复时间
    • 刷脏: 缓冲池不够用时,将脏页刷新到磁盘
    • 崩溃恢复: 重做日志不可用时,刷新脏页。
  • 刷脏的时机:
    • sharp checkpoint:强制落盘。把内存中所有的脏页都执行落盘操作。只有当关闭数据库之前才会执行
    • fuzzy checkpoint:模糊落盘。把一部分脏页执行落盘操作
      • 【定期执行】Master Thrad Checkpoint 主线程定时将脏页写入磁盘 每秒或每10s执行一次脏页。
      • 【脏页淘汰】FLUSH_LRU_LIST buffer pool有脏页换出,执行落盘
      • 【redo log 满】Async/Sync Flush checkpoint 当redo log快写满的时候执行落盘
        • 当redo log超过75%小于90%会执行异步落盘
        • 当redo log超过90%,会执行同步落盘操作。会阻塞写操作。
    • 【脏页占比过高】Dirty Page too much checkpoint 如果buffer pool中脏页太多,脏页率超过75%执行落盘
  • 总结: CheckPoint机制的重要性在于确保数据库系统在发生宕机或异常情况时能够快速恢复到一个一致的状态,同时有效管理缓冲池中的脏页。

3.3 Redo Log 持久化

缓冲区数据一般情况下是无法直接写入磁盘的,中间必须经过操作系统缓冲区( OS Buffer )。因此, redo log buffer 写入 redo logfile 实际上是先写入 OS Cache,然后再通过系统调用 fsync() 将其刷到 redo log file.

23.jpg44.jpg

  1.  存在于redo log buffer 内存区域中 
  2.  向磁盘写入,但是没有真正写入磁盘,而是保存在文件系统缓存中 
  3.  持久化到磁盘 

Redo Buffer 持久化到 redo log 的策略,可通过Innodb_flush_log_at_trx_commit 设置:

参数值含义
0 (延迟写)事务提交时不会将 redo log buffer中日志写入到 os buffer,而是每秒写入 os cache并调用 fsync()写入到 redo log file中。也就是说设置为0时是(大约)每秒刷新写入到磁盘中的,当系统崩溃,会丢失1秒钟的数据。
1  (实时写,实时刷)事务每次提交都会将 redo log buffer中的日志写入 os cache并调用 fsync()刷到 redo log file中。这种方式即使系统崩溃也不会丢失任何数据,但是因为每次提交都写入磁盘,IO的性能较差。
2 (实时写, 延时刷)每次提交都仅写入到 os buffer,然后是每秒调用 fsync()os cache中的日志写入到 redo log file
  • 一般建议选择取值 1,数据不会丢
  • 这里类似于 RocketMQ 内存写成功,但是刷盘失败: rocketmq 最佳实践

这意味着在事务提交后,数据页的修改可能仍然在内存中,并没有立即刷新到磁盘上。MySQL会根据自身的策略将内存中的数据页刷新到磁盘,这个过程可能会在事务提交后的某个时间点发生。

问题: 如果事务没有提交的时候,redo log buffer中的部分日志有可能被持久化到磁盘吗 ?
回答: 以下两种场景都会触发持久化

  • redo log buffer 占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程会主动写盘。
  • 并行的事务提交的时候,顺带将某个未提交的事务的redo log buffer 持久化到磁盘。因为redo log buffer 是共享的,因此一些正在执行中的事务的redo log信息也有可能被持久化到磁盘中。

3.3.1 Redo Log 日志格式

日志类型描述举例
物理日志记录每个页中存储的具体值及修改操作某个事物将系统表空间中的第100个页面中偏移量为1000处的那个字节的值1改为2.
逻辑日志记录数据变动的逻辑过程或SQL语句把一个page页中的一个数据从1改为2,再从2改为3,逻辑日志就会记录1->2,2->3这个数据变化的过程.

类似于 AOF & RDB 的区别,感兴趣的可以看 Redis 部分。

通用结构

image.png

  1. **type**: 该条日志的类型
  2. **space ID** : 表空间ID
  3. **page number** : 页号
  4. **data** : 该条redo日志的具体内容
日志类型

redo log根据在页面中写入数据的多少,将redo日志划分为几种不同的类型(MySQL5.7中有53种类型)。

  • MLOG_1BYTE (type=1) : 表示在页面的某个偏移量处写入1字节的redo日志类型。
  • MLOG_2BYTE (type=2) : 表示在页面的某个偏移量处写入2字节的redo日志类型。
  • MLOG_4BYTE (type=4) : 表示在页面的某个偏移量处写入 4字节 的redo日志类型。
  • MLOG_8BYTE (type=8) : 表示在页面的某个偏移量处写入8字节的redo日志类型。

25.jpg

  • MLOG_WRITE_STRING(type=30): 表示在页面的某个偏移量处写入一串数据,但是因为不能确定写入的具体数据占用多少字节,所以需要在日志结构中添加一个len字段。

26.jpg

3.4 组提交

  • MySQL 为了优化磁盘持久化的开销,会有一个 组提交(group commit)的机制
  • 每个InnDB存储引擎至少有1个重做日志文件组(group),每个文件组下至少有两个重做日志文件,默认的为ib_logfile0ib_logfile1
    • redo log 的组提交(group commit)是一种优化策略,用于提高数据库的性能和吞吐量。在 MySQL 中,redo log 的组提交是指将多个事务的提交操作合并成一个批量提交操作,从而减少磁盘 IO 操作的次数,提高系统的效率。
    • 具体来说,当多个事务同时提交时,MySQL 可以将它们的提交操作合并成一个组,然后一次性将这个组的提交操作写入到 redo log 文件中。这样做的好处是可以减少磁盘 IO 操作的次数,因为将多个提交操作合并成一个批量提交操作后,可以减少文件系统的写入开销和磁盘的随机写入次数,从而提高系统的性能和吞吐量。
  1. 事务日志组路径,当前目录表示MyQSL数据目录为日志组目录.
mysql> show variables like 'innodb_log_group_home_dir';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | ./    |
+---------------------------+-------+
1 row in set (0.00 sec)

[root@localhost mysql]# ll ib_log*
-rw-r----- 1 mysql mysql 50331648 1月  29 03:39 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 7月  11 2020 ib_logfile1
  1. 事务日志组中的事务日志文件个数,默认是2个.
mysql> show variables like 'innodb_log_files_in_group';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_files_in_group | 2     |
+---------------------------+-------+
1 row in set (0.01 sec)
  1. 日志组中每个重做日志的大小一致,并循环使用;
mysql> show variables like 'innodb_log_file_size';
+----------------------+----------+
| Variable_name        | Value    |
+----------------------+----------+
| innodb_log_file_size | 50331648 |
+----------------------+----------+
1 row in set (0.00 sec)

image.png
InnoDB 以环型方式(circular fashion)写入数据到重做日志文件,当文件满了的时候,会自动切换到日志文件2,当重做日志文件2也写满时,会再切换到重做日志文件1

  • write pos: 表示日志当前记录的位置,当ib_logfile_4写满后,会从ib_logfile_1从头开始记录;
  • check point: 表示将日志记录的修改写进磁盘,完成数据落盘,数据落盘后checkpoint会将日志上的相关记录擦除掉,即 write pos -> checkpoint  之间的部分是redo log空着的部分,用于记录新的记录,checkpoint -> write pos 之间是redo log 待落盘的数据修改记录
  • 如果 write pos 追上 checkpoint,表示写满,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。

Redo log 记录了事务对数据库做了哪些修改,属于物理日志,包括不同类型的日志记录,如 MLOG_1BYTE、MLOG_2BYTE、MLOG_4BYTE、MLOG_8BYTE 和 MLOG_WRITE_STRING。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/568465.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Meachines][Easy]Bizness

Main $ nmap -p- 10.10.11.252 --min-rate 1000 $ dirsearch -u https://bizness.htb/ $ whatweb https://bizness.htb/control/login 存在一个未授权的RCE $ git clone https://github.com/jakabakos/Apache-OFBiz-Authentication-Bypass.git $ cd Apache-OFBiz-Authenticat…

java:观察者模式

java:观察者模式 1 前言 观察者模式,又被称为发布-订阅(Publish/Subscribe)模式,他定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所…

Visual Studio2022中使用水晶报表

1.创建水晶报表项目 选择需要的表 自动生成连接 选项:可跳过 后续还有一些 都能跳过 看你自己的需求 自己选的样式 自动生成 查看你的数据源,在选择数据集时已经有啦 不懂得可以看上集 字段可以直接拖,页面上的都是初始化选过的 点击生成 成功…

【系统架构师】-选择题(一)

1、信息系统规划方法中,关键成功因素法通过对关键成功因素的识别,找出实现目标所需要的关键信息集合,从而确定系统开发的 (优先次序) 。关键成功因素来源于组织的目标,通过组织的目标分解和关键成功因素识别…

docker容器内彻底移除iptables服务的实现方法

背景 我创建的容器使用的是centos6的标准镜像,所以内置了iptables服务。容器启动后iptables服务默认就启动了。iptables设置的规则默认是所有流量都无法通行。而对于服务器的管理使用的是宿主机的防火墙。这样就导致在实现用iptables动态给容器添加端口映射时不成功…

关于C++STL的总结(基础使用和底层原理)

STL是什么? STL即(Standard Template Library)标准模板库,提供了常见的数据结构和算法函数等,其下共包含六大组件: 容器算法迭代器仿函数适配器空间配置器 本篇重点介绍容器的使用和简单的底层实现原理&…

推荐六款图片编辑软件

图片编辑、抠图、拼图、压缩、放大、加字体、转格式等各种功能应有尽有,收藏这一篇就够了! 综合编辑:图片编辑助手 这是一款电脑软件,里面有超多图片处理功能,压缩图片到指定大小、消除任意位置的图片水印、按指定大小…

【C++】---STL之vector的模拟实现

【C】---STL之vector的模拟实现 一、vector在源码中的结构:二、vector类的实现:1、vector的构造2、析构3、拷贝构造4、赋值运算符重载5、迭代器6、operator[ ]7、size()8、capacity()9、reserve()10、resize()11、empty()12、push_back()13、pop_back()1…

如何在PostgreSQL中设置自动清理过期数据的策略

文章目录 方法一:使用临时表和定期清理步骤:示例代码:创建临时表:定期清理脚本(bash psql): 方法二:使用分区表和定期清理步骤:示例代码:创建分区表&#xf…

《内向者优势》:不要低估一个内向的人

#世界读书日 作者主页: 🔗进朱者赤的博客 精选专栏:🔗经典算法 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名) ❤…

Redis篇:缓存更新策略最佳实践

前景: 缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致缓存中的数据过多,所以redis会对部分数据进行更新,或者把他叫为淘汰更合适&a…

Vue3的监听属性watch和计算属性computed

监听属性watch 计算属性computed 一、监听属性watch watch 的第一个参数可以是不同形式的“数据源,watch 可以监听以下几种数据: 一个 ref (包括计算属性)、 一个响应式对象、 一个 getter 函数、 或多个数据源组成的数组 watch 的参数:监视的回调&…

代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

860. 柠檬水找零 思路: 只需要维护三种金额的数量,5,10和20。 有如下三种情况: 情况一:账单是5,直接收下。情况二:账单是10,消耗一个5,增加一个10情况三:…

好友关注-实现分页查询收邮箱

9.5好友关注-实现分页查询收邮箱 需求:在个人主页的“关注”卡片中,查询并展示推送的Blog信息: 具体操作如下: 1、每次查询完成后,我们要分析出查询出数据的最小时间戳,这个值会作为下一次查询的条件 2…

考研党打印资料怎么使用云打印服务?

对于准备考研的同学们来说,在备考的时候需要准备许多资料,这些资料的打印费用成为了考研党的巨额支出。那么在生活费有限的情况下,考研党打印资料最好是选择云打印服务,因为易绘创云打印服务低至5分钱/页还包邮。那么考研党打印资…

Pytest精通指南(28)钩子函数-测试报告(pytest-html)

文章目录 前言应用场景插件安装参数分析使用方法拓展-定制化报告 前言 在软件开发过程中,测试是确保代码质量的关键环节。 而测试报告则是测试过程中不可或缺的输出物,它为我们提供了关于测试用例执行情况的详细信息,帮助我们快速定位和解决问…

服务器(AIX、Linux、UNIX)性能监视器工具【nmon】使用介绍

目录 ■nmon简介 1.安装 2.使用简介 3.使用(具体使用的例子【CPU】【内存】) 4.采集数据 5.查看log(根据结果,生成报表) 6.分析结果 ■nmon简介 nmon("Nigels performance Monitor"&…

比特币成长的代价

作者:Jeffrey Tucker,作家和总裁。曾就经济、技术、社会哲学和文化等话题广泛发表演讲。编译:秦晋 2017 年之后参与比特币市场的人遇到了与之前的人不同的操作和理想。如今,没有人会太在意之前的事情,说的是 2010-2016…

SL3038 耐压150V恒压芯片 60V降24V 72V降12V降压IC

SL3038 是一款恒压芯片,其耐压值为 150V。这意味着它可以在高达 150V 的电压下工作而不会损坏。现在,让我们来讨论您提到的两个降压应用:从 60V 降到 24V 和从 72V 降到 12V。 1. 60V 降到 24V: 输入电压:60V 输出电…

02 IO口的操作

文章目录 前言一、IO的概念1.IO接口2.IO端口 二、CPU和外设进行数据传输的方法1.程序控制方式1.1 无条件1.2 查询方式 2.中断方式3.DMA方式 一、方法介绍和代码编写1.前置知识2.程序方式1.1 无条件方式1.1.1 打开对应的GPIO口1.1.2 初始化对应的GPIO引脚1.1.2.1 推挽输出1.1.2.…