故障
数据库的故障
可用事务的故障来表示,主要分为四类:
(1)事务故障。事务在运行过程中由于种种原因,如输入数据的错误、运算溢出、违反了某些完整性限制、某些应用程序的错误,以及并发事务发生死锁等,使事务未运行至正常终止点就被撤销,这种情况称为“事务故障”。
(2)系统故障。系统故障是指系统在运行过程中,由于某种原因(如操作系统或数据库管理系统代码错误、操作员操作失误、特定类型的硬件错误(如 CPU 故障)、突然停电
等造成系统停止运行),致使事务在执行过程中以非正常方式终止,这时内存中的信息丢失,
但存储在外存储设备上的数据不会受影响。
(3)介质故障。系统在运行过程中,由于某种硬件故障,如磁盘损坏、磁头碰撞或由于操作系统的某种潜在的错误、瞬时强磁场干扰,使存储在外存上的数据部分损失或全部损失,称为“介质故障”。这类故障比前两类故障的可能性虽然小得多,但破坏性却最大。
(4)计算机病毒。计算机病毒是一种人为破坏计算机正常工作的特殊程序。通过读写染有病毒的计算机系统中的程序与数据,这些病毒可以迅速繁殖和传播,危害计算机系统和数据库。目前大多数病毒是在 PC 和其兼容机上传播的。有的病毒一侵入系统就马上摧毁系统,有的病毒有较长的潜伏期,有的病毒则只在特定的日期发生破坏作用,有的病毒感染系统所有的程序和数据,有的只影响特定的程序和数据。
在数据库系统中,恢复的基本含义就是恢复数据库本身。也就是说,在发生某种故障使数据库当前的状态已经不再正确时,把数据库恢复到已知为正确的某一状态。目前数据库系统中最常用的恢复方法是转储和登记日志文件,可根据故障的不同类型,采用不同的恢复策略。
2.故障的恢复
(1)事务故障的恢复。事务故障是指事务未运行至正常终止点前被撤销,这时恢复子系统应对此事务做撤销处理。事务故障的恢复是由系统自动完成的,不需要用户干预,步骤如下:
反向扫描文件日志,查找该事务的更新操作。
对该事务的更新操作执行逆操作。
继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。
如此处理下去,直至读到此事务的开始标记,事务故障恢复完成。
(2)系统故障的恢复。系统故障发生时,造成数据库不一致状态的原因有两个:一是由于一些未完成事务对数据库的更新已写入数据库;二是由于一些已提交事务对数据库的更新还留在缓冲区没来得及写入数据库。系统故障的恢复是在重新启动时自动完成的,不需要用户干预,步骤如下:
正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做(Redo)队列。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销(Undo)队列。
对撤销队列中的各个事务进行撤销处理:反向扫描日志文件,对每个 Undo 事务的更新操作执行逆操作。
对重做队列中的各个事务进行重做处理:正向扫描日志文件,对每个 Redo 事务重新
执行日志文件登记的操作。
(3)介质故障与病毒破坏的恢复。在发生介质故障和遭病毒破坏时,磁盘上的物理数据库被破坏,这时的恢复操作可分为三步:
装入最新的数据库后备副本,使数据库恢复到最近一次转储时的一致性状态。
从故障点开始反向读日志文件,找出已提交事务标识将其记入重做队列。
从起始点开始正向阅读日志文件,根据重做队列中的记录,重做所有已完成事务,将数据库恢复至故障前某一时刻的一致状态。
(4)具有检查点的恢复技术。检查点记录的内容可包括:
建立检查点时刻所有正在执行的事务清单。
这些事务最近一个日志记录的地址。采用检查点的恢复步骤如下:
从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。
由该检查点记录得到检查点建立时所有正在执行的事务清单队列(A)。
建立重做队列(R)和撤销队列(U),把 A 队列放入 U 队列中,R 队列为空。
从检查点开始正向扫描日志文件,若有新开始的事务 T1,则把 T1 放入 U 队列,若有提交的事务 T2,则把 T2 从 U 队列移到 R 队列,直至日志文件结束。
对U 队列的每个事务执行 Undo 操作,对 R 队列的每个事务执行 Redo 操作。
DBA 要做的基本操作是:
重装最近转储的后援副本。
运行日志文件,执行系统提供的恢复命令。
数据库安全和恢复是数据库系统正常运行的保证。大型数据库管理系统一般都提供了实现安全机制的保证,即由系统提供了相应的功能,但小型的数据库管理系统并非都具有相应功能,因此有时需要人工的辅助措施,用以保证数据库的安全和恢复。
备份
数据库中的数据一般都十分重要,不能丢失,因为各种原因,数据库都有损坏的可能性
(虽然很小),所以事先制定一个合适的、可操作的备份和恢复计划至关重要。备份和恢复计划的制订要遵循以下两个原则:
(1)保证数据丢失的情况尽量少或完全不丢失,因为性价比的要求,这要取决于现实
系统的具体要求。
(2)备份和恢复时间尽量短,保证系统最大的可用性。数据库备份按照不同方式可分为多种,这里按照备份内容分为物理备份和逻辑备份两类。
物理备份是在操作系统层面上对数据库的数据文件进行备份,物理备份分为冷备份和热备份两种。冷备份是将数据库正常关闭,在停止状态下利用操作系统的 copy、cp、tar、 cpio 等命令将数据库的文件全部备份下来,当数据库发生故障时,将数据文件复制回来,进行恢复。热备份也分为两种,一种是不关闭数据库,将数据库中需要备份的数据文件依次置于备份状态,相对保持静止,然后再利用操作系统的 copy、cp、tar、cpio 等命令将数据库的文件备份下来,备份完毕后再将数据文件恢复为正常状态,当数据库发生故障时,恢复方法同冷备份一样。热备份的另外一种方式是利用备份软件(例如,veritas公司的netbackup,legato公司的 network 等)在数据库正常运行的状态下,将数据库中的数据文件备份出来。
为了提高物理备份的效率,通常将完全、增量、累积三种备份方式相组合。完全备份是将数据库的内容全部备份,作为增量、累积的基础;增量备份是只备份上次完全、增量或累积备份以来修改的数据;累积备份是备份自上次完全或累积备份以来修改过的数据。一个备份周期通常由一个完全备份和多个增量、累积备份组成。由于增量或累计备份导出的数据少, 所以其导出的文件较小,所需要的时间较少。利用一个完全备份和多个增量、累积备份恢复数据库的步骤如下:
(1)首先从完全备份恢复数据库。
(2)然后按照时间顺序从早到晚依次导入多个增量和累积备份文件。
逻辑备份是指利用各数据库系统自带的工具软件备份和恢复数据库的内容,例如, Oracle 的导出工具为 exp,导入工具为 imp,可以按照表、表空间、用户、全库等四个层次备份和恢复数据;Sybase 的全库备份命令是 dump database,全库恢复命令是 load database,另外也可利用 BCP 命令来备份和恢复指定表。
在数据库容量不大的情况下逻辑备份是一个非常有效的手段,既简单又方便,但现在随着数据量的越来越大,利用逻辑备份来备份和恢复数据库已力不从心,速度也很慢。针对大型数据库的备份和恢复一般结合磁带库采用物理的完全、增量、累积三种备份方式相组合来进行。但无论任何时候逻辑备份都是一种非常有效的手段,特别适合于日常维护中的部分指定表的备份和恢复。