数据库中的undo与redo的作用

undo与redo的作用

概述

我们都知道,数据库中保障数据不丢失,在故障时恢复数据一致性的机制,就是在数据发生修改时记录日志,在故障发生时通过日志进行恢复。

当然在单机系统中,还可以借助磁盘的RAID进行恢复,如果发生磁盘整体故障时,必需数据库日志出马了。

本文主要介绍一下恢复使用两种日志:undo日志与redo日志的机制,这里并不特指那一种数据库的实现,而是从理论上进行分析说明。

undo 日志

在oracle,mysql等商业数据库中都有undo日志,那么它是做什么的呢?

顾名思义,就是回滚日志,回到修改前的状态;undo日志的内容记录的就是修改前的值,当故障发生时,就将对应数据改为旧修。

undo日记的记录流程大概是这样,每个事务对应的都会有一条开始日志,然后记录修改前的值到undo日志的缓冲区,在缓冲区中修改数据,记录一条commit的undo日志。

那它们什么时候刷新到磁盘呢,有先后顺序吗? 需要符合几条规则:

  • undo日志必须在数据之后落盘 ;
  • undo日志的commit落盘之前,数据都要落盘;
  • commit的时候,undo日志需要落盘;也就意味着数据都会落盘;

符合这些规则后,也就是只要有commit日志,数据肯定也是持久化到了磁盘,不用再恢复了,如果没有commit结束的事务,就需要用旧值进行恢复,保持数据的一致性,这就是undo的作用。

redo 日志

redo日志,也是在数据库应用中经常听说,顾名思义,就是重作日志,有时候也就回放日志。它的内容记录了数据修改后的新值,当故障发生后,将事务提交的数据更新为最新值。

redo日志的记录流程大概是这样的,事务开始会有一条开始日志,然后在缓冲区中修改数据,记录修改后的值到redo缓冲区中,最后记录一条commit日志到redo缓冲区。

同样它们什么时候刷盘呢?也需要符合几条规则:

  • redo日志要先于数据落盘;也就是当有redo的缓冲区要写盘时,可以不用管脏数据;而当脏数据缓冲区被替换落盘时,就需要把对应的redo先要写入磁盘;
  • redo 日志在commit时需要落盘,当然此时不需要数据同步落盘;

当发生故障,从头扫描redo日志,将事务提交成功的数据块,再修改一遍,修改为redo中记录的新值,而对于没有提交的事务,状态改为abort,也不需要再变动。

相关推荐
稚辉君.MCA_P8_Java23 分钟前
WebSocket 是什么原理?为什么可以实现持久连接?
网络·数据库·websocket·网络协议
小光学长42 分钟前
基于Vue的图书馆座位预约系统6emrqhc8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
code小毛孩1 小时前
如何简单的并且又能大幅度降低任务队列的锁粒度、提高吞吐量?
java·jvm·数据库
风随心飞飞2 小时前
linux 环境下mysql 数据库自动备份和清库 通过crontab 创建定时任务实现mysql数据库备份
linux·数据库·mysql
奥尔特星云大使2 小时前
读写分离中间件简介
数据库·mysql·中间件·读写分离
友莘居士2 小时前
高效处理 Excel 海量数据入库:编程脚本、CSV 中间件、图形工具优化全攻略
数据库·中间件·excel·csv·海量数据·入库
Han.miracle3 小时前
数据库圣经第二章——简单的my.ini基础配置介绍
数据库
八怪4 小时前
KILL MTS的一个worker线程会怎么样
数据库
-Xie-4 小时前
Mysql杂志(三十一)——Join连接算法与子查询、排序优化
数据库·mysql
程序新视界5 小时前
在连表查询场景下,MySQL隐式转换存在的坑
数据库·mysql·dba