MySQL的WAL机制

2023-11-07 04:10
文章标签 mysql 机制 database wal

本文主要是介绍MySQL的WAL机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MySQL的WAL机制

WAL全称为Write-Ahead Logging,预写日志系统。其主要是指MySQL在执行写操作的时候并不是立刻更新到磁盘上,而是先记录在日志中,之后在合适的时间更新到磁盘中。日志主要分为undo log、redo log、binlog。
当内存数据页跟磁盘数据页内容不一致的时候,我们成这个内存页为“脏页”。内存数据写入磁盘后,内存和磁盘上的数据页内容就一致了,称为“干净页”。
MySQL真正使用WAL的原因是:磁盘的写操作是随机IO,比较耗性能,所以如果把每一次的更新操作都先写入log中,那么就成了顺序写操作,实际更新操作由后台线程再根据log异步写入。这样对于client端,延迟就降低了。并且,由于顺序写入大概率是在一个磁盘块内,这样产生的IO次数也大大降低。所以WAL的核心在于将随机写转变为了顺序写,降低了客户端的延迟,提升了吞吐量。

Undo log(逻辑性日志)

undo log撤销,回滚。当事务回滚或者数据库崩溃的时候,可以利用undo log撤销未提交的事务对数据库产生的影响。
undo log产生和销毁:在事务开始前产生;事务在提交时,并不会立刻删除undo log,innodb会将该事物对应的undo log放入到删除列表中,后面会通过后台线程purge thread进行回收。undo log属于逻辑日志,记录一个变化过程。例如执行一个delete语句,undo log会记录一个insert。
undo log 存储:undo log采用段的方式进行管理和记录。在innodb数据文件中会包含一种rollback segment 回滚段,内部包含1024个undo log段。
undo log 的作用

  1. 实现事务的原子性
  2. 实现多版本并发控制(MVCC):事务未提交之前,undo log 保存了未提交的之前的版本数据,undo log 中的数据可作为数据旧版本快照供其他并发事务进行快照读,相当于做了 一个备份。
    在这里插入图片描述

Redo log

redo log 保证了事务的原子性和持久性,是InnoDB引擎特有的,记录着事务里对数据的修改。一条SQL修改,很产生一组redo log信息(包括很多条),这一组才是写入redo log 的最小单元。当数据写入到磁盘之后redo log的信息即可释放。
使用redo log的好处

  1. 保证了数据的持久性。
  2. redo log只记录了对数据的修改,数据比一页数据小很多,大大减少了IO频率。
  3. redo log的写入是顺序写入,而修改磁盘采用的是随机写入。

Redo log工作原理
redo log是为了实现事务的持久性而出现的产物。防止在发生故障的时间点,尚有脏页未写入表的IBD文件中,在重启MySQL的时候,根据redo log进行重做,从而达到事务的未入磁盘数据进行持久化这一特性。如果直接持久化到磁盘上,每次提交事务都将持久化到磁盘,这将增大IO频率,降低效率。持久化到redo log 中和磁盘上虽然都是IO操作,但是持久化到redo log是连续写入,而在磁盘是随机的,因此采用redo log 效率较高。
在这里插入图片描述
Redo Log写入机制
Redo log 文件内容是以顺序循环的方式写入文件,写满时则回溯到第一个文件,进行覆盖写。内部有两个指针。
write pos记录当前位置,一边写一边后移,写到最后一个文件末尾后就回到0号文件开头。
checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
write pos和checkpoint中间空着的部分可以用来记录新操作。如果两者重合,证明已经写满,不能执行新的更新操作,需要先擦除一些记录。
在这里插入图片描述

这篇关于MySQL的WAL机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/361169

相关文章

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Mysql DATETIME 毫秒坑的解决

《MysqlDATETIME毫秒坑的解决》本文主要介绍了MysqlDATETIME毫秒坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 今天写代码突发一个诡异的 bug,代码逻辑大概如下。1. 新增退款单记录boolean save = s