首页 理论教育分布式数据库技术:恢复信息

分布式数据库技术:恢复信息

【摘要】:系统维护的恢复信息依赖于执行更新采用的方法。这要求T 1事先把T 1中的有些信息写到日志里。图10.8系统故障恢复时需redo和undo事务系统故障恢复时,如何处理这两个事务,可用图10.9和图10.10说明。图10.9redo事务图10.10undo事务如前所述,redo和undo操作都是幂等的。

本节假设只有系统故障发生,不考虑通信故障问题,这就类似处理集中式数据库的恢复。

发生系统故障时,易失(存储)数据库丢失。因此,DBMS必须在出现故障时保留一些状态信息,以便在故障出现后能恢复到原来的状态,我们把这类信息称为恢复信息。

系统维护的恢复信息依赖于执行更新采用的方法(见图10.6)。这里有两种选择:就地更新与异地更新。就地更新是在稳定存储器中按原来的地址物理性地改变数据项的值,结果原来的值丢失。异地更新不是在稳定存储器里直接修改数据项的值,而是在另外一个地方存放一个新值,周期性地将新值集成到稳定数据库里(一般是改变指针的指向,即将指向修改前的值的指针改为指向新值)。

由于就地更新会让原来的值丢失,因此必须保持数据库状态发生变化时有足够信息,以便能在故障发生后让数据库恢复到一个一致状态。这类信息典型地由数据库日志来维护。

图10.6 执行更新操作

现在我们来看一个发生系统故障时的事务,如图10.7所示。时间为0时DBMS开始执行,时间为t时发生系统故障。在间隔[0,t]内,有两个事务(记作T 1和T 2)递交给DBMS,其中一个(T1)在故障发生时已完成(即已提交),而另一个则并非如此。事务的持续性要求T1的效果应当反映在稳定数据库里。同样,原子性性质要求稳定数据库不包含T2的效果。需要采取专门的预防措施来保证这一点。

图10.7 发生系统故障时的事务

假设仅当缓冲管理器需要新的缓冲空间时,LRM和缓冲管理器算法才会将缓冲页面写回稳定数据库中。这种情况下,有可能由T 1更新的易失数据库页面已经在故障出现时写回了稳定数据库。因此,恢复时能够redo T 1的操作。这要求T 1事先把T 1中的有些信息写到日志里。通过这些信息,系统在恢复时可以找回老状态。

类似地,缓冲管理器可能把T2更新的某些易失数据库页面写入了稳存。到系统故障恢复时,必须undo T2的操作。这样,恢复信息必须包含足够的数据以undo新的数据库状态,恢复到事务T2开始时的原始状态,如图10.8所示。

图10.8 系统故障恢复时需redo和undo事务

系统故障恢复时,如何处理这两个事务,可用图10.9和图10.10说明。(www.chuimin.cn)

图10.9 redo事务

图10.10 undo事务

如前所述,redo和undo操作都是幂等的。换言之,即便在redo(或undo)实施期间又发生故障,导致redo(或undo)操作不成功,形成在redo(或undo)中又redo(或undo),呈级联状态,成功恢复时,事务的重复恢复动作等价于只做一次。

日志的内容按照实现技术的不同而有所不同。然而,每个数据库日志中至少要包含如下信息:begin-transaction记录、更新前数据项的值(称为前象,before image)、更新后数据项的值(称为后象,after image)和终止记录说明是提交还是夭折。前象和后象的颗粒可以不同,可以是记录整个页面,也可以是更小的单位。

类似于易失数据库,在内存中也维护一个日志(称为日志缓冲),然后写入稳定存储器。可以用两种方法将日志页面写入稳定存储器:一种是同步方法,指将日志在内存处理完后就移入稳定存储器;一种是异步方法,指周期性地将内存中的日志写入稳定存储器或者在缓冲区满时写入稳定存储器,如图10.11所示。

图10.11 日志接口

无论是采用同步方法还是采用异步方法书写日志,都需要一个维护日志的重要协议。如果更新数据库写入稳定存储器前,日志已经写入稳定存储器,则发生故障时容易通过日志给予恢复,反之不行。如前所述,为此推荐使用一个WAL(write-ahead logging)协议。

●在更新稳定数据库前,其前象必须写入稳定日志,以便undo。

●事务提交时,其后象必须在更新稳定数据库前存入稳定日志,以便redo。