系统故障的恢复 ( 1 ) 正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做队列( REDO-LIST )。同时找出故障发生时尚未完成的事务,将其事务标识记入撤销队列。 ( 2 ) 对撤销对列中的各个事务进行撤销处理。进行撤销处理的方法是,反向扫描日志文件,对每个撤销事务的更新操作执行逆操作,即将日志记录中“更新前的值”写入数据库。 ( 3 ) 对重做队列中的各个事务进行重做处理。进行重做处理的方法是:正向扫描日志文件,对每个重做事务重新执行日志文件登记的操作,即将日志记录中“更新后”的值写入数据库。
我的理解是,事务对数据库的写操作一开始都是操作在内存,还没刷回磁盘里,然后发生了系统故障
然后恢复的时候,已提交的事务,修改都只是在内存里,所以现在丢失了,需要重做,而未提交的事务,可能是做了一部分修改,也是在内存里,我的疑问是,这里为什么要撤销呢?意思是这一部分在内存的修改也有可能会刷到磁盘里吗?
1
mahogany 2021-02-09 18:08:27 +08:00
内存的数据一定是最新的,但是内存刷盘操作随机发生,没有时序和逻辑的保证,磁盘中的数据页的同步状态完全不可知。突然故障,只能依赖 redolog 来恢复。
|