理解数据库中的undo日志、redo日志、检查点

2023-05-16

数据库存放数据的文件,本文称其为data file。
数据库的内容在内存里是有缓存的,这里命名为db buffer。某次操作,我们取了数据库某表格中的数据,这个数据会在内存中缓存一些时间。对这个数据的修改在开始时候也只是修改在内存中的内容。当db buffer已满或者遇到其他的情况,这些数据会写入data file。

undo,redo

日志在内存里也是有缓存的,这里将其叫做log buffer。磁盘上的日志文件称为log file。log file一般是追加内容,可以认为是顺序写,顺序写的磁盘IO开销要小于随机写。

Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。下面的示例来自于杨传辉《大数据分布式存储系统 原理解析与架构实践》,略作改动。

例如某一事务的事务序号为T1,其对数据X进行修改,设X的原值是5,修改后的值为15,那么Undo日志为<T1, X, 5>,Redo日志为<T1, X, 15>

也有把undo和redo结合起来的做法,叫做Undo/Redo日志,在这个例子中Undo/Redo日志为<T1, X, 5, 15>

当用户生成一个数据库事务时,undo log buffer会记录被修改的数据的原始值,redo会记录被修改的数据的更新后的值。

redo日志应首先持久化在磁盘上,然后事务的操作结果才写入db buffer,(此时,内存中的数据和data file对应的数据不同,我们认为内存中的数据是脏数据),db buffer再选择合适的时机将数据持久化到data file中。这种顺序可以保证在需要故障恢复时恢复最后的修改操作。先持久化日志的策略叫做Write Ahead Log,即预写日志。

在很多系统中,undo日志并非存到日志文件中,而是存放在数据库内部的一个特殊段中。本文中就把这些存储行为都泛化为undo日志存储到undo log file中。

对于某事务T,在log file的记录中必须开始于事务开始标记(比如“start T”),结束于事务结束标记(比如“end T”、”commit T”)。在系统恢复时,如果在log file中某个事务没有事务结束标记,那么需要对这个事务进行undo操作,如果有事务结束标记,则redo。

在db buffer中的内容写入磁盘数据库文件之前,应当把log buffer的内容写入磁盘日志文件。

有一个问题,redo log buffer和undo log buffer存储的事务数量是多少,是按照什么规则将日志写入log file?如果存储的事务数量都是1个,也就意味着是将日志立即刷入磁盘,那么数据的一致性很好保证。在执行事T时,突然断电,如果未对磁盘上的redo log file发生追加操作,可以把这个事务T看做未成功。如果redo log file被修改,则认为事务是成功了,重启数据库使用redo log恢复数据到db buffer和 data file即可。

如果存储多个的话,其实也挺好解释的。就是db buffer写入data file之前,先把日志写入log file。这种方式可以减少磁盘IO,增加吞吐量。不过,这种方式适用于一致性要求不高的场合。因为如果出现断电等系统故障,log buffer、db buffer中的完成的事务会丢失。以转账为例,如果用户的转账事务在这种情况下丢失了,这意味着在系统恢复后用户需要重新转账。

检查点checkpoint

checkpoint是为了定期将db buffer的内容刷新到data file。当遇到内存不足、db buffer已满等情况时,需要将db buffer中的内容/部分内容(特别是脏数据)转储到data file中。在转储时,会记录checkpoint发生的”时刻“。在故障回复时候,只需要redo/undo最近的一次checkpoint之后的操作。

幂等性问题

在日志文件中的操作记录应该具有幂等性。幂等性,就是说同一个操作执行多次和执行一次,结果是一样的。例如,5*1 = 5*1*1*1,所以对5的乘1操作具有幂等性。日志文件在故障恢复中,可能会回放多次(比如第一次回放到一半时系统断电了,不得不再重新回放),如果操作记录不满足幂等性,会造成数据错误。

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、Redo log、Undo log存放位置
     首先,我们先要知道InnoDB redo log、undo log存放位置。InnoDB的事务日志是指Redo log,简称log,存放在日志文件ib_logfile*里面。而Undo log则是存放在共享表空间文件里面(ibdata*)。
 

2、事务的原子性
      我们知道,InnoDB存储引擎是事务型存储引擎,其具有ACID特性,即:原子性、一致性、隔离性、持久性。Undo log就是为了实现事务的原子性。何为原子性呢?事务的原子性:事务中的所有操作,要么全部完成,要么不作任何操作,不能只做部分操作。如果在执行事务的过程中发生了错误,就要回滚到事务开始前的状态,就好像这个事务从来没执行过一样。
 

3、Undo log原理
      Undo log的原理其实很简单,Undo log是为了满足事务的原子性,当你在数据库中操作任何数据之前,比如你要修改某条记录的数据,InnoDB首先会将数据备份到一个地方(这个存储数据备份的地方就是Undo log)。然后进行数据的修改。如果在执行事务的过程中出现了错误或者用户执行了ROLLBACK(回滚)语句,系统可以利用Undo log中的备份将数据恢复到事务开始前的状态。
      Undo log除了可以保证事务的原子性之外,还可以用来辅助完成事务的持久化。
 

