这是这个帖子http://www.itpub.net/viewthread.php?tid=685647,piner面试提出的一个问题
这个问题我的理解是这样的:
1 alter log switch 会触发常规检查点,即会触发DBWR将全部的脏数据写入数据文件,并会更新数据文件头和控制文件的检查点信息
2 为什么一定要触发检查点:原因就是如果不触发检查点,在redo文件被覆盖时(redo日志是循环使用的,会被覆盖),相对应的脏数据还没有写入到数据文件中,一旦crash后将无法完全恢复
3 log switch 是否等待checkpoint的完成?不需要等待。首先checkpoint仅仅是个事件,发生checkpoint时,CKPT进程通知DBWR写出数据,但不会等待。同样log switch也不会等待,因为被覆盖被切换的那个log file对应的脏数据已经写入了数据文件,即该log file已经没用了,随时可以覆盖,所以不需要等待。
这也正是需要3个日志组的作用,试想 以下的场景
当前使用的log file 是1,2、3都是空文件
1切换到2时,1相关的脏数据被写入,2是空文件,无需等待即可写redo
2切换到3时,2相关的脏数据被写入,3是空文件,无需等待即可写redo
3切换到1时,3 相关的脏数据被写入,1虽然不是新文件,但是相关的脏数据已经保证写入数据文件了,所以也无需等待即可写redo
这是2个日志组无法实现的,当2个日志组时2切换到1时,并不能保证1相关的脏数据全部写入,所以必须等待检查点的完成,这也降低了整个系统的性能
理解不一定正确,记忆不好,保存下以便查阅
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22111412/viewspace-664220/ ,如需转载,请注明出处,否则将追究法律责任。