本文整理了《数据库系统概论(第6版 王珊 杜小勇 陈红)》第十一章“数据库恢复技术”的课后习题及补充习题答案,一题一答形式呈现,方便学习者参考使用。

习题解答和解析

1. 试述事务的概念及事务的4个特性。数据库恢复技术能保证事务的哪些特性?

答案
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
事务具有4个特性(ACID特性):

  • 原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。
  • 一致性:事务执行的结果必须是使数据库从一个一致性状态转为另一个一致性状态。
  • 隔离性:一个事务的执行不能被其他事务干扰,即一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持续性:也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其执行结果有任何影响。
    数据库恢复可以保证事务的原子性与持续性。

2. 为什么事务非正常结束时会影响数据库数据的正确性?请举例说明之。

答案
事务执行的结果必须是使数据库从一个一致性状态转为另一个一致性状态。如果在数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于不正确/不一致的状态。
示例:某工厂库存管理系统中,将数量为Q的某种零件从仓库1移到仓库2,定义事务T包含两个操作:Q1=Q1−QQ1=Q1-QQ1=Q1QQ2=Q2+QQ2=Q2+QQ2=Q2+Q。若T非正常终止仅完成第一个操作,数据库会处于不一致状态,库存量无故减少Q。

3. 登记日志文件时为什么必须先写日志文件,后写数据库?

答案
把对数据的修改写到数据库、把表示该修改的日志记录写到日志文件是两个独立操作,故障可能导致仅完成其中一个。

  • 若先写数据库修改、未登记日志:后续无法恢复该修改;
  • 若先写日志、未修改数据库:恢复时仅多执行一次UNDO操作,不影响数据库正确性。
    因此必须先写日志文件,再写数据库修改。

4. 考虑下表所示的日志记录:

序号 日志
1 T1:T_{1}:T1: 开始
2 T1T_{1}T1 : 写 A,A=10A, A=10A,A=10
3 T2T_{2}T2 : 开始
4 T2T_{2}T2 : 写 B,B=9B, B=9B,B=9
5 T1T_{1}T1 : 写 C,C=11C, C=11C,C=11
6 T1T_{1}T1 : 提交
7 T2T_{2}T2 : 写 C,C=13C, C=13C,C=13
8 T3T_{3}T3 : 开始
9 T3T_{3}T3 : 写 A,A=8A, A=8A,A=8
10 T2T_{2}T2 : 回滚
11 T3T_{3}T3 : 写 B,B=7B, B=7B,B=7
12 T4T_{4}T4 : 开始
13 T3T_{3}T3 : 提交
14 T4T_{4}T4 : 写 C,C=12C, C=12C,C=12

①如果系统故障发生在序号14之后,说明哪些事务需要重做,哪些事务需要回滚。
②如果系统故障发生在序号10之后,说明哪些事务需要重做,哪些事务需要回滚。
③如果系统故障发生在序号9之后,说明哪些事务需要重做,哪些事务需要回滚。
④如果系统故障发生在序号7之后,说明哪些事务需要重做,哪些事务需要回滚。

答案
① 重做:T1T_{1}T1T3T_{3}T3;回滚:T2T_{2}T2T4T_{4}T4
② 重做:T1T_{1}T1;回滚:T2T_{2}T2T3T_{3}T3
③ 重做:T1T_{1}T1;回滚:T2T_{2}T2T3T_{3}T3
④ 重做:T1T_{1}T1;回滚:T2T_{2}T2

5. 考虑第4题所示的日志记录,假设开始时 A 、 B 、 C 的值都是0:

①如果系统故障发生在序号14之后,写出系统恢复后 A 、 B 、 C 的值。
②如果系统故障发生在序号12之后,写出系统恢复后 A 、 B 、 C 的值。
③如果系统故障发生在序号10之后,写出系统恢复后 A 、 B 、 C 的值。
④如果系统故障发生在序号9之后,写出系统恢复后 A 、 B 、 C 的值。
⑤如果系统故障发生在序号7之后,写出系统恢复后 A 、 B 、 C 的值。
⑥如果系统故障发生在序号5之后,写出系统恢复后 A 、 B 、 C 的值。

答案
A=8,B=7,C=11A=8, B=7, C=11A=8,B=7,C=11
A=10,B=0,C=11A=10, B=0, C=11A=10,B=0,C=11
A=10,B=0,C=11A=10, B=0, C=11A=10,B=0,C=11
A=10,B=0,C=11A=10, B=0, C=11A=10,B=0,C=11
A=10,B=0,C=11A=10, B=0, C=11A=10,B=0,C=11
A=0,B=0,C=0A=0, B=0, C=0A=0,B=0,C=0

6. 针对不同的故障类型(事务故障、系统故障、介质故障),试给出恢复的策略和方法。

答案

  • 事务故障恢复步骤
  1. 反向扫描日志文件,查找该事务的更新操作;
  2. 对该事务的更新操作执行逆操作(将日志记录中“更新前的值”写入数据库);
  3. 直至读到此事务的开始标记,恢复完成。
  • 系统故障恢复步骤
  1. 正向扫描日志文件,找出故障前已提交事务(记入重做队列REDO-LIST)、故障时尚未完成事务(记入撤销队列UNDO-LIST);
  2. 对UNDO-LIST中事务执行UNDO处理;
  3. 对REDO-LIST中事务执行REDO处理。
  • 介质故障恢复步骤
  1. 装入最新数据库后备副本,恢复到最近一次转储的一致性状态;
  2. 装入转储结束时刻的日志文件副本;
  3. 启动恢复命令,由DBMS重做已完成的事务。

