数据库恢复技术
数据库恢复机制和并发控制机制是数据库管理系统的重要组成部分
1.事务
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做。事务是数据库的逻辑工作单位。
2.提交
即提交事务的所有操作,具体地说就是将事务中所有对数据库的更新写回到磁盘的物理数据库中,事务正常结束。
3.回滚
即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务对数据库中所有已完成的操作全部撤销,回滚到事务开始时的状态。
4.事务的ACID特性
1)原子性:事务是数据库的逻辑工作单位,事务中的诸操作要么全做,要么全不做。
2)一致性:事务执行的结果必须使数据库从一个一致性状态转变到另一个一致性状态。
3)隔离性:一个事务的执行不能被其他事务干扰,即一个事务的内部操作以及数据的处理对其他事务是隔离的,并发执行的各个事务之间是互不干扰的。
4)永久性:一个事务一旦提交,它对数据库中数据的改变就是永久的,接下来的其他操作或故障不应该对其执行结果有任何影响。
5.故障的种类
1)事务内部的故障:事务内部的故障有的是可以通过事务程序本身发现的,有的是非预期的,不能事务程序处理。事务内部的更多故障是非预期的,是不能由应用程序处理的。
2)系统故障:又叫软故障,指造成系统停止运转的任何事件,使系统要重新启动。这类故障影响正在运转的所有事务,但不破坏数据库。
3)介质故障:又叫硬故障,指外存故障,如磁盘损坏,磁头碰撞,瞬间强磁场干扰等。这类故障破坏数据库或部分数据库,并影响正在存取这些数据库的所有事务。
4)计算机病毒
总结各类故障对数据库的可能影响有两种:一是对数据库本身造成破坏,二是数据库本身未造成破坏,但数据可能不正确,这是由于事务的运转被非正常终止所造成的。
6.恢复的实现技术
恢复机制涉及的两个关键问题是:如何建立冗余数据,以及如何利用这些冗余数据实施数据库的恢复。
建立冗余数据最常用的技术是数据转储和登记日志文件。
转储:即数据库管理员定期地将整个数据库复制到磁盘,磁带或其他存储介质上保存起来的过程。转储是十分消耗资源和时间的,不能频繁地进行。
静态转储:是在系统中无运行事务是进行的转储操作,即转储操作开始的时刻数据库处于一致性状态,而且转储期间不允许对数据库有任何的存取或修改。
动态转储:是指转储期间允许对数据库进行存取或修改,即转储和用户事务可以并发执行。但是转储结束时后援副本上的数据并不能保证正确有效。
海量转储:指每次转储整个数据库。
增量转储:值每次只转储上次转储更新过的数据。
日志文件:是用来记录事务对数据库的更新操作的文件。
日志文件的具体作用是:
1)事务内部故障恢复和系统故障恢复必须用到日志文件。
2)在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效的恢复数据库。
3)在静态转储方式中也能建立日志文件。
为保证数据库是可恢复的,登记日志文件必须遵循两条原则:
登记的顺序严格按照并发事务执行的时间顺序;
必须先写日志文件,后写数据库。
7.恢复策略
1)事务故障的恢复
- 反向扫描日志文件,查找该事务的更新操作
- 对该事务的更新操作执行逆操作,既将日志记录中“更新前的值”写入数据库
- 继续反向扫描日志文件,查找该事务的其他更新操作,做同样的处理
- 如此处理下去,直到读到该事务的开始标志,事务故障恢复完成
2)系统故障的恢复
- 正向扫描日志文件,找出故障发生前已经提交的事务,将其事务标识记入重做队列。同时找出故障发生时未完成的事务,将其事务标识记入撤销队列。
- 对撤销队列中的各个事务进行撤销处理
进行撤销处理的方法是:反向扫描日志文件,对每个撤销事务的更新操作执行逆操作,既将日志记录中“更新前的值”写入数据库 - 对重做队列中的各个事务进行重做处理
进行重做处理的方法是:正向扫描日志文件,对每个重做事务重新执行日志文件登记的操作,即将日志记录中“更新后的值”写入数据库
3)介质故障的恢复
- 装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态
- 装入相应的日志文件副本,重做已完成的事务。即首先扫描日志文件,找出故障发生时已提交的事务,将其记入重做队列;然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志文件中“更新后的值”写入数据库
8.具有检查点的恢复技术
利用日志文件进行数据库恢复时,恢复子系统必须搜索日志,确定那些事务需要重做,那些事务需要撤销。一般来说需要检查所有日志记录。这样做有两个问题,一是搜索整个日志将耗费大量时间,二是很多需要重做处理的事务实际上已经将它们的更新操作结果写入到数据库中,然而恢复子系统又重新执行了这些操作,浪费了大量的时间。
为了解决这些问题,又发展了具有检查点的恢复技术。这种技术在日志文件中增加一类新的记录——检查点记录,增加一个重新开始文件,并让恢复子系统在登录日志文件期间动态地维护日志。
检查点记录的内容包括
-
建立检查点时刻所有正在执行的事务清单
-
这些事务最近一个日志记录·的地址
重新开始文件用来记录各个检查点记录在日志文件中的地址。
动态维护日志文件的方法是,周期性地执行建立检查点,保存数据库状态的操作具体步骤是:
(1)将当前日志缓冲区的所有日志记录写入磁盘的日志文件上。
(2)在日志文件中写入一个检查点记录。
(3)将当前数据缓冲区的所有数据记录写入磁盘的数据库中。
(4)把检查点记录在日志文件中的地址写入一个重新开始文件。
恢复子系统可以定期或不定期地建立检查点,保存数据库状态。使用检查点方法可以改善恢复效率。
系统使用检查点技术进行恢复的步骤是:
(1)由重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。
(2)由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST
这里建立两个事务队列 -
UNDO-LIST:需要执行UNDO操作的事务集合
-
REDO-LIST:需要执行REDO操作的事务集合
把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO-LIST暂时为空
(3)从检查点开始正向扫描日志文件 -
如有新开始的事务Ti,把Ti暂时放入UNDO-LIST队列
-
如有提交的事务Tj,把Tj从UNDO-LIST队列移到REDO-LIST队列,直到日志文件结束
(4)对UNDO-LIST中的,每个操作执行UNDO操作,对REDO-LIST中的,每个事务执行REDO操作
1)如果系统故障发生在14之后,说明哪些事务需要重做,哪些事务需要回滚。
T1,T3需要重做,T4需要回滚。
2)如果系统故障发生在10之后,说明哪些事务需要重做,哪些事务需要回滚。
T1需要重做,T3需要回滚。
3)如果系统故障发生在9之后,说明哪些事务需要重做,哪些事务需要回滚。
T1需要重做,T2,T3需要回滚。
4)如果系统故障发生在7之后,说明哪些事务需要重做,哪些事务需要回滚。
T1需要重做,T2需要回滚。