当前课程知识点:高级数据库系统 > 第三讲 数据管理与恢复技术 > 3. 基于undo日志的恢复机制 > 3-3. 基于undo日志的恢复机制
下面呢,我们就来讲一下,基于日志的恢复机制
那么我们前面讲这个日志呢
是用来这个记录对于数据库的所有的一些操作,更新操作
那么日志呢,主要有三种类型,undo日志,redo日志和两者的结合
所以下面我们就要分别来讲一下基于三种日志的这个恢复方法
首先我们来看一下基于undo日志的恢复机制
那么我们先看一下undo日志,长的什么样
实际上所有的日志其实基本上格式是一样的
也就说都要记录事务的开始start,那么以及事务的结束commit
或者是它的这个终止reback
但是中间的内容也就说我们对于数据库的一些东西进行操作
记录的是什么样子的呢,那么undo日志记录的是它的格式是这样的
也就是说一个是事务和对事务对数据库的一些操作
以及它操作的数据项,和更新前的旧值
那么这是undo日志它的这个格式
那么我们说undo日志该如何去创建呢,undo日志的创建规则呢
它是这样的,我们来看这段话
它说数据元素更新的时候,先把日志记录写入磁盘
后把更新数据写入磁盘,然后提交事务的时候
要把所有的更新数据写入磁盘
然后最后来写commit这样一条日志记录,那么从这个叙述来看
那就说我们实际上它应该是记录日志的规则应该是这样的
也就是说先写日志,然后接下来呢,更新数据,然后再写commit
应该是这样的一个过程,那么下面呢我们用例子来说一下
那么我们用这张表还是就是我们刚才举例子这样的一张表格A,B
对A和B进行更新的这个,那么它的动作原语刚才我们都已经看了
也就说我们要input,read,然后再output这样的一个过程
那么,我们说日志里面都记录哪些呢
我们要日志里记录的呢,我们看这个表的最后一列
也就说当事务处于活动,也就是我们一旦执行begin,transaction的时候
这个时候我们要记录这个日志开始,所以start〈t〉这条记录呢
需要写了,然后接下来呢,就是我们要写对开始从磁盘上读数据了,是吧
我们用read把A读进来,然后我们对A进行修改
再把A的write的缓冲区上去,然后接下来
再把B也进行相同的操作,那么这个时候我们从这个事务的绝对地址空间
把这个t也就说把A进行了修改,然后写入缓冲区的这个过程
实际上就相当于对数据库进行更新了,更新操作
也就是事务对数据库进行更新操作
然后这个更新操作我们要把它记录下来
所以呢,我们在日志记录里面就要有事务t
它对A进行改变,它改变前的原值是8
那么同理呢,对B也一样,它进行了改变,改变前的原值是8
那么这个时候就说我把这些记录做完了之后
那么日志怎么进行操作呢,它要用一个强制写盘的记录Flush log
Flush log是一个强制写盘的命令
它要把所有的日志强行的从缓冲区直接刷新到磁盘上去
也就这个时候就说,我这个从缓冲区里面我先把日志记录写到磁盘上
然后接下来它做什么事情呢,它做output(A),output(B)
也就说我要对A和B从缓冲区更新到磁盘上
也就是说把数据库的更新直接从缓冲区移到磁盘上
这就是写数据,是吧,然后接下来,来写一个commit t
也就是事务提交的这样一个日志,再把它Flush log
再强制性的刷新到磁盘上去,那么这就是undo日志的写盘规则
也就说先写日志,再写数据,再写commit这样一个操作
那么它恢复的时候,是怎么一个恢复方法呢
那么恢复的时候呢,那我们就从后,拿到日志文件
从后向前扫描日志,如果遇到有commit t的那个事务
也就是它遇到事务一个t,如果看到这个事务有commit
也就说它成功提交的话,那我们就忽略它
如果它扫描日志的时候,它发现有一些事务t
它有一些其他的记录,但是它没有commit
这样的一条记录的话,那么它就要对这些事务要进行一个撤销
因为什么呢,为什么要这么做呢,就是我们可以从这张表里面
看我们的故障可以发生在commit前面,也可以发生在commit后面
那么我们这假设说如果是发生在commit后面
那么我们说已经是没有问题的,是吧,只要有commit的话
那么这事务肯定已经成功执行了,它就永久在磁盘上,这就是对的
但是如果我们在日志上看不到commit,这说明什么呢
这说明我们的故障可能发生在
比如说这张表的最后一个Flush log之前的每一条语句
最后一个Flush log之前的每一条语句都有可能是故障点
那么这些个故障点,那么我们就不能确定,比如说这个事务
它到底是更新了数据库没有呀,有的,你比如说
如果故障发生在这个在第一个Flush log之前的话
显然数据还没有更新,但如果发生在最后一个Flush log之前的话
那显然数据已经更新了,是吧,但是呢
我们无法确定,所以这个时候我们就必须要对它进行撤销
进行撤销操作,把所有的数据恢复原来的值,那么这样的话呢
我们就保证了数据库它恢复到以前的一个正确的状态
这就是它的恢复机制,话又说回来,我们扫描日志的时候
不可能无限扫描,也就是说,我们日志文件如果是几百兆或者是几个G的话
那我要是一扫描的话,花的时间是非常长的,是吧
但实际上以前你比如说我故障点,发生故障的时候
那么可能我扫描它附近的一些日志就管用了
那么以前的那些日志其实是没有必要进行扫描的
这样的话,我们可以提高恢复的效率,是吧
那么我们如何去确定比如说我扫描的时候应该扫描到什么地方结束呢
也就说我扫描的范围是什么样子的呢
那么这个时候我们需要在日志里面加一个
标志点,我们把它叫做检查点
事务在开始的时候我们就可以为目前一些活动的事务写一个start CKPT
然后括弧里面是一些目前活动的事务
然后我们把这个start CKPT直接刷新到磁盘上去
那么接下来呢,我们就开始等待了
等待有新的事务这个成功的启动或者是目前活动的事务可能成功的提交或者终止
然后所有的事务,比如说刚才我们start CKPT已经括起来的所有的事务
提交或者终止之后,我们写一个end CKPT刷新日志
我们用这张图来表示,那么这是故障点的一个使用
我们下面这两个例子呢
都是在日志里面插入这个检查点的它的这个成功的案例
你比如说,第一个,正确的案例,你比如说第一个start T1
说明T1是一个活动的事务,那么它可能做了一些对数据库修改的一个记录
然后接下来,我们可以插入一个start CKPT T1
说明目前活动事务只有T1,然后接下来就可以等待
那么在等待的过程当中可能有新的事务启动,你比如说T2
也可能接下来T1就成功的提交,那么当T1提交之后
我们就可以在后面的适当的时候插入一个end CKPT
这是例1,那么例2也一样,那么比如说一开始有一个T1是活动的
然后呢,又有T2是活动的
然后我们在一个适当的地方插一个end CKPT
这个时候只有T1,T2活动,然后接下来我们开始等待T1和T2提交
它们提交或者终止之后,我们用一个end CKPT T1,T2
在这个期间,可能有T3,T4,T5启动,这都是可能的
这就是加入检查点的undo日志,那么加入检查点
那可能我们要最关心的就说我们如何去恢复,是吧
我们恢复的时候要扫描到什么地方,那么一样
我们加入检查点之后,我们当然仍然是我们从故障点开始扫描日志,是吧
逆向的去扫描,那么扫描的时候我们扫描到什么地方截止呢
这个就看我们从故障点开始扫描,第一个我们要碰见谁
首先来看如果我们碰见的是end CKPT
如果说我要碰见的是这样的一个标志的话,那么这说明什么呢
这说明在end CKPT这个地方,它括起来的所有的事务目前是已经成功提交了
这些事务我们就不用去管它了,那么我们还确定不了的事务是什么呢
是这个end CKPT里面,它括起来的这些点之外的
也就同它所对应的start CKPT后面其中的事务
这些事务有可能成功提交,也有可能没有成功的提交
所以就说如果我们首先碰到的是end CKPT
我们要向前扫描,直接扫描到end CKPT对应的start CKPT就可以了
然后在这个过程当中我们去找那些个没有commit的这些事务
找了这些事务之后对它进行撤销就可以了
如果说我从故障点向前扫描,碰到的是start CKPT
这个时候没有完成的Tj是从哪里开始的呢
那实际上这个也很好理解,比如说我一开始从故障点扫描
发现是一个start CKPT,那就说明什么呀,那个start CKPT
它所包含的所有的活动事务,有可能都是没有成功提交的,是吧
而这些事务是从什么地方开始的呢
那显然是从它前一个start CKPT之后开始的事务
所以我们直接向前扫描,扫描到前一个start CKPT实际上就可以了
这就是undo日志它的这个检查点的一个恢复策略
-1. 数据文件的组织
-2. 索引的概念与分类
-3. B+树索引
-4. 散列索引
--1-4 散列索引
-5. 小结
--html
-6.练习--作业
-1. 查询代价的测量及查询处理过程概述
-2. 关系操作的基础算法
-3. 查询表达式的运算
-4.查询优化机制
-5.小结
--html
-6.练习--作业
-1. 数据库的故障及可恢复模型
-2. 事务及日志的相关概念
-3. 基于undo日志的恢复机制
-4. 基于redo日志的恢复机制
-5. 小结
--html
-6. 练习--作业
-1. 并发调度及相关概念
-2. 可串行化调度
-3. 冲突可串行化调度
-4. 小结
--html
-5. 练习--作业
-1. 锁的概念及封锁的原理
-2. 两阶段锁协议
-3. 多粒度锁及意向锁
-4. 死锁的处理
-5. 小结
--html
-6. 练习--作业
-1. 基于时间戳的调度
-2. 基于有效性检验的调度
-3. 小结
--html
-4. 练习--作业
-1. 分布式数据库系统的产生及定义
-2. 分布式数据库系统的模式结构与功能结构
-3. 分布式数据库系统中存在的技术问题
-4. 小结
--html
-5. 练习--作业
-1. 分布式数据库的设计方法、内容和目标
-2. 自顶向下方法构建数据库
-3. 数据的分片和分布设计
-4. 分布式数据库设计案例讲解
-5. 小结
--html
-6. 练习--作业
-1. 分布式查询处理的步骤和代价
-2. 基于等价变换的查询优化
-3. 基于半连接算法的查询优化
-4. 基于直接连接算法的查询优化
-5. 小结
--html
-6. 练习--作业
-1. 分布式事务概述
-2. 分布式事务的两阶段提交协议
-3.分布式并发控制概述
-4. 并发控制的加锁机制
-5. 并发控制的时标技术
-6. 小结
--html
-7.练习--作业
-试题--作业