7. 什么是检查点记录?检查点记录包括哪些内容?

答案
检查点记录是一类新的日志记录,内容包括:

  1. 建立检查点时刻所有正在执行的事务清单;
  2. 这些事务的最近一个日志记录的地址。

8. 具有检查点的恢复技术有什么优点?试举一个具体的例子加以说明。

答案
传统日志恢复需扫描整个日志、且可能重复执行已写入数据库的REDO操作,耗时耗资源;检查点技术可解决该问题,缩短日志扫描时间、避免无意义的REDO操作。
示例:如图,日志文件包含检查点及事务T1/T2/T3/T4/T5记录。在采用检查点技术之前,恢复时需要从头扫描日志文件; 而利用检查点技术只需要从“开始扫描日志,这就缩短了扫描日志的时间。T1 事务的更新 操作实际上已经写到数据库中了,进行恢复时没有必要再 REDO 处理,采用检查点技术做到 了这一点。
T1 无需重做,T2T4 重做,T3T5 撤销
如图

9. 试述使用检查点方法进行恢复的步骤。

答案

  1. 在重新开始文件中找到最后一个检查点记录在日志文件中的地址,据此找到该检查点记录;
  2. 从检查点记录获取建立时刻正在执行的事务清单ACTIVE-LIST,建立UNDO-LIST(需UNDO的事务)、REDO-LIST(需REDO的事务),将ACTIVE-LIST暂放入UNDO-LIST,REDO-LIST暂为空;
  3. 从检查点开始正向扫描日志文件:
    • 若有新开始事务TiT_{i}Ti,暂放入UNDO-LIST;
    • 若有已提交事务TjT_{j}Tj,将其从UNDO-LIST移至REDO-LIST,直至日志文件结束;
  4. 对UNDO-LIST中事务执行UNDO操作,对REDO-LIST中事务执行REDO操作。

10. 什么是数据库镜像?它有什么用途?

答案
数据库镜像:根据DBA要求,自动将整个数据库或关键数据复制到另一磁盘;主数据库更新时,DBMS自动同步复制更新后数据,保证镜像数据与主数据库一致。
用途:

  1. 数据库恢复:介质故障时,镜像磁盘可继续使用,DBMS自动利用镜像数据恢复,无需关闭系统、重装副本;
  2. 提高可用性:无故障时,用户修改数据加排他锁,其他用户可读取镜像数据库数据,无需等待锁释放。

补充习题及答案

1. 问答题

(1)在系统故障的恢复策略中,为什么UNDO处理反向扫描日志文件,REDO处理正向扫描日志文件?说明恢复系统是否可以保证事务的原子性和持续性。

答案

  • 扫描方向原因:
    UNDO:若存在同一数据的多个UNDO操作,需将数据恢复到第一个失败事务之前,正向扫描无法实现,因此反向扫描;
    REDO:若存在同一数据的多个REDO操作,需将数据恢复到最后一个成功事务之后,因此正向扫描。
  • 事务特性保证:
    原子性:UNDO取消未提交事务的所有操作,REDO完成已提交事务的所有操作,确保事务要么全做、要么全不做;
    持续性:REDO保证已提交事务对数据库的修改永久生效,确保事务持续性。

2. 综合题

考虑下表所示的日志记录:

序号 日志
1 T1T_{1}T1 : 开始
2 T1:写AT_{1} : 写 AT1:A
3 T2T_{2}T2 : 开始
4 T2T_{2}T2 : 写 BBB
5 T3:T_{3}:T3: 开始
6 T1T_{1}T1 : 提交
7 T2T_{2}T2 : 回滚
8 T3:T_{3}:T3:CCC
9 T4T_{4}T4 : 开始
10 T4:T_{4}:T4:AAA
11 T5:T_{5}:T5: 开始
12 T6T_{6}T6 : 开始
13 检查点
14 T7T_{7}T7 : 开始
15 T3T_{3}T3 : 提交
16 T4T_{4}T4 : 回滚
17 T5:T_{5}:T5:BBB
18 T8T_{8}T8 : 开始
19 T6:T_{6}:T6:AAA
20 T6T_{6}T6 : 提交
21 T8:T_{8}:T8:AAA
22 T8T_{8}T8 : 提交
23 T7:T_{7}:T7:CCC

①如果系统故障发生在序号23之后,说明系统如何进行恢复。
②如果系统故障发生在序号19之后,说明系统如何进行恢复。

答案
T3T_{3}T3T6T_{6}T6T8T_{8}T8 重做,T4T_{4}T4T5T_{5}T5T7T_{7}T7 撤销,T1T_{1}T1T2T_{2}T2 不操作;
T3T_{3}T3 重做,T4T_{4}T4T5T_{5}T5T6T_{6}T6T7T_{7}T7T8T_{8}T8 撤销,T1T_{1}T1T2T_{2}T2 不操作。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