一、引言
在系统正常运行的情况下,事务处理的恢复机制应采取某些技术措施为恢复做好相应的准备,保证在系统发生故障后,能将数据库从一个不一致的错误状态恢复到一个一致性状态
恢复技术主要包括
- 生成一个数据库日志,来记录系统中事务的运行情况及事务对数据库的更新
- 还有就是对磁盘上的数据进行转储
二、日志
1、DBMS为系统创建的每一个数据库维护着一个日志,来记录事务对数据库的所有更新操作,可反映每一个时刻数据库的状态变化
2、日志是数据库上所有运行事务按时间顺序产生的日志记录序列,日志内容不能由用户进行修改和删除
3、不同DBMS采用的日志记录格式并不完全一样,基本包含如下几种类型的日志记录
日志记录内容
- 【start_transactionn,T】:事务T开始执行
- 【commit,T】:事务T成功完成
- 【abort,T】:事务T异常中止
- 【write,T,X,旧值,新值】:事务T将数据项X的值从旧值改为新值
每当事务执行时,事务的开始,事务的结束,以及事务对数据库的更新操作信息就被记录到日志里,对于更新操作的日志记录,记录里要包括事务的标识和操作的数据对象以及更新前数据的值和更新后数据的值来标明是哪个事务对哪个数据对象进行的更新,数据的值可为空值
为保证日志可用于恢复,把日志记录登记在日志里时必须遵循两条原则
- 一是由于DBMS可能同时处理多个事务,在日志中登记日志记录的顺序必须严格按各事务中操作执行的时间先后次序。
事务T产生的日志记录,可能与其他事务的日志记录相互交错,这里给出一段6个事务中的操作交错执行的日志示意图,其中的Bi代表事务Ti的开始执行日志记录,Ci代表事务Ti的成功完成提交日志记录,Wi代表事务Ti写数据到缓冲区,即更新数据的日志记录,Ai代表事务Ti的异常终止日志记录。每个事务的第一条日志记录都是该事务的开始记录,最后一条日志记录为commit记录或abort记录
- 另一个登记日志记录的原则是在把数据的更新的结果写入到磁盘数据库之前,记录这个更新的对应日志记录必须先写入日志中。
数据的更新结果和新产生的日志记录首先都存储在内存的缓冲区内,把数据的更新结果写入磁盘数据库和把记录这个更新的对应日志记录写入日志中是两个输出操作,有可能在这两个操作之间发生故障。如果先进行了数据更新,假如将数据项X由3更新为5然后发生系统故障,内存缓冲区内容被刷新,则在日志中并没有登记表示这个更新的日志记录,那么后面无法撤销这个更新操作,再将数据项由5改为3了
DBMS的事务处理的恢复机制必须能实现将日志缓冲区中的日志记录先写到磁盘的日志中,并且要保证磁盘上的日志的可靠存储
三、数据转储
1、日志可以提供事务故障和系统故障后的数据恢复保障,为了在发生介质故障造成磁盘上的数据丢失时数据库也能进行恢复,通常还要采用数据转储技术
2、数据转储数据库管理员DBA定期地在某种存储介质如磁盘或光盘等创建一个与数据库分离的数据库备份并把备份存放在安全可靠的地方,这些数据库备份简称为备份,也称后备副本等
3、备份保存数据库在转储时的数据库状态。
4、转储是一个冗长的过程,十分耗费时间和资源,不能频繁进行,DBA应该根据数据库使用情况确定一个适当的转储方式和转储周期,比如根据转储时系统状态的不同,转储可分为静态转储和动态转储
如果有可能暂时关闭数据库系统,可以进行静态转储,静态转储是在在系统中无运行事务时进行的,也就是要等待正在运行的用户事务结束,新的事务必须等待转储结束才能开始执行,因此转储期间没有对数据库的存取或更新操作,也不会产生日志记录
- 静态转储最大的优点是能够得到一个与转储时的数据库相一致的备份
- 但会降低数据库系统的运行效率
因有的转储可能要几个小时,而大多数数据库系统不能在转储所需要的一段时间内关闭,因此需要进行动态转储,动态转储与用户事务可以并行,转储期间允许事务对数据库进行存取或更新
- 动态转储可以克服静态转储的缺点,它不用等待正在运行的用户事务结束,也不会影响新事务的执行
- 但是在动态转储的过程中,系统中的运行事务可能会更新磁盘上的数据库中的数据,转储到备份上的数据库可能会包含未提交事务的中间执行结果,是数据库处于某个不一致状态时的值,得到的备份可能不是数据库某个一致性状态的备份
5、根据转储的备份,转储可分为完全转储和增量转储
- 完全转储在每次转储时都复制整个数据库,每次备份的数据量大,时间长
- 增量转储只需要复制上次转储后更新过的数据,每次备份的数据量小,时间短
数据库以数据文件和日志文件的形式存储在磁盘介质上,数据转储就是要得到这些磁盘文件的备份
例如SQL Server支持的T-SQL语言提供可完成对数据库进行完全存储和增量转储的BACKUP操作语句来得到全备份或增量备份。该语句可对单个数据文件进行转储,
也可对包括多个数据文件的文件组进行转储,
可对事务日志进行转储,得到上一次完全转储后生成的新日志备份,需指定备份所在的存储路径和物理存储文件,
可指定进行数据文件的完全转储还是增量转储,
每次增量转储得到的是上一次完全转储后的增量备份、系统生成的活动日志以及转储得到的数据库全备份,增量备份和日志备份构成的数据库备份均是为数据库产生的冗余数据,利用这些冗余数据才能在发生故障后将数据库从一个不一致的错误状态恢复到一个一致性状态
四、小结