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双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是