1、事务故障
某个事务在运行过程中由于种种原因未能运行到正常终止而夭折
可能导致事务执行失败的两类错误:
事务程序的逻辑错误:如,事务内部的非法输入、溢出、超出资源限制等
系统错误:系统进入一种不良状态(如死锁),使得事务无法继续正常执行。
出现这类问题的事务可以在以后的某个时间重新执行
后果与处理:
后果:发生事务故障时,夭折的事务可能已经把对数据库的部分修改写入数据库,导致数据库可能处于不正确状态。
处理:回滚该事务,清除该事务对数据库的所有更新。
2、系统故障
由于某种原因造成整个系统的正常运行突然停止,致使所有正在运行的事务都以非正常方式终止。
发生系统故障时,内存中数据库缓冲区的信息全部丢失,但不破坏存储在外部存储设备上的数据。
造成系统故障的原因:
CPU故障、数据库软件代码错误、操作系统故障、系统断电等。
后果与处理:
后果:一些尚未完成的事务的结果可能已经写入物理数据库,一些完成的事务的某些更新可能还在内存缓冲区,尚未写入数据库。
处理:系统重启后,恢复子系统必须撤销故障发生时所有未完成事务对数据库的更新,并利用日志将完成的事务的更新写入数据库。
3、介质故障
又称磁盘故障,是指存储数据库的存储设备故障
故障原因:磁盘损坏、磁头碰撞、操作系统的某种潜在错误和瞬时强磁场干扰都可能导致介质故障
后果与处理:
后果:介质故障可能导致存储在外存中数据库的数据部分丢失或全部丢失
处理:需要修复或更换存储介质,然后重启系统
系统重启后,首先装入数据库发生介质故障前的最新数据库副本
然后,利用日志将建立副本以来所有已完成的事务的更新写入数据库。
这类故障比前两类故障发生的可能小,但破坏性更大。
4、其他故障
例如,计算机病毒和恶意攻击也可能导致数据库中的全部或部分数据破坏
处理:首先要清除病毒和阻止恶意攻击,采用与介质故障恢复相同的方法
恢复的基本思想
不同的故障需要不同的恢复技术,但是它们的基本思想是一样的:
在系统正常运行时建立冗余数据,保证有足够的信息可用于故障恢复
故障发生后采取措施,将数据库内容恢复到某个一致性状态,保证事务原子性和持久性。
建立冗余数据
数据库系统主要通过登记日志和数据转储来建立冗余数据
日志
记录了数据库的所有更新的详细信息,所有故障的恢复都需要使用它。
数据转储
制作数据库的后备副本,这些副本与日志配合使用,用来实现介质故障恢复。
数据库镜像
在不同的存储介质上维护数据库的同步副本,也是建立冗余数据的一种方法。使用数据库镜像可以简化介质故障的恢复,但需要附加的存储设备。
10.2存储器结构存储器类型
数据库的存储设备按其存取速度、容量和故障可恢复性可分为如下三种:
易失性存储器(volatilestorage)
非易失性存储器(nonvolatilestorage)
稳定存储器(stablestorage)
易失性存储器
该类存储器包括主存储器、高速缓冲存储器等n存取速度很快,并且可以直接存取所存储的任何数据项系统发生故障时,存储在易失性存储器上的数据将丢失
非易失性存储器
非易失性存储器包括磁盘、磁带等
磁盘一般作为联机存储器
磁带通常作为后援存储器
磁盘比主存可靠性强,比磁带可靠性弱,但两者都可能出现故障,导致信息丢失。除非出现介质故障和恶意攻击,否则非易失存储器中的信息不会丢失
在数据库系统中,通常使用磁盘存放数据库和联机日志,而其它非易失性存储器一般用来存储数据库和日志的后备副本。
稳定存储器
是一种理想的存储器,其中的信息永不丢失。“永不”是相对的,从理论来说是无法保证的。尽管理论上不能得到稳定存储器,但可以使用技术手段使得非易失性存储器中的信息极不可能丢失,来逼近稳定存储器。
例如:采用多个异地副本
稳定存储器实现
在多个非易失性存储介质上以独立的故障模式复制所需要信息,并且以某种受控的方式更新数据,以保证数据传送过程中发生的故障不会破坏所需信息
采用冗余独立磁盘阵列
(RAID:RedundantArraysofIndependentDisks)
可以保证单个磁盘的故障(即使发生在数据传送的过程中)不会导致数据丢失。最简单并且最快的冗余独立磁盘阵列形式是磁盘镜像。在不同的磁盘上为每个磁盘块保存两个副本。更安全的系统在远程站点为稳定存储器的每一个块保存一个副本,除在本地磁盘系统进行存储外,还通过网络存储到远程站点
数据访问
数据库通常驻留在磁盘上,并且划分成固定长度的块。
块是磁盘传送的基本单位,可能包含多个记录(元组)
缓冲块:暂时驻留在主存中的块
物理块:位于磁盘上的块nn块在主存和磁盘之间的移动通过以下两种操作引发
input(B):将物理块B传送到主存缓冲块
output(B):将缓冲块B传送到磁盘,并替换相应的物理块
这两个操作都是系统操作,并不显式出现在事务的操作序列中。事务使用read和write操作读写数据库中的数据。
数据传输示意图
数据更新
在下面的讨论中,假设事务对数据库的更新都是由write操作导致的
插入新元组需要先将一个不满的磁盘块或新的磁盘块输入到主存缓冲区,再用write操作将新元组写入主存缓冲块。
删除元组需要先将被删除元组所在的磁盘块输入到主存缓冲区,清空主存缓冲块中的该元组(相当于write的内容为空)。
修改需要先将被修改元组所在的磁盘块输入到主存缓冲区,然后用write操作将修改后的属性值写入主存缓冲块。
10.3基于日志的恢复技术日志(log)
是日志记录的序列,记录了数据库中所有的更新活动
日志登记了每个事务的开始标记、结束标记和所有更新操作
1、日志记录的格式
一条更新日志记录了一个事务对数据库的一次write操作,它包括如下信息:
事务标识符:执行更新操作的事务的惟一标识符
操作类型:指明更新是插入、删除,还是修改
操作对象:被更新的数据对象的惟一标识,通常是数据对象在磁盘上的位置
旧值:数据对象更新前的值。对插入操作而言,此项为空
新值:数据对象更新后的值。对删除操作而言,此项为空
假设各种类型的日志记录具有如下形式:
2、登记日志的原则
为了保证系统能够在故障恢复时使用日志记录,日志必须放在稳定存储器上(通常是不同于存放数据库的磁盘),并且日志登记必须要遵守以下两条原则:
(1)日志记录必须严格按并发事务执行的时间次序登记
(2)必须先记日志,后写数据库;也就是说,在每次事务执行write操作之前,必须在数据库被更新前建立该write操作的日志记录
第二条通常称为先记日志原则,为何先记日志?
一旦日志记录已经存在,如果需要,系统既能用日志记录中的旧值来撤销已经对数据库的更新,也可以用日志记录中的新值更新数据对象值;如果不先记日志,而是先写数据库,写完数据库后可能发生的故障,导致日志记录没有登记。这时,系统就无法撤销事务对数据库的修改。
3、redo和undo
redo(Ti)
根据日志记录,按登记日志的次序,将事务Ti每次更新的数据对象的新值用write操作重新写到数据库中。
注意:redo(Ti)不是重新执行事务Ti
redo是幂等的:redo(Ti)执行多次等价于执行一次
undo(Ti)
根据日志记录,按登记日志的相反次序,将事务Ti每次更新的数据对象的旧值用write操作写回数据库
undo也是幂等的:undo(Ti)执行多次等价于执行一次
延迟更新技术
延迟更新将事务对数据库的更新推迟到事务提交之后,在每个事务执行期间,用日志记录该事务对数据库的所有更新操作,所有数据库更新操作推迟到该事务提交后执行。
延迟更新技术必须遵循如下更新协议:
每个事务在到达提交点之前不能更新数据库;
在一个事务的所有更新操作的日志记录写入稳定存储器之前,该事务不能到达提交点。
延迟更新技术只需要在日志中登记被更新的数据对象的新值
延期更新时的故障恢复
1、事务故障恢复
对于延迟更新,当事务Ti发生故障时,Ti未到达提交点,因此Ti的更新操作都登记在日志中,而并未输出到数据库
当事务Ti发生故障时,只需要清除日志中事务Ti的日志记录,而无须对数据库本身做进一步处理
如果故障不是Ti自身的逻辑错误,则事务Ti可以在稍后重新启动
2、系统故障恢复
系统故障导致所有未到达提交点的事务失败。这些事务的更新都未输出到数据库,因此恢复时无须考虑这些事务
然而,提交的事务对数据库的某些更新可能并未输出数据库中,故障发生时这些信息丢失。因此当系统重新启动后,恢复子系统将自动对每个完成的事务Ti执行redo(Ti)
基于延迟更新技术的系统故障恢复过程
(1)正向扫描日志文件,建立两个事务列表
已提交事务列表:包含所有具有日志记录Ti,