以下内容为参考课件和《数据库系统概论》(第5版,王珊等著)的个人整理,若有错误欢迎指出
第十章 数据库事务恢复技术
文章目录
一、事务的基本概念
1、事务定义
用户定义的一个数据库操作序列,是一个不可分割的工作单位。
2、特性(ACID)
- 原子性(要么全做,要么不做)
- 一致性(执行结果保持一致性)
- 隔离性(一个事务的内部操作及使用的数据与其他并发事务隔离)
- 持久性(一个事务一旦提交之后,它对数据库的影响必须是永久的)
二、数据库恢复
1、定义
数据库管理系统必须具有把数据库从错误状态恢复到某一已知正确状态的功能,这就是数据库的恢复。
目的:保证事务原子性、恢复
2、故障的分类
-
事物内部的故障
又分为可预期(可通过事务程序本身发现处理)、不可预期(如死锁等)。只涉及一个事务
-
系统故障
指造成系统停止运行的任何事情。会影响正在运行的所有事务
-
介质故障
外存故障,如磁盘损坏等。会破坏数据库并影响存取相应数据的所有事务。
-
计算机病毒
人为的破坏或故障,是主要威胁之一。
3、恢复的实现技术
基本原理:冗余
因此关键在于如何建立冗余,如何利用冗余恢复数据。下面介绍建立冗余的常用方式。
(1)数据转储
DBA定期地将整个数据库复制到磁带或其它存储设备上保存起来的过程。这些备用的数据文本称为后备副本或后援副本。
发生故障后可以将后备副本重新装入。
根据存储状态又可以分为静态转储(在无事务运行时进行转储)、动态转储(必须把转储期间各事务对数据库的修改记录下来)。
根据转储的方式又分为海量转储(全存)和增量转储(只加上次更新过的)。
(2)登录日志文件
日志文件是用来记录事务对数据库的更新操作的文件。
日志文件主要有两种格式:以记录为单位的日志文件和以数据块为单位的日志文件。
以记录为单位的日志记录内容包括:
- 事务标识
- 操作类型(增删改)
- 操作对象(记录的内部标识)
- 更新前数据的旧值(对于插入,此项为空)
- 更新后数据的新值(对于删除,此项为空)
日志文件的具体作用:事务故障、系统故障恢复必须使用日志文件;动态转储必须建立日志文件,日志文件和后备副本综合才能保证备份的一致性
为保证数据库可恢复,必须先写日志文件,再写数据库(不然改了,但是没记下来修改操作,没法恢复);登记次序严格按照并发事务执行的时间顺序
4、恢复策略
(1)事务故障的恢复
反向扫描日志文件,查找改事务的所有更新操作,然后对此进行逆操作(插入->删除,删除->插入,修改就写回原值)
(2)系统故障的恢复
正向扫描日志文件,将故障发生前已提交的事务放入REDO队列,未完成的放入UNDO队列。
对REDO队列的事务依次重做,即正向扫描日志文件,对每一个REDO事务的操作重做。
对UNDO队列的事务依次撤销。即反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作。
(3)介质故障的恢复
装入最新的数据库后备副本,并装入转储开始时的日志文件副本。
装入转储后的日志文件副本,然后重做已经完成的事务
5、推迟、即时更新技术
- 推迟更新技术
在日志中记录对事务的所有更新操作,并且在事务提交时才执行。
- 即时更新技术
直接更新。不过也要求先写日志再更新。
6、具有检查点的恢复技术
提出背景:如果故障发生要检查所有日志;此外,如果许多要重做的事务已经存入数据库当中了,那么就没必要重做。
因此如果定期检查哪些已经存入数据库当中,就可以减少重做与需要查询的日志。
这种技术在日志文件中增加了一类新的记录——检查点
(1)检查点记录的内容
-
建立检查点时刻所有正在执行的事务清单
-
记录这些事务最近一个日志记录的地址(指针)
(2)重新开始文件:记录各 检查点记录 在日志文件中的位置
(3)动态维护日志
周期性建立检查点、保存数据库状态的操作。具体步骤是:
-
当前日志缓冲区中的所有日志记录写入磁盘的日志文件上
-
在日志文件中写入一个检查点记录
-
将当前数据缓存区的所有数据记录写入磁盘的数据库中
也就是说,如果一个事务的提交在检查点之前,那么就会被写入数据库。因此如果在之后发生故障,不用redo它。
-
把检查点记录在日志文件中的地址写入一个重新开始文件
(4)具有检查点的恢复操作
-
找到最后一个检查点记录(在重新开始文件中可以得到其位置)
-
将检查点记录中所有事务(即检查点时刻正在运行的)暂时全放入UNDO队列。
-
从检查点开始正向扫描文件日志:若有新开始的事务,就放入UNDO队列;有提交的事务,就放入REDO队列。
-
对UNDO中的每一个事物执行撤销,对REDO中的重做。
7、数据库镜像
根据DBA要求,自动把整个数据库或其中的关键数据复制到另一个磁盘上,被称为数据库镜像。每当主数据库更新时,DBMS自动把更新后的数据复制过去。
镜像可以用于恢复、提供一定的并行性。