楼主: yywudong

[原创] 假如log file switch没有产生checkpoint,会产生什么情况?

[复制链接]
论坛徽章:
3
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
11#
发表于 2008-3-12 14:46 | 只看该作者
手工执行alter system switch logfile应该是完全检查点,会写出dirty块。

使用道具 举报

回复
论坛徽章:
38
2010新春纪念徽章
日期:2010-01-04 08:33:082012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-05-15 15:24:11优秀写手
日期:2013-12-18 09:29:08马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
12#
发表于 2008-3-12 14:47 | 只看该作者
再补充一点,日志切换的时候一定会产生检查点.

使用道具 举报

回复
论坛徽章:
14
奥运会纪念徽章:自行车
日期:2008-04-25 21:00:142013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14奥运会纪念徽章:皮划艇激流回旋
日期:2012-08-13 10:25:38鲜花蛋
日期:2012-02-10 11:40:172010新春纪念徽章
日期:2010-03-01 11:04:58授权会员
日期:2010-01-12 09:40:47ITPUB元老
日期:2010-01-12 09:33:092009新春纪念徽章
日期:2009-01-04 14:52:28奥运会纪念徽章:拳击
日期:2008-10-24 13:22:33
13#
发表于 2008-3-12 16:51 | 只看该作者
原帖由 solearn 于 2008-3-12 14:14 发表


fly_bug说的对,结果就是crash recovery不能实现。


推翻自己的想法了。
在有增量检查点的情况下,log file switch的作用只是更新控制文件和数据文件头。

使用道具 举报

回复
论坛徽章:
14
奥运会纪念徽章:自行车
日期:2008-04-25 21:00:142013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14奥运会纪念徽章:皮划艇激流回旋
日期:2012-08-13 10:25:38鲜花蛋
日期:2012-02-10 11:40:172010新春纪念徽章
日期:2010-03-01 11:04:58授权会员
日期:2010-01-12 09:40:47ITPUB元老
日期:2010-01-12 09:33:092009新春纪念徽章
日期:2009-01-04 14:52:28奥运会纪念徽章:拳击
日期:2008-10-24 13:22:33
14#
发表于 2008-3-12 16:56 | 只看该作者
原帖由 cqubityj 于 2008-3-12 14:46 发表
手工执行alter system switch logfile应该是完全检查点,会写出dirty块。


我觉得alter system switch logfile时仍然是增量检查点。

可以看到,当执行这一命令时,在alert文件中很快会看到complete checkpoint的提示。不过我认为,这是由target rba规则决定的。即,target rba和检查点队列末端之间的距离应小于最小日志文件的90%。

使用道具 举报

回复
论坛徽章:
2
2008新春纪念徽章
日期:2008-02-13 12:43:032010新春纪念徽章
日期:2010-03-01 11:08:24
15#
发表于 2008-3-12 17:03 | 只看该作者
原帖由 solearn 于 2008-3-12 16:51 发表


推翻自己的想法了。
在有增量检查点的情况下,log file switch的作用只是更新控制文件和数据文件头。

log file switch虽然是触发增量检查点,但我觉得还是有它特殊的地方,也就是必须保证被覆盖的redo log 对应的数据块已经被写入数据文件。

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
16#
发表于 2008-3-12 17:04 | 只看该作者
原帖由 fly_bug 于 2008-3-12 17:03 发表

log file switch虽然是触发增量检查点,但我觉得还是有它特殊的地方,也就是必须保证被覆盖的redo log 对应的数据块已经被写入数据文件。


使用道具 举报

回复
论坛徽章:
3
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
17#
发表于 2008-3-12 17:30 | 只看该作者
原帖由 fly_bug 于 2008-3-12 17:03 发表

log file switch虽然是触发增量检查点,但我觉得还是有它特殊的地方,也就是必须保证被覆盖的redo log 对应的数据块已经被写入数据文件。

这个应该是由 “target rba和检查点队列末端之间的距离应小于最小日志文件的90%” 来保证的。

使用道具 举报

回复
论坛徽章:
3
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
18#
发表于 2008-3-12 17:59 | 只看该作者
原帖由 solearn 于 2008-3-12 16:56 发表


我觉得alter system switch logfile时仍然是增量检查点。

可以看到,当执行这一命令时,在alert文件中很快会看到complete checkpoint的提示。不过我认为,这是由target rba规则决定的。即,target rba和检查点队列末端之间的距离应小于最小日志文件的90%。


