案例驱动的数据库恢复策略剖析

2019-11-21 05:38
关键词:系统故障事务日志

汪 洋

(安庆师范大学计算机与信息学院,安徽安庆246133)

数据库系统发生故障不可避免,如何保证发生故障后迅速将数据库恢复到正确的状态,是衡量一个数据库管理系统(DBMS)优劣的重要指标[1],也是数据库管理员(DBA)必备的技能之一。深刻理解并掌握数据库系统恢复策略是数据库教学中的一个重点和难点,现有数据库教材及实际教学中对恢复策略的介绍太偏重理论,学生理解困难,难以真正掌握其实际应用。本文以案例形式详细分析了事务故障、系统故障和介质故障[1-3]这3类数据库故障的成因和产生的结果,并详细介绍了恢复策略。

1 案例驱动的事务故障恢复策略

事务故障是对单个事务而言的,指发生事务故障时,该事务未运行到Commit Transaction 或Rollback Transaction处被终止,此时该未完成的事务把对数据库的修改已写入数据库。

1.1 事务故障的案例剖析

案例1如图1所示,T1事务由两个操作构成,A=A+1,B=B-1。T1事务在运行完第一个操作A=A+1后,发生了事务故障,第二个操作B=B-1没有做,显然T1事务是一个未完成的事务。若A的初值为1,B的初值为2,在如图2所示的数据库存储中,此时事务T1对A的修改操作已写入数据库,数据库中A的值由1被修改为2,很显然数据库中A=2是错误的,此时数据库处于不一致(不正确)的状态,其原因就在于未完成的T1事务对A的修改操作已经写入到数据库。

1.2 事务故障恢复策略

对于事务故障的恢复策略是利用日志文件对未完成的事务执行撤消处理(Undo)。DBMS将事务的开始标记、结束标记和事务对数据库的所有更新操作形成日志记录并写入日志文件,在案例1中形成了如图3所示的日志文件。

恢复策略:(1)反向扫描图3所示的文件日志,查找T1事务的更新操作;(2)对T1事务的每一个更新操作执行逆操作,将图3中日志记录中更新前的值A=1写入数据库,此时图2中数据库中A的值由2又变回原值1;(3)继续反向扫描日志文件,查找T1事务的其他更新操作,并做同样处理,直至读到T1事务的开始标记结束。

图1 案例1事务故障示意图

图2 案例1数据库存储变化示意图

图3 案例1的日志文件

2 案例驱动的系统故障恢复策略

系统故障是指由于某些原因导致数据库系统必须重启的故障[1]。发生系统故障时,数据库中有多个事务发生事务故障,此时,未完成的事务对数据库的修改已写入数据库,而已完成的事务对数据库的修改可能放于缓冲区内还未写入数据库。以简单易懂为目的,我们以两个事务为例来介绍系统故障的成因和结果。

2.1 系统故障的案例剖析

案例2如图4所示,当前数据库系统中运行T1和T2两个事务,图5所示的数据库存储中A、B、C、D的初值分别为1,2,3,4。T1事务执行完第一个操作A=A+1,并把对A值的修改写入数据库,此时数据库内A的值由1变为2。然后T2事务依次执行了C=C+2,D=D-2两个操作,此时修改值C=5,D=2存放于如图6所示的系统缓冲区中,还未写入数据库时就发生了系统故障。显然数据库中A=2是错误的,此时数据库处于不一致(不正确)的状态,其原因是未完成的T1 事务对A 的修改操作已经写入到数据库;另一方面,T2是已完成事务,但对C和D值的修改没有来得及写入数据库中。

2.2 系统故障恢复策略

发生系统故障时,未完成的事务对数据库的更新操作已写入数据库,已完成的事务对数据库的更新留在缓冲区中未写入数据库。系统故障的恢复策略是利用日志文件形成两个队列:Undo队列和Redo队列。对Undo 队列中的未完成事务执行撤消处理(Undo),对Redo 队列中的已完成事务执行重做处理(Redo)。在案例2中形成了如图7所示的日志文件。

