日志:先记日志后写数据库
-
记日志----(出错)-----写数据库:数据库还没有被修改,数据库还是好的
-
记日志 ----- 写数据库 ----(出错):数据库内的文件可能有问题,但日志是好的,可以根据日志恢复数据库
如果反过来 先写数据库再写日志,那么若 写数据库----(出错) ----记日志,这种情况数据库中数据可能有问题,但是又没有日志的记录,谁都不知道数据库中已经有错误了
恢复策略
正向扫描日志文件,若事务既有start,又有commit,需要redo;若只有start,需要undo。因此有两个队列:redo队列和undo队列
undo:反向扫描日志文件(从新到旧),用旧值覆盖新值
redo:正向扫描日志,新值覆盖旧值
各种各样的更新策略
steal:允许读一个未提交的数据
即时更新:只要数据有了修改,立马记日志,output到数据库中,注意此时并没有commit。此时数据库中的脏数据是可以被其他事务读取的。
即时更新既需要redo,又需要undo
若数据库中的数据被修改,但是执行该操作事务还没有commit,那么被修改的这些数据称为”脏数据“
no steal:不允许读一个未提交的数据(脏数据)
延迟更新:等到commit之后,再记日志,改数据库,因此不会有脏数据。
force:commit必须写在最后。即先日志,再数据库,最后commit
系统故障恢复时,若数据库采用force策略
- 如果看到commit,说明是在commit之后出错的,而在此之前日志和数据库都已经同步了,因此什么都不用做
- 没看到commit,当事务没发生过,做undo,把全部涉及的数据修改回事务start的状态。
因此,force策略只需要undo
no force:commit提前。只要日志写好了,就立马commit
系统故障恢复时,若数据库采用no force策略
- 如果看到commit,说明日志是好的,做redo,把所有数据更新为新值
- 没看到commit,说明此时还没开始修改数据库,数据库内的数据都是没问题的,什么都不用做
因此,no force策略只需要redo
采用检查点的恢复策略
① 将当前日志缓冲中的所有日志记录写入磁盘的日志文件上
② 在日志文件中写入一个检查点记录(checkpoint)
③ 将当前数据缓冲的所有数据记录写入磁盘的数据库中
④ 把检查点记录在日志文件中的地址写入一个重新开始文件
上述2、3两步可以互换,各有所长
如果第3步已经完成,那么说明日志和数据库都已经同步完成,当前这个检查点就是正确有效(可读档的),之后就可以从这个点开始恢复,之前的不用管
标签:数据恢复,force,数据库,undo,commit,日志,redo From: https://www.cnblogs.com/laobei-uu/p/18252499