如果alter system switch logfile也是增量检查点的话,会有问题。考虑一下频繁手工切换日志情况:
先假设手工切换日志也是增量检查点,即dbwr不一定写出dirty块。
有两个在线日志A和B,假设都是100M,当前正在写的日志是A并且A只写1k。同时假设检查点队列的开始RBA这时也在A中。这时手工切换日志,当前日志变成B。B写了1k后,我马上又切换日志,这时就需要重用A了。如果在这期间没有触发dbwr去写dirty块的话,那么就无法重用A了。这时检查点队列中的内容只有2K,肯定小于100M*0.9。所以target rba规则在这段时间内是不能触发dbwr写的。
而如果手工切换是完全检查点的话,就没这个问题了。切换时就触发dbwr写了,以前的日志就可以重用了。

使用道具 举报

回复
论坛徽章:
2
2008新春纪念徽章
日期:2008-02-13 12:43:032010新春纪念徽章
日期:2010-03-01 11:08:24
19#
发表于 2008-3-12 21:23 | 只看该作者
原帖由 cqubityj 于 2008-3-12 17:59 发表


如果alter system switch logfile也是增量检查点的话,会有问题。考虑一下频繁手工切换日志情况:
先假设手工切换日志也是增量检查点,即dbwr不一定写出dirty块。
有两个在线日志A和B,假设都是100M,当前正在写的日志是A并且A只写1k。同时假设检查点队列的开始RBA这时也在A中。这时手工切换日志,当前日志变成B。B写了1k后,我马上又切换日志,这时就需要重用A了。如果在这期间没有触发dbwr去写dirty块的话,那么就无法重用A了。这时检查点队列中的内容只有2K,肯定小于100M*0.9。所以target rba规则在这段时间内是不能触发dbwr写的。
而如果手工切换是完全检查点的话,就没这个问题了。切换时就触发dbwr写了,以前的日志就可以重用了。

[ 本帖最后由 fly_bug 于 2008-3-12 22:26 编辑 ]

使用道具 举报

回复
论坛徽章:
16
ITPUB元老
日期:2005-04-27 08:46:182013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-01-04 11:49:54鲜花蛋
日期:2011-12-27 22:39:17ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412010新春纪念徽章
日期:2010-03-01 11:20:51生肖徽章2007版:牛
日期:2009-07-13 12:53:13生肖徽章2007版:蛇
日期:2009-03-19 13:57:24生肖徽章2007版:牛
日期:2008-12-17 10:30:43奥运会纪念徽章:足球
日期:2008-10-24 13:28:14
20#
发表于 2008-3-12 23:11 | 只看该作者
原帖由 cqubityj 于 2008-3-12 17:59 发表


如果alter system switch logfile也是增量检查点的话,会有问题。考虑一下频繁手工切换日志情况:
先假设手工切换日志也是增量检查点,即dbwr不一定写出dirty块。
有两个在线日志A和B,假设都是100M,当前正在写的日志是A并且A只写1k。同时假设检查点队列的开始RBA这时也在A中。这时手工切换日志,当前日志变成B。B写了1k后,我马上又切换日志,这时就需要重用A了。如果在这期间没有触发dbwr去写dirty块的话,那么就无法重用A了。这时检查点队列中的内容只有2K,肯定小于100M*0.9。所以target rba规则在这段时间内是不能触发dbwr写的。
而如果手工切换是完全检查点的话,就没这个问题了。切换时就触发dbwr写了,以前的日志就可以重用了。


这应该是增量检查点。oracle官方教材上已经说明白的。
你可以将log_checkpoints_to_alert设置为true,然后不对数据库进行任何的操作,而仅仅是尝试进行日志切换,然后检查alert.log,你会发现检查点完成的时间会很长,从而甚至导致出现Checkpoint not complete。这就是因为增量检查点优先级较低导致的。如果是完全检查点,它的优先级是最高的,不会导致Checkpoint not complete的出现。

如果日志切换不进行增量检查点,那想象一下,当前数据库里一个脏块也没有,同时fast_start_mttr_target也设置的很大。
目前数据库里有2组日志文件,它们全是空的,没有redo entry。
然后我修改一条记录,并提交,从而在1号日志文件里产生了redo。然后手工进行日志切换到2号日志文件,然后再次手工切换到1号日志文件。如果不发生检查点,也就是没有将checkpoint queue上第一个脏块所对应的LRBA作为CKPT Position而写入控制文件,那oracle如何知道这时1号日志文件里包含的redo所对应的脏块还没有写入数据文件呢?它也没有办法知道是否应该覆盖1号日志文件。因此一旦发生日志切换,就必须触发检查点,从而将checkpoint Position放入到1号日志文件里去。

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表