用户修改一个数据块的流程:
1,先把数据块自磁盘或数据文件读入buffer cache
2,先生成重作记录,并记入log buffer中(当用户提交这个修改数据块事务时)
一并把对应的重作记录(此时还在log buffer)写入到日志文件
3,在buffer cache中修改块
4,把buffer cache这个块的标志设置为脏;同时在buffer cache的检查点队列
末尾增加一个新节点,记录这个新脏块的信息:即此脏块在buffe cache
的地址,以及此脏块产生的redo record的rba
5,如果用户提交事务,把相应的重作记录从log buffer写入到日志文件
6,说一个恢复或崩溃的例子,如果用户已提交事务commit了,但buffer cache中这些事务的脏数据因为
掉电loss,没有来得及写入数据文件;怎么办?
大体流程:
1,数据库启动时,从控制文件读取检查点位置,检查点位置即检查点队列头的位置,从这个位置开始写入脏块到data file
检查点位置记录有重作记录编号,通过个重作记录编号即rba可以定位到redo中的redo record,这样
它读取重作记录的重作数据(它会是一个redo stream,即一系列change vector),即重新把操作重现一下;数据库还是一致的
参考: