数据库切换日志的时候,为什么一定要发生检查点?

[复制链接]
查看11 | 回复5 | 2008-6-30 01:01:54 | 显示全部楼层 |阅读模式
上次看见这个题
这个题的答案是:
当日志文件被覆盖的时候一定要确保 相关 dirtybuffer 一定被写入 数据文件, 所以日志的切换必须引起检查点。

不太好理解呀。
我觉得,即使日志切换不引起检查点的话,检查点还有其他的触发条件呀。
只不过效率低一点,日志切换可能慢一点。
被覆盖前,等待“相关 dirtybuffer 一定被写入 数据文件”的检查点不是自己触发的,是别的条件触发的,不也可以吗?
回复

使用道具 举报

千问 | 2008-6-30 01:01:54 | 显示全部楼层
日志文件中的sql都是已经被commit了的,但是对应的数据不一定被写入数据文件。
切换日志文件,会要这部分sql对应的数据写入到数据文件。
回复

使用道具 举报

千问 | 2008-6-30 01:01:54 | 显示全部楼层
(checkpoint queue是dirty buffer按时间顺序排列的列表,用来表识DBWR写过的block.)
当发生log switch时候,CKPT 会写redo log中checkpoint position到datafile header,
这个checkpoint postion对应着checkpoint queue中的checkpoint position,对应相应的RBA.
DBWn会根据checkpoint queue中的checkpoint position来识别已经写到datafile的blocks.
识别以后,DBWn会从checkpoint queue移除这些checkpoint position.
如果在log switch发生的时候,没有checkpoint发生,那么等这些日志被覆盖,那么这些checkpoint position也就相应丢失了,DBWn又知道从哪写起呢
回复

使用道具 举报

千问 | 2008-6-30 01:01:54 | 显示全部楼层
原帖由 football2006 于 2008-6-29 09:09 发表
日志文件中的sql都是已经被commit了的,但是对应的数据不一定被写入数据文件。
切换日志文件,会要这部分sql对应的数据写入到数据文件。

是的,有检查点是能起到将这部分sql的数据写入到数据文件。
但是题目问的是“为何一定” ,如果不触发检查点,他也可以做到等日志归档好,再
覆盖这个日志呀。
回复

使用道具 举报

千问 | 2008-6-30 01:01:54 | 显示全部楼层
WESTLIFE_XU 曾经回答过:
(1)数据库切换日志的时候,为什么一定要发生检查点?这个检查点有什么意义?
触发dbwr的执行,dbwr会把和这个日志相关的所有脏队列写到数据文件去,减少数据库崩溃的时的恢复时间。

rollingpig版主的回答是:
==>你所的只是普通checkpoint 该做的,而没有特指Switch log时候的checkpoint的作用。

我的疑问是有普通checkpoint 也可以解决问题了,毕竟想覆盖日志的话,还是要等checkpoing完成,日志
变成inactive 才可以。 除了普通checkpoint,这里再多发生一个Switch log触发的checkpoint,固然会加快一点dirty 数据写入数据文件。但也不是一定要发生吧?
回复

使用道具 举报

千问 | 2008-6-30 01:01:54 | 显示全部楼层
想想日志切换后,日志文件的状态改变,和instance recovery的过程,不难理解这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行