本章目录
第10章 数据库恢复技术
事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元。事务处理技术主要包括数据库恢复技术和并发控制技术。
10.1 事务的基本概念
- 事务
(1)事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
(2)事务和程序是两个不同的概念。定义事务的语句一般有三条:
begin transaction; commit; rollback
- 事务的ACID特性
(1)原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的操作要么不做,要么全做。
(2)一致性(Consistency)
事务的执行结果必须是使数据从一个一致性状态编导另一个一致性状态(一致性:A-B=C,此操作后A应该减B,C应该加B,如果不是,就不是一致性状态)。可见,一致性和原子性是密切相关的。
(3)隔离性(Isolation)
一个事务的执行不能被其他事务干扰。即一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
(4)持续性(Durability)
持续性也称永久性(Permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。 - 保证事务ACID特性是事务管理的重要任务。事务ACID特性可能遭到破坏的因素有:
(1)多个事物并发运行时,不同事务的操作交叉进行:
此情况下,数据库管理系统必须保证多个事物的交叉运行不影响这些事务的原子性。
(2)事务在运行过程中被强行停止。
此情况下,数据库管理系统必须保证被强行终止的事务对数据库和其他事务没有任何影响。
这就是数据库的恢复机制和并发控制机制。
10.2 数据库恢复概述
事务运行中的故障,轻则影响数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失,因此,数据库必须具有把数据库从错误状态恢复到某一已知的正确状态,这个功能就是数据库的恢复
10.3 故障的种类
- 事务内部的故障
(1)事务内部的故障有的是可以通过事务程序本身发现(如转账中的A-B=C),有的是非预期的,不能由事务程序处理。
(2)事务内部更多的故障是非预期的,是不能由应用程序处理的(运算溢出、并发引起的死锁,违反完整性限制而被终止等)。
(3)事务故障导致数据库可能处于不正确状态。恢复程序要在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务已经作出的任何对数据库的修改,使得该事务好像根本没有启动一样。这类恢复操作称为事务撤销(UNDO)。 - 系统故障
系统故障是指造成系统停止运转的任何事件,使得系统要重新启动。这类故障影响正在运行的所有事物,但不破坏数据库。
系统重启后,恢复子系统除需要撤销所有未完成的事务外,还需要重做(REDO)所有已提交的事务,以将数据库真正恢复到一致状态。 - 介质故障
系统故障称为软故障,介质故障称为硬故障。
硬故障指外存故障,如磁盘损坏,刺头碰撞,瞬时强磁场干扰等。 - 计算机病毒
- 总结
各类故障对数据库的影响有两种可能性,一是数据库本身被破坏,二是数据库没有被破坏,但数据可能不正确,这是由于事务的运行被非正常终止造成的。
恢复的基本原理:冗余。这就是说,数据库中任何一部分被破坏或不正确的数据可以根据存储在系统别处的冗余数据来重建。
10.4 恢复的实现技术
恢复机制的两个关键问题:如何建立冗余数据、如果利用这些冗余数据实施数据库恢复。
建立冗余数据最常用的技术是数据库转储和日志文件(logging)。
10.4.1 数据转储
- 所谓转储即数据库管理员定期地将整个数据库复制到磁带、磁盘或其它存储介质上保存起来的过程。这些备用的数据称为后备副本( backup)或后援副本。
- 重装后后备副本只能将数据库恢复到转储时的状态,要想恢复到故障发生时的状态,必须重新运算转储以后的所有更新事务。
- 转储是十分耗时和耗资源的,不能频繁进行,数据库管理员应该根据数据库使用情况确定一个适当的转储周期。
- 转储可分为静态转储和动态转储。
(1)静态转储:在系统中无运行事务时进行转储。
优缺点:优点,实现简单;缺点:必须等待正运行的用户事务结束才能进行,同样新的事务必须等待转储结束才能执行。这会降低数据库的可用性。
(2)动态转储:转储期间允许对数据库进行存取或修改。即转储和用户事务可以并发执行。
动态转储必须把转储期间各事务对数据库的修改活动登记下来,建立且志文件(logfile)。这样,后援副本加上日志文件就能把数据库恢复到某一时刻的正确状态。
转储还可以分为海量转储和增量转储两种方式。
海量转储是指每次转储全部数据库,增量转储则指每次只转储上一次转储后更新过的数据。
数据转储有两种方式,分别在两种状态下进行,因此数据转储方法可以分为4种:
10.4.2 登录日志文件
- 登录日志文件的格式和内容
日志文件是用来记录事务对数据库的更新操作的文件。主要有两种格式:以记录为单位的日志文件和以数据库为单位的日志文件。
(1)以记录为单位的日志文件
内容主要包括:
每个日志记录的内容主要包括:
(2)以数据块为单位的日志文件
日志记录内容包括:事务标识、被更新的数据块。
由于将更新前的整个块和更新后的整个块都放入日志文件中,操作类型和操作对象等信息就不必放入日志记录中了。 - 登录日志文件
为保证数据库是可恢复的,登录日志文件时必须遵循两条原则:
(1)登录的次序严格按并发事务执行的时间次序。
(2)必须先写日志文件,再写数据库。
把对数据的修改写到数据库中和把表示这个修改的日志记录写到日志文件中是两个不同的操作。所有为了安全,一定要先写日志文件,即先把日志记录到日志文件中,然后写数据库的修改。这就是“先写日志文件”原则。
10.5 恢复策略
10.5.1 事务故障的恢复
事务故障是指事务在运行至正常终止点前被终止,这时恢复子系统应利用日志文件撒销(UNDO)此事务已对数据库进行的修改。事务故障的恢复是由系统自动完成的,对用户是透明的。
10.5.2 系统故障的恢复
系统故障造成数据库不一致状态的原因有两个,一是未完成事务对数据库的更新可能已写入数据库,二是已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库。
恢复操作就是要撤销故障发生时未完成的事务,重做已完成的事务。系统故障的恢复是由系统在重新启动时自动完成的,不需要用户干预。
10.5.3 介质故障的恢复
对介质故障,恢复方法是重装数据库,然后重做已完成的事务。
(1)装入最新的数据库后备副本(离故障发生时刻最近的转储副本),使数据库恢复到最近一次转储时的一致性状态 。
(2)装入相应的日志文件副本(转储结束时刻的日志文件副本),重做已完成的事务。
介质故障的恢复需要数据库管理员介入,但数据库管理员只需要重装最近转储的数据库副本和有关的各日志文件副本,然后执行系统提供的恢复命令即可,具体的恢复操作仍由数据库管理系统完成。
10.6 具有检查点的恢复技术
此技术在日志文件中增加了一类新的记录——检查点记录,增加一个重新开始的文件,并让恢复子系统在登录日志文件期间动态的维护日志。
- 检查点记录的内容包括:
(1)建立检查点时刻所有正在执行的事务清单。
(2)这些事务最近一个日志记录的地址。 - 动态维护日志的方法是,周期性地执行建立检查点、保存数据库状态的操作,具体步骤为:
10.7 数据库镜像
数据库镜像:将整个数据库或其中的关键数据复制到另一个磁盘上,每当主数据库更新时,数据库管理系统自动把更新后的数据复制过去,由数据库管理系统自动保证镜像数据与主数据库的一-致性( 如图10.5(a)所示)。 这样,一旦 出现介质故障,可由镜像磁盘继续提供使用。同时数据库管理系统自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本(如果10.5(b))所示。
由于数据库镜像是通过复制数据实现的,频繁地复制数据自然会降低系统运行效率,因此在实际应用中用户往往只选择对关键数据和日志文件进行镜像,而不是对整个数据库进行镜像。