4、事务的持久化
      事务一旦完成,该事务对数据库所做的修改都会持久保存到数据库中。为了保证数据的持久性,MySQL会将修改过的数据完全记录到持久的存储设备上(比如硬盘咯~~)
 

5、用Undo log实现原子性和持久性的事务的简化过程
现在假设我们有两个数据,A=1、B=2
1)事务开始(start transaction  or  set autocommit=0)
2)假设现在我们要修改A记录,那么记录A=1到Undo log
3)现在修改A=3
4)假设现在我们还要修改B记录,那么记录B=2到Undo log
5)现在修改B=4
6)将Undo log日志记录写到磁盘
7)将修改后的数据A=3、B=4写到磁盘
8)提交事务
      这里有一个隐含的前提条件:“因为InnoDB存储引擎把数据和索引都缓存在InnoDB_buffer_pool_size设定的内存缓冲区中,所以当我们修改InnoDB表数据时,会先修改buffer pool中的数据,最后将buffer pool中的数据写入到磁盘。”
      Undo log之所以可以保证事务的原子性和持久性,是因为在上述的简化事务过程中有以下的特点:
a、在更新任何数据前,先把数据的原始状态记录到Undo log;
b、为了保证数据的持久性,必须在提交事务之前先把数据写到磁盘上,只要事务一提交,数据必然持久化到存储设备上;
c、Undo log先于数据持久化到磁盘。如果在上述事务简化过程的 7)~ 8)过程中系统崩溃了,那么Undo log还是完整的,可以用来回滚事务以恢复到事务开始前的状态;
d、如果在上述事务简化过程的 1)~ 6)过程中系统崩溃了,由于修改后的数据并没有持久化到磁盘,所以这并不影响数据库中的数据,数据还是保持在事务开始前的状态。


上述事务简化过程中存在一个缺陷:每个事务提交前都要将数据和Undo log写入磁盘,这样会导致大量的磁盘IO,造成性能低下。
解决办法:如果能够将修改的数据缓存一段时间,就能减少磁盘IO以提高性能。但是这样会丧失事务的持久性。因此就有了另外的一种机制来实现数据的持久化,这就是InnoDB的Redo log。


6、Redo log原理
     和Undo log相反,Redo log记录的是新数据的备份。在事务提交前,只需要将Redo log持久化,不需要将数据数据持久化。当数据库系统崩溃时,虽然数据没有持久化,但是Redo log已经持久化了。在系统从崩溃中恢复时,可以根据Redo log中的内容,将所有的数据恢复到最新的状态。


7、引入了Redo log之后,现在InnoDB存储引擎是Undo log和Redo log协同合作,它们的事务简化过程为:
     假设有A、B两个数据,A=1、B=2
1)事务开始;
2)记录A=1到undo log;
3)修改A=3;
4)记录A=3到redo log;
5)记录B=2到undo log;
6)修改B=4;
7)记录B=4到redo log;
8)将redo log写入磁盘;
9)提交事务。


8、Undo log  +  Redo log事务的特点
1)、为了保证数据的持久性,必须在事务提交前将Redo log持久化到存储设备上;
2)、数据不需要在事务提交前写入磁盘,而是缓存在内存中;
3)、Redo log写入到了磁盘,故可以保证事务的持久性;
4)、Undo log用于错误回滚、保证事务的原子性;
5)、这里有一个隐含的点,就是数据是在事务提交后才写入持久存储设备上的,它是晚于Redo log写入存储设备的。如果数据早于Redo log写入存储设备,那么如果在数据写入存储的过程中发生了错误,Redo log就不能用于重做数据了。
 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解数据库中的undo日志、redo日志、检查点 的相关文章

