备份和恢复
系统可能发生的故障有很多种,每种故障需要不同的处理方法。数据库系统主要会发生以下几种故障。
事务故障
有两种错误可能造成事务执行失败:
- 逻辑错误:事务由于某些内部条件而无法继续正常执行,这样的内部条件如非法输入、找不到数据、溢出或超出资源限制。
- 系统错误:系统进入一种不良状态(如死锁),结果事务无法继续正常执行,但该事务可以在以后的某个时间重新执行。
系统故障
硬件故障,或者是数据库系统或操作系统的漏洞,导致易失性存储器内容的丢失,并使得事务处理停止,而非易失性存储器仍完好无损。
硬件错误和软件漏洞导致系统终止,而不破坏非易失性存储器内容的假设称为故障-停止假设。设计良好的系统在硬件和软件层有大量的内部检查,一旦错误发生就会将系统停止。因此,故障-停止假设是合理的。
磁盘故障
在数据传送操作过程中由于磁头损坏或故障造成磁盘块上的内容丢失。其他磁盘上的数据拷贝,或三级介质(如DVD或磁带)上的归档备份可用于从这种故障中恢复。
其他故障
天灾(地震或火灾等自然灾害),人祸(人为破坏机房或数据),间谍或黑客攻击,等。
故障的恢复
稳定存储器或者近似稳定存储器在恢复算法中起着至关重要的作用。
稳定存储器通常是用非易失性存储介质来近似实现,在多个非易失性存储介质上以独立的故障模式复制所需信息,并且以受控的方式更新信息,以保证数据传送过程中发生的故障不会破坏所需信息。
系统如何从故障中恢复?首先需要确定用于存储数据的设备的故障方式;其次,考虑这些故障方式对数据库内容的影响;最后提出在故障发生后仍保证数据库一致性以及事务原子性的恢复算法。
如果想要恢复到故障发生前的状态,就必须知道当时的状态。那么如何实现呢?答案是引入日志记录数据库中所有修改。因为存储器是计算和保存的基础,计算过程中数据仅临时使用,而最终结果数据将永远保存。
日志
常用日志记录格式:
- 更新日志记录:
<Ti,Xj,V1,V2>
,描述一次数据库写操作。包含事务标识、数据项标识、旧值和新值等字段。 - 事务开始日志记录:
<Ti start>
,表明事务Ti开始执行。 - 事务提交日志记录:
<Ti commit>
,表明事务Ti提交。事务提交日志记录是一个事务最后的一个日志记录,当一个事务的提交日志记录输出到稳定存储器后,意味着该事务提交,也就是所有更早的日志记录都已经输出到稳定存储器中。因此,在日志中就有足够的信息来保证,即使系统崩溃,事务所做的更新也可以重做。 - 事务中止日志记录:
<Ti abort>
,表明事务Ti中止。
登记日志的原则
其中,写日志文件操作是把表示这个修改的日志记录写到日志文件;写数据库操作是把对数据的修改写到数据库中。
在故障恢复机制中,采用日志记录数据库更新,日志记录在创建时都输出到稳定存储器。 通常向稳定存储器的输出是以块为单位进行的,而大多数情况下,一个日志记录比一个块要小得多,每个日志记录的输出就转化成在物理上大得多的输出&#