首页 > 其他分享 >Redo Log 与 Undo Log

Redo Log 与 Undo Log

时间:2024-03-11 16:57:31浏览次数:11  
标签:Log 数据库 写入 Undo 日志 Redo

本文目的是简单讲清楚 Redo Log 和 Undo Log 的区别,走出常见的误区,省略了底层细节。

Redo Log 和 Undo Log 并不是 MySQL 发明的,而是来自 ARISE 理论(Algorithms for Recovery and Isolation Exploiting Semantics,基于语义的恢复与隔离算法),现代主流关系型数据库在事务实现上都受到了该理论的影响。

Redo Log 和 Undo Log 是实现方式,而目的是为了实现原子性(A)和持久性(D)。A 和 D 是手段,最终目的是实现一致性(C),这里的一致性可以理解为是业务上的一致性。

只有当事务的所有数据都正确写入磁盘,原子性和持久性才算实现。但由于写入磁盘过程有可能崩溃(数据库程序崩溃、硬件故障等等),所以在客观存在磁盘写入的中间状态。将磁盘从中间状态恢复到写入前的正确状态,是实现原子性和持久性要考虑的主要问题。

将所有操作都持久化到日志中,只有当日志完全写完时,才修改数据库数据。这样就解决了上面的问题(Committing Log)。

日志写完后,不立刻修改数据库可以吗?答案是肯定的,只要日志完整,就可以保证持久化,可以自由选择修改数据库的时机,这样 IO 就有了优化空间。这种情形叫做 FORCE/NOT FORCE,主流的数据库大多是 NOT FORCE。

日志写完前,修改数据库可以吗?可以,但会有问题。当遇到崩溃需要回滚或事务回滚时,因为日志可能并没有写完,所以没有办法回滚提前写入的数据,这部分数据就变成了脏数据。
引入 Undo Log 可以解决这个问题。Undo Log 记录了变更的字段,以及变更前和变更后的值,数据库必须在写入 Undo Log 后变更数据。在日志写完前修改数据库,叫做 STEAL,反之是 NOT STEAL。

NOT-FORCE 和 STEAL 是性能最佳的组合,是数据库的设计方向。

Redo Log 实现了 NOT FORCE, Undo Log 实现了 STEAL。
Redo Log 保存了数据库操作记录,Undo Log 保存了数据变更。
Redo Log 侧重于程序崩溃后的恢复,Undo Log 还可以应用于事务回滚。

当遇到崩溃需要恢复时:

  1. 重做 Redo Log,将数据库恢复到崩溃前的状态。(注意,此时可能有些数据已经变更,但没有写入 Redo Log,所以还需要第二步)
  2. 重做 Undo Log,还原提前写入的数据,此时数据库保证了前后的一致性。

标签:Log,数据库,写入,Undo,日志,Redo
From: https://www.cnblogs.com/neuqdarcy/p/18066505

相关文章

  • 将MindSpore运行结果输出到log文件
    技术背景我们在Linux系统下使用一些深度学习框架(如MindSpore)运行脚本的时候,经常会用一些打印输出来判断当前执行的步骤,或者是使用打印输出来定位算法问题。但是在Linux系统下程序输出其实被分成了正确输出和错误输出,如果只是在屏幕上打印的话,会将两种输出同时打印出来。但是如果......
  • Logstash系列---【centos7离线安装logstash7.8.0】
    1.安装包下载地址一般根据es的版本来确定logstash的版本,一般保持一致即可。Logstash和es版本对应关系:https://www.elastic.co/cn/support/matrix#matrix_compatibility。Logstash下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-7-8-02.解压并复制配置......
  • Blog Statistics Apr 1, 2023 - Apr 1, 2024
    1.OverviewDataDate:Apr1,2023-Apr1,2024Numberofarticles:53AllPlatformTotalVisits:1,011,000+(ThesearticeswerealsopublishedatZhihu.com、Toutiao.com、WeChatOfficialAccount、HeapDump、TencentDeveloper.)2.Dataforeachplatformlast......
  • Warning: QDialog::exec: Recursive call detected
     查看QDialog::exec的源码intQDialog::exec(){Q_D(QDialog);if(d->eventLoop){qWarning("QDialog::exec:Recursivecalldetected");return-1;}booldeleteOnClose=testAttribute(Qt::WA_DeleteOnClose);set......
  • 开启 mysql 的 general_log
    在做等保评测时,会要求mysql开启general_log日志,该日志会记录所有的数据库动作,增长幅度非常大,因此适合于在出现问题时临时开启一段时间,待问题排查解决后再进行关闭,否则日志文件的增长速度会超出你的想象。1、首先来看一下关于general_log的几个参数: mysql>showvariable......
  • spdlog 源码解析
    spdlog是开源、高性能、跨平台,支持header-only/compiled的C++日志库。本文主要目的是对spdlogv1.13.0的源码进行分析(编译运行环境为6.5.0-18-generic#18~22.04.1-Ubuntu),以探讨spdlog如何构建高性能、可扩展的日志框架的。github链接gabime/spdlog:FastC++loggingli......
  • mysqldump+binlog备份脚本
    mysqldump是一种逻辑备份工具,可以对数据库进行全量备份,和binlog增量备份共同使用可以进行数据库备份,基于此写了一个备份的脚本#!/bin/bashall_path="/opt/mysql_bakup/all"#MySQL全量备份目录add_path="/opt/mysql_bakup/add"#MySQL增量备份目录old_all_path="/o......
  • 解决syslog服务器启动问题
    Syslog监控和管理对于每个组织来说都很重要,可以减少系统停机时间、提高网络性能并加强企业的安全策略。而在网络系统管理中,syslog服务用于收集、存储和管理系统和设备的日志信息。然而,有时候我们可能会遇到syslog服务器无法启动的问题,这会给网络管理和故障排查带来一定的困扰。......
  • Verilog的学习教程与笔记(LZQ自用):
    verilog的学习教程与笔记(LZQ自用):第1章Verilog的历史视频讲解:https://www.bilibili.com/video/BV14K4y1u7kH?p=3&vd_source=da31a9aa66fbe4d6b904e621d9943c75​ 硬件描述语言,英文全称为HardwareDescriptionLanguage,简称HDL,HDL是一种用形式化方法来描述数字电路和数字......
  • 使用gzip命令解压gz日志文件报错:Permission denied[admin@test logs]
    【问题描述】 使用gzip命令解压gz日志文件报错:Permissiondenied[admin@testlogs] 使用sudochmode-R777给目录添加编辑权限,需要输入admin的密码,不是admin账号也添加不了。  【解决方法】使用sudogunzip命令就可以正常解压了。BYW:下载日志文件命令使用szinfo.......