随机推荐

  • CV小白实践--实现MNIST手写数字识别时遇到的问题

    1 RuntimeError size mismatch m1 800 x 4 m2 320 x 50 问题原因 xff1a 这个问题出现在神经网络最后一层卷积层与第一层全连接层之间 首先来看一下我实现的神经网络的结构 def init s
  • Hbase中Scan数据时的缓存优化以scan 过滤器的使用

    1 缓存优化 在hbase的java api 中 默认在scan 过程中scan next一次进行一次rpc请求 这导致scan的效率很低 设置scan的缓存优化很有必要 1 scan setBatch int 10 设置一次next 返回
  • 人脸识别之人脸检测(三)--Haar特征原理及实现

    本文主要由于OpenCV的haartraining程序 xff0c 对haar特征的补充及代码注释 原文 xff1a http www aiuxian com article p 2476165 html Haar特征的原理是什么 xff1
  • 网络基础(一)【解决mininet中xterm域名无法解析的问题】

    mininet是一个很好用的网络仿真实验平台 xff0c 基于网络命名空间技术的python封装 我是在linux虚拟机中安装了mininet环境 sudo mn mininet gt xterm h1 h2 启动一个xterm程序 xff
  • 多任务学习:Multi-Task Learning as Multi-Objective Optimization

    前言 最近在写一篇文章 xff0c 是一篇深度学习与安全相结合的文章 xff0c 模型的输出会交给两个损失函数 xff08 availability amp security xff09 进行损失计算 xff0c 进而反向传播 起初的想法是
  • 浅析Linux命令之alias

    转自 xff1a http man linuxde net alias 1 作用 用来设置指令的别名 我们可以使用该命令将一些较长的命令进行简化 使用alias时 xff0c 必须使用单引号将原来的命令引起来 xff0c 防止特殊字符导致错
  • Verilog实现串口通讯(UART)

    Verilog实现串口通讯 xff08 UART xff09 本代码参考了野火的相关教程 xff0c 实现了发送和接收回环 xff0c 同时可以通过串口数据控制LED灯的亮灭 xff0c 在电脑发送数据时要选择HEX发送模式 xff0c 发
  • Ubuntu 查看硬盘容量

    在服务器节点上使用硬盘较多 xff0c 被强制清盘多次 xff0c 清盘时需要查看文件夹占用情况 xff0c 并考虑是否重要来决定删除 因此必不可少一些查看硬盘占用的命令 1 du s h 43 路径 du s h 查看home目录下占用总
  • Matlab R2018a初始化问题

    前几天装的MATLAB2018 xff08 我装在C盘 xff0c 用的是在线安装 xff0c 自己下的License 破解了 xff09 xff0c 但是初始化问题一直没解决 xff0c 下面显示我遇到的问题 xff1a 等4 5分钟才就
  • vnc view安装与使用

    vnc view安装与使用 1 安装 vnc远程连接 xff0c 需要在服务器端安装vnc server 在客户端安装vnc viewer 这里我主要是研究如何在自己的电脑安装vnc viewer xff0c 来远程连接服务器 1 xff0
  • 温度传感器DS18B20-第2季第1部分-朱有鹏-专题视频课程

    温度传感器DS18B20 第2季第1部分 1700人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第2季第1个课程 xff0c 主要讲解单片机系统中常用的温度传感器DS18B20 本课程的目标是让大家进一步掌握时序的分析和编
  • Shell删除某个文件夹下指定字符开头的所有文件

    工作中遇到过日志文件夹里面存放的日志数量太多 xff0c 直接使用rm rf 删除提示参数太多 xff0c 其实是因为要删除的文件太多 xff0c 没法一次全部删除 xff0c 具体rm rf能够一次删除的数量是多少就不知道了 xff0c
  • Ubuntu 11.10 远程桌面Windows设置

    升级到Ubuntu 11 10时原来远程客户端tsclient不能用了 xff0c 那么怎么办 xff1f 两个途径可以 xff1a 1 Remmina远程桌面客户端 xff0c 如果在互联网下没有 xff0c 在新立得下安装即可 设定几乎
  • 模型的学习方式-迁移学习、多任务学习、小样本学习、元学习

    前言 无论是有监督学习还是无监督学习 半监督学习 无论算法是什么 xff0c 一直感觉机器学习 深度学习模型都是一种数据驱动的 换句话说 xff0c 足够且有质量的数据 xff0c 才能让模型学到一定的知识 xff0c 达到比较理想的效果
  • 【CVPR2019_论文汇总】(按方向划分,0401 更新中)

    转载链接 xff1a http bbs cvmart net topics 302 cvpr2019paper 作为计算机视觉领域三大顶会之一 xff0c CVPR2019 xff08 2019 6 16 6 19在美国洛杉矶举办 xff0
  • 基于MATLAB的卷积神经网络车牌识别系统

    车牌识别是基于车牌照片的车牌信息的识别工作 xff0c 车牌识别技术对我们的实际生活至关重要 xff0c 例如交通违规行为的增加 xff0c 拦截非法车辆 xff0c 在速度上能够进行快速识别能够很好地解决这些问题 获得的照片的质量是影响车
  • 互连网络的定义

    原文 xff1a http julong com cn Service FAQview asp FAQID 61 15 互联网络是一通过中间网络设备连接多个独立网络的集合 xff0c 其功能是形成一个覆盖范围更广的网络 网络互联技术意指工业
  • Win11本地安装Ubuntu 22.04 双系统简易教程

    1 制作启动U盘 首先找到一个硬盘容量不小于4G的空U盘 xff0c 需要对其进行格式化 然后下载Ubuntu 22 04的iso文件到本地 Ubuntu 22 04 1 LTS 中国地区下载链接 下载 UltraISO并制作启动U盘 Ul
  • 图文详解VMWare Workstation安装Ubuntu20.04虚拟机

    图文详解VMWare Workstation安装Ubuntu20 04虚拟机 0 准备工作1 新建虚拟机并进行初始配置2 安装虚拟机系统 0 准备工作 在使用VMWare Workstation进行Ubuntu20 04虚拟机安装前 xff
  • 理解数据库中的undo日志、redo日志、检查点

    数据库存放数据的文件 xff0c 本文称其为data file 数据库的内容在内存里是有缓存的 xff0c 这里命名为db buffer 某次操作 xff0c 我们取了数据库某表格中的数据 xff0c 这个数据会在内存中缓存一些时间 对这个