什么是日志文件:

    • 日志文件是DBMS记录数据库全部更新操作的序列文件。
    • 每条日志都记录在日志尾部,日志文件是一个追加(append-only)文件。
    • DBMS允许事务的并发执行导致日志文件是“交错的”,但属于单个事务的日志顺序与该事务更新操作的执行顺序是一致的。
    • 日志记录通常是先写到日志缓冲区中,然后写到稳固存储器(如磁盘阵列)中。在不影响讨论的情况下,本章假设日志记录在生成时是直接写到稳固磁盘中。

    数据库中的日志记录有两种类型:

    • 记录数据更新操作的日志记录:包括UPDATE、INSERT和DELETE操作
    • 记录事务操作的日志记录:包括START、COMMIT和ABORT(事务中止)操作

    日志记录格式:

    • 表示事务T对数据元素A执行了更新操作,V1表示A更新前的值(前映像),V2表示A更新后的值(后映像)。对于插入操作,V1为空;对于删除操作,V2为空。
    • 表示事务T已经开始。此时DBMS完成对事务的初始化工作,如分配事务工作区等。
    • 表示事务T已经提交,即事务T已经执行成功(该事务对数据库的修改必须永久化)。事务提交时其更新的数据都写到了数据缓冲区中,但是由于不能控制缓冲区管理器何时将缓冲块从内存写到磁盘。因此当看到该日志记录时,通常不能确定更新是否已经写到磁盘上。
    • 表示事务已经中止,即事务执行失败。此时,如果T所做的更新已反映到磁盘上,DBMS必须通过UNDO操作来消除T对磁盘数据库的影响。

    先写日志规则:
    为了保证数据库能运用日志进行恢复,要求日志文件必须放到稳固存储器(如磁盘阵列)上,并且要求每条日志记录必须在其所包含的数据记录的更新值写到外存储器之前先写到稳固存储器上,先写(write-ahead)日志规则。

    撤销(UNDO)操作:

    • 对于要UNDO的事务T,日志中记录有以及T对数据库的所有更新操作的日志记录。
    • UNDO过程为:从事务T的最后一条更新日志记录开始,从日志尾向日志头(反向)依次将T更新的数据元素值恢复为旧值。

    重做(REDO)操作:

    • 与UNDO相反,REDO操作是对已提交事务进行重做,将数据库状态恢复到事务结束后的状态。
    • 对于要REDO的事务T,日志中已经记录了、T的所有更新操作日志以及
    • REDO过程为:从事务T的第一条更新日志记录开始,从日志头向日志尾(顺向)依次将T更新的数据元素值恢复为新值。

    发生系统故障时,利用日志文件恢复的基本过程如下:

    • 分析阶段:从日志头开始顺向扫描日志,确定重做事务集(REDO-set)和撤销事务集(UNDO-set)。将既有又有日志记录的事务T加入REDO-set;将只有没有日志记录的事务T加入UNDO-set。
    • 先做撤销操作:从日志尾反向扫描日志,对每一条属于UNDO-set中事务的更新操作日志依次执行UNDO操作
    • 后做重做操作:从日志头顺向扫描日志,对每一条属于REDO-set中事务的更新操作日志依次执行REDO操作。