恢复策略:(1)正向扫描图7 所示的日志文件,未完成事务T1 放入Undo 对列,已完成事务T2 放入Redo队列。(2)对Undo队列中所有事务逐个执行事务故障恢复策略,即进行Undo处理。反向扫描如图7所示的日志文件,对T1事务的更新操作执行逆操作,即将日志记录中更新前的值A=1写入数据库,此时图6中数据库中A的值由2又为回原值1。(3)对Redo队列所有事务逐个进行Redo处理。正向扫描如图7所示的日志文件,对T2事务的所有更新操作执行重新登记,即将日志记录中更新后的值C=5,D=2写入数据库。

图4 案例2系统故障示意图

图5 案例2数据库存储变化示意图

图6 案例2缓冲区示意图

图7 案例2的日志文件

3 案例驱动的介质故障恢复策略

介质故障是指由于某些原因导致存放在存储设备上数据库部分或全部遭到破坏,磁盘上的物理数据和日志文件部分或全部丢失[3]。介质故障的恢复需要后备副本和日志文件副本,DBA在数据库的日常运行维护中要制定详细的备份计划并做好备份工作。限于文章篇幅,本文以SQL Server 为具体DBMS[4],通过一个实际案例简要介绍数据库备份和介质故障恢复策略。

3.1 介质故障的案例剖析

案例3如图8所示,现有一个产品销售数据库cpxs,其中有产品表CP、产品销售表CPXSB、销售商表XSS 3张表。首先创建一个备份设备Test1,接着将整个cpxs数据库进行完全备份并存放于Test1备份设备上,形成FILE1文件;然后向数据库中添加人事表RS,并进行一次差异备份并存放于Test1备份设备上,形成FILE2文件;最后向数据库中添加订货表DHB,并进行一次日志备份,并存放于Test1备份设备上,形成FILE3文件。

图8 案例3备份过程示意图

该cpxs数据库备份过程的详细T-SQL语句如下:

sp_addumpdevice'disk','Test1','D:ackupTest1.bak'/*增加Test1备份设备*/

BACKUP DATABASE cpxs TO Test1 WITH INIT/*重写完全备份cpxs到Test1备份设备,NOINIT为追加*/

create table RS/*添加员工人事表RS*/

(emp_no char(5)primary key,emp_name varchar(10), sex char(2),dept varchar(10))

BACKUP DATABASE cpxs TO Test1 WITH DIFFERENTIAL/*追加差异备份cpxs到Test1备份设备*/

create table DHB/*添加订货表DHB*/

(order_no char(5),prod_no char(5),qty int price numeric(7,2),order_date datetime)

BACKUP LOG cpxs TO Test1/*追加备份日志文件到Test1备份设备*/

3.2 介质故障的恢复策略

介质故障的恢复需要DBA重装备份的数据库副本和有关的日志文件副本,并执行系统提供的恢复命令。

恢复策略:经过前期备份后,形成了两个数据库副本和一个日志副本,分别对应存储于Test1备份设备的FILE1、FILE2和FILE3。DBA重装这些数据库副本和日志副本可以得到不同状态的cpxs数据库,解决介质故障破坏磁盘上数据库的问题。该cpxs数据库恢复过程的详细T-SQL语句如下:

ALTER DATABASE cpxs SET RECOVERY FULL/*设置cpxs数据库恢复模型为全模型*/

RESTORE DATABASE cpxs FROM Test1 WITH FILE=1, NORECOVERY/*恢复完整备份,完全备份是Test1备份设备的FILE1,并挂起数据库cpxs*/

RESTORE DATABASE cpxs FROM Test1 WITH FILE=2, NORECOVERY/*恢复差异备份,差异备份是Test1备份设备的FILE2,并挂起数据库cpxs*/

RESTORE LOG cpxs FROM Test1 WITH FILE=3, RECOVERY/*恢复日志备份,日志备份是Test1备份设备的FILE3*/

4 结束语

为解决数据库恢复教学中理论过于抽象、学生不易掌握的问题,作者在多年数据库教学实践研究中,探索出一种基于案例的数据库恢复策略教学方法,该方法直观易懂、简单清晰、操作性强,学生参与度高,易为学生理解和掌握。该方法在多年的教学实践中得到了检验,并取得了较好的教学效果。

猜你喜欢
系统故障事务日志
某型水泵旋转系统故障分析
一名老党员的工作日志
扶贫日志
河湖事务
雅皮的心情日志
基于OCC-DA-MCP算法的Redis并发控制
游学日志
2015款奔驰R400车预防性安全系统故障
雷克萨斯ES350车空调系统故障2例
汉兰达车空调系统故障排除4例