sql故障恢复
系统故障可分为:事务内部故障、系统范围内故障、介质故障和计算机病毒四类。
1.事务内部故障
事务内部故障是指事务运行没有达到预期的终点,未能成功地提交事务,使数据库处于不正确状态。事务内部故障有的可以通过事务程序本身发现,是可预期的故障,但更多的是不可预期的故障,如数据溢出等。当发生事务内部故障时,可强行回滚(ROLLBACK)该事务,这类恢复操作称为撤消(UNDO)。
2.系统范围的故障
造成系统停止运行的任何事件都称为系统故障,如停电、操作系统故障。这类故障造成正在运行的事务非正常终止,数据库缓冲区中数据的丢失。若发生系统范围的故障,恢复子系统必须在系统重新启动时让所有非正常终止的事务回滚,若事务只作一半便发生故障,必须先撤消该事务,然后重做。
3.存储介质故障
系统故障又称软故障,存储介质故障称为硬故障。硬故障发生的可能性小,但破坏性极大。如硬盘损坏等。
4.计算机病毒
计算机病毒主要破坏计算机软件系统,由计算机病毒引起的故障属于系统范围的故障。
各种故障对数据的影响有两种可能性。一是数据库本身被破坏;二是数据库没有破坏,但数据不正确。
数据恢复可分两个方面来讨论:一是事务或系统故障的恢复;另一个是存储介质故障的恢复。对于事务和系统故障涉及的存储器主要是主存储器和高速缓冲存储器,这两个存储器属临时存储器。当事务或系统发生故障时,临时存储器上的数据要么被破坏,要么全部丢失。存储介质的故障涉及的存储器主要是硬盘、软盘、磁带等永久存储器。不管哪种故障恢复都必须借助日志文件,日志文件必须存放于理论上永远不会损坏的存储器上,称为永恒存储器。
5.5.2.1登记日志文件
数据库系统中,记录有关事务更新操作信息的文件称为日志文件。在日志文件中除记录更新操作有关信息外,还记载事务处理过程中的重要事件,如事务的提交或异常结束等。
不同的数据库系统采用不同的日志文件,这些日志文件主要有两种格式:一是以记录为单位的日志文件;一是以数据块为单位的日志文件。
⑴以记录为单位的日志文件登录的内容:
① 各事务的开始标记,用表示。
② 各事务的结束标记,用表示事务已经提交。
③ 各事务的所有更新操作。用表示T事务在数据对象X上执行的操作,其中V1、V2表示更新前后数据对象的值。
⑵以数据块为单位的日志文件登记的内容包括:
① 事务标识
② 被更新的数据块。
5.5.2.2事务故障恢复和系统故障恢复
数据库系统的恢复包括事务恢复、数据库状态恢复和系统服务恢复。数据库恢复操作的依据是后备副本和事务日志文件。
事务恢复 事务恢复是指事务未运行至正常终止点前被撤消,此时应对该事务做撤消处理。
发生事务故障时:
1)执行一个ABORT并UNDO(清除)它对数据库的任何改变,即进行下面所述的“向后恢复”数据库;
2)清除它对其它事务的影响,即ABORT那些读了它的"废数据"的事务。这又可能进一步引起事务的ABORT,称为串联撤消过程;
3)UNDO所有被撤消的事务对数据库所作的任何改变。
事务故障的恢复由系统自动完成。
数据库恢复 使数据库复原到故障之前的状态。主要的方式有通过重新处理恢复,通过前向/后向回滚来恢复。
通过重新处理恢复:
这种恢复过程要求由最近的后备副本复原数据库,再重新运行自最近一次后备以来所有的程序或事务。其优点是简单,DBMS不需要建立数据库改变的日志,只需要记录事务的日志。
缺点主要有两个:一个是花费的时间比较长,对事务处理负担重的大系统中是很难接受的。二是重新运行事务的顺序与原来执行的顺序可能会不同,这样可能导致完全不同的结果。为此,还需要提供更复杂的恢复方法。
通过前向/后向回滚来恢复
前向回滚(rollforward) 也称REDO就是用后备副本复制原数据库,再用数据库改变日志的后备映像恢复自建立后备副本以来所作的改变。
优点 向前恢复比重运行恢复省时间,因为它只恢复对数据库已作改变的数据。
适用情况 这种恢复是假定了对数据库已作的变更都是正确的,所以它适用于受系统故障和介质故障影响的自上次后备以来的正常结束事务对数据库的更新。
后向回滚(rollback) 后向回滚的思想与前向回滚的思想是一样的,所不同的是在于使用前映像而不是后映像,即通过撤消已经对数据库作出的变更,来退出错误或仅仅处理了一部分的事务所做的变更,以便排除对数据库所作的无效改变(简称UNDO)。接着,重新启动在出现故障时正在处理的有效事务。
系统故障的恢复 由系统重新启动时自动完成。其恢复步骤如下:
① 正向扫描日志文件,找出故障发生前已经提交的事务,将其事务标识记入重(REDO)队列,同时找出故障发生时尚未完成的事务,将其事务标识记入撤消(UNDO)队列。
② 对撤消队列中的各个事务进行撤消(UNDO)处理。
③ 对重做队列中的各事务进行重做(REDO)处理。
图5.10 撤消和重做事务
5.5.2.3存储介质故障的恢复
存储介质故障恢复的原理很简单:冗余。即利用存储在别处的冗余数据来重建数据库。所以存储介质故障的恢复涉及两个问题:一是如何建立冗余数据;二是如何利用冗余数据恢复数据库。最常用的方法有:转储和登记日志文件。
1.转储与恢复
转储即数据库管理员定期将整个数据库复制到磁带或另一个磁盘上保存起来。当数据库遭受到破坏时,可以利用这些数据来恢复数据库,但只能恢复到转储时的状态,在这以后所运行的事务必须重新运行才能恢复到故障时的状态。
转储可分为静态转储和动态转储两种。
静态转储是指转储期间不允许对数据库进行任何存取和更新操作。
其中Ta~Tb为静态转储阶段,从Ta时刻开始转储,到Tb时刻转储完毕。若Tf时刻发生故障,则重装后备副本,只能恢复到转储结束时刻,其后的事务必须重做。
动态转储是指转储期间允许对数据库进行存取和更新操作。
采用动态转储必须借助日志文件,把转储期间的存取活动登记下来作为后援副本,方能保证恢复到转储结束时刻的正确状态。
转储又可分为海量转储和增量转储。海量转储每次转储全部数据库;增量转储指每次只转储上次转储后更新过的数据。综上所述,转储可分两种方式和两种状态,相互结合,总共有四种类型:
日志文件的作用除进行事务故障的恢复和系统故障的恢复外,还用于存储介质故障的恢复。存储介质故障的恢复主要通过转储来实现。在动态转储中,后援副本必须和日志文件结合起来才能有效地恢复数据库。在静态转储中,若数据库被破坏,必须先利用后备副本文件装入到上一次转储结束前的正确状态,然后再利用日志文件把已经完成的事务重新处理,使数据库恢复到故障前的某一时刻的正确状态。
介质故障恢复策略
磁盘介质故障的恢复方法是重装后备数据库,然后重做已完成的事务。具体做法如下:
(1)装入最近的数据库后备副本,即故障前最后一次转储的数据库副本。使数据库恢复到最后转储时的一致性状态。
(2)打开永恒存储器中的日志文件,正向扫描日志文件,找出故障发生时已经提交的事务的标识,将其记入重做队列。然后对重做队列中的所有事务进行重做。
这样便可把数据库恢复到故障前的某一时刻的一致性状态。不过按照这种方法进行恢复存在着严重的弊端。一方面需要搜索整个日志文件,耗费大量的时间。另一方面需要重做大量已经成功地将其更新操作结果写入数据库的事务,浪费极大。目前已经发展了具有检查点的恢复技术,可以解决这个问题。
检测点(checkpoint)技术
检测点 是数据库和事务日志之间的同步点。在检测点上DBMS:
1)拒绝接受新的事务请求;
2)停止正在处理的还未完成的一切事务;把缓冲区写入磁盘;
3)等待OS确认所有对数据库和日志的写请求都已完成(此时数据库和日志是同步的),接着,向日志写入一条检测点记录。
利用检测点的恢复 只需要在检测点之后出现的事物的后映像。
利用检测点恢复的例
5.5.2.4数据库镜像
存储介质故障是破坏性最严重的故障。虽然发生的机会较少,但一旦发生,造成的损失将无法估量,而且恢复非常麻烦。为了尽量减少因存储介质故障造成的损失,DBA必须周期性转储数据库,既费时又费力。
为了避免磁盘介质故障影响数据库的可用性,许多数据库管理系统提供了数据库镜像功能,用于数据库的恢复。即根据DBA的要求,DBMS自动把整个数据库或其中关键数据复制到另一个磁盘上,每当主数据库更新时,DBMS自动把更新后的数据复制到镜像磁盘上。一旦发生介质故障,系统自动切换到镜像磁盘上,避免了因介质故障而关闭系统。用户应用不用中断,也无须重装数据库后备副本,更不用重做转储后已经做过的操作。
另一方面,在没有出现故障的时候,数据库镜像还可以用于并发操作,即某一数据对象被加X锁时,其它用户要访问该数据对象不用等待,可从数据库镜像上读取。