当前课程知识点:数据库概论 > 第八章 事务处理 > 8.6 事务恢复 > 事务恢复
同学们好
我们是来自云南大学软件学院的
包崇明
下面为大家介绍事务恢复
前面我们学习事务的ACID保证时
学习到即使在电源故障或者系统崩溃时
原子性和持久性依然能够得到保证
这主要是依靠我们今天所要学习的
事务恢复技术来完成的
我们知道相对访问内存而言
访问磁盘的速度是很慢的
我们需要将磁盘中的数据页面
读到内存缓冲区中
以便为计算机指令提供高速的随机访问
这就是缓存技术
假定我们突然遇到电源故障
或者系统崩溃
这时更新的结果还在缓存中
还没有写回磁盘
这样看上去所有的更新都将丢失
我们将如何处理这个问题呢
我们通过日志来解决这个问题
每执行一次更新操作
系统给自己做一个记录
称为日志项
该记录保存在一个称为日志缓冲区的
内存区域中
日志项包含相应更新操作的足够信息
在恢复的时候
系统能够根据这些信息
重做更新操作或者撤销更新操作
每隔一段时间
日志缓冲区将被写回到磁盘上
一个称为日志文件的顺序文件中
该文件包括了在过去某个时间段中
所有的日志项
通过这种方式
在某一时刻一旦内存中的内容丢失
数据库恢复进程就能够通过日志文件
对磁盘的相应数据进行
重新更新或者撤销更新操作
现在我们来看一下更新的日志项
应包括哪些内容才能保证
使用这些信息能够进行恢复操作
我们应该在日志项中
记下更新前的数据的值和更新后数据的值
更新前的数据值我们称为前像
更新后的数据值我们称为后像
由于缓存区的存在
恢复的时候我们会遇到两种情形
第一种情形是当一个事务还没有提交
崩溃就发生了
那这个事务在崩溃前的更新数据
可能由于缓存策略已写入磁盘中
我们需要用到这个日志项中更新前的值
也就是前像
来重写磁盘中相应数据的值
这种恢复操作称为UNDO操作
也就是撤销未提交事务的更新
对磁盘可能造成的影响
第二种情形是当一个事务提交后
崩溃发生
那这个事务对数据的更新
可能都在缓存区中还没有来得及写入磁盘
我们需要用日志项中更新后的值
也就是后像
来重写磁盘中相应数据的值
这种恢复操作称为REDO操作
也就是确保
已提交事务的更新已写入磁盘
下面我们来看一下一个经历执行过程中
日志记录的内容
图上每一行包含一个操作
操作的日志和相应的解释
我们看到操作一是T1读取A得到50
相应的日志项中记录了T1启动信息
对于读操作
除了事务启动
或者结束需要在事务中标识
其他的不需要记录日志项
操作二是T1将20写入A
对应的日志项中记录了T1的事务号
A的前像50和后像20
操作三是T2读取C得到100
对应的日志项中记录了T2启动信息
操作四是T2将50写入C
对应的日志项中记录了T2的事务号
C的前像100和后像50
操作五是T2提交
对应的日志项中记录了T2提交标记
把前面的日志项
都写入磁盘上的日志文件
操作六是T1读取B得到50
读操作无需写日志项
操作七是T1将80写入B
对应的日志项中记录了T1的事务号
B的前像50和后像80
这时系统崩溃
后续操作终止
系统崩溃后
我们的日志文件存入硬盘的
只有操作一到操作五五条日志记录
我们将根据这五条日志来进行恢复
恢复过程可以分为
后滚和前滚两个阶段
后滚对应扫描日志文件中的日志项时
从最后一条开始向前扫描
直到第一条
前滚指的是扫描日志文件
是从第一条日志文件项开始向后扫描
我们先执行后滚阶段
再执行前滚阶段
后滚阶段
恢复过程从日志文件的
最后一项往前扫描
执行UNDO操作
撤销没有提交的事务的更新
同时生成一张已提交事务的列表
在前滚阶段
恢复程序从日志文件的第一条向后扫描
执行REDO操作
确保已提交事务的更新写入磁盘
下面我们来看一下
前面崩溃的经历
如何根据日志文件来进行恢复
我们先执行后滚阶段
撤销未提交事务的更新
我们知道这时日志文件中
只有操作一到操作五的日志项
从后往前
我们最先扫描操作五的日志项
这是T2提交的标记
我们把T2放入已提交列表中
往前扫描
得到操作四的日志项
我们从日志项中看到是T2的更新操作
T2已经在提交列表中
不需要进行处理
继续往前扫描
得到操作三的日志项
是T2启动的表记
可以不做处理
继续往前
得到操作二的日志项
这是一个T1的更新日志
T1不在已提交列表中
所以T1是未提交事务
我们应撤销该操作的更新
对数据A写入前像50
继续往前
到了第一条记录
是T1的启动标记
不需要处理
后滚阶段结束
下一步
开始前滚阶段
重做已提交事务的更新
从第一条日志开始
也就是操作一的日志项
是T1的启动标记
不需要处理
扫描到操作二的日志项
这是一个T1的更新日志
但T1不在已提交日志列表中
所以不需要处理
现在扫描到操作三的日志项
是T2启动的标记
不需要进行处理
扫描到操作四的日志项
这是一个T2的更新日志
T2在已提交日志列表中
我们进行REDO操作
对数据C写入后项50
最后扫描到操作五的日志项
这是T2提交的标记
不需要处理
前滚阶段结束
至此我们完成了恢复操作
更新事务这张一章的主要内容
已经介绍完毕
现在我对本章内容做一个总结
我们首先介绍了
事务的概念及其ACID保证
学习了判定一个给定经历
是否可串行化的方法
介绍了调度器
用来保证得到可串行化经历的
两阶段锁协议
和用来提高事务处理性能的隔离级别
最后我们学习了事务恢复的方法
今天的学习到这里就结束了
同学们再见
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video