转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/11022433
正确答案:BC
这里我就偷一下懒了,引用
http://www.itpub.net/thread-1813872-1-1.html
itpub 7楼一位兄弟的解释
我个人认为是这样的:
checkpoint过程
1、checkpoint触发条件,记录rba,rba包括cache low rba和on disk rba,这里指的是on disk rba(lgwr 最后写日志文件的地址)
2、checkpoint进程通知DBWn进程将所有cache low rba和on disk rba之间的脏块写入磁盘
3、确定脏块都被写入磁盘以后,更新checkpoint信息到数据文件和控制文件中。
normal checkpoint触发条件
1、alter system switch logfile(自动或手动)。
2、alter system checkpoint。
3、alter tablespace tablespace_name begin backup或alter tablespace tablespace_name end backup。
4、alter tablespace tablespace_name read only。
5、shutdown。
increment checkpoint触发条件
1、fast_start_mttr_target
2、log_checkpoint_timeout
3、log_checkpoint_interval
4、90% OF SMALLEST REDO LOG
综上所述,答案应该是b和c,如果redo size过小,那么会频繁的切换,从而导致频繁的checkpoint;如果fast_start_mttr_target设置的过小,比如设置为1,那么就意味着数据库估算的恢复时间超过1秒就会产生checkpoint,也会频繁的产生checkpoint,答案d只会解决磁盘些的性能问题,而不是checkpoint切换的内存问题,答案a是不可能的。
我对检查点的一点补充:
检查点队列(检查点只是一个数据库事件,它存在的根本意义在于减少崩溃恢复时间),在BH中有一个ckptq项,双向链表.
(1)只有脏块才会在检查点队列中,非脏块的ckptq为空。
(2)当块首次被更改时,块会立即被加进检查点队列。 如果检查点队列中的脏块再次被修改,并不会改变其在
检查点队列中的位置。
(3)检查点队列中脏块的排列顺序:根据第2点,所有脏块按照首次被更改的时间的顺序排列。 更准确点说:按
照块的lrba排列。
参与检查点的进程主要包括lgwr、dbwn和ckpt,分为两大类:完全检查点和增量检查点
(1)完全检查点主要包括以下步骤:
①首先,在日志缓冲中确定当前的(也就是最新的)重做记录,提取其RBA与SCN作为检查点目标
②LGWR清空日志缓存,将重作记录写入在线日志
③DBWn进程将检查点目标(RBA与SCN)产生的及检查点目标之前产生的脏数据块,按RBA的顺序写入数据文件
④最后,CKPT进程将检查点目标(RBA与SCN)写入数据文件的头部和控制文件
(2)触发完全检查点的条件:
①执行shutdown immediate命令
②执行alter system checkpoint命令
③LGWR切换在线日志,不论是因为日志写满还是执行alter system switch logfile命令
④执行部分表空间维护命令:alter tablespace ...offline|online
增量检查点并不会去更新数据文件头,而只是每3秒由CKPT进程去更新控制文件中的LRBA和SCN
(1)增量检查点主要包含以下步骤
①CKPT每3秒一次记录检查点位置的工作(更新控制文件)
②CKPT定期触发DBWR
(2)增量检查点的意义有以下两个:
①减少发生完全检查点时DBWn进程的工作负担
②提高实例恢复的速度
QQ:252803295
学习交流QQ群:
DSI&Core Search Ⅰ 群:127149411(技术:已满)
DSI&Core Search Ⅱ 群:177089463(技术:未满)
DSI&Core Search Ⅲ 群:284596437(技术:未满)
DSI&Core Search Ⅳ 群:192136702(技术:未满)
DSI&Core Search Ⅴ 群:285030382(闲聊:未满)
MAIL:[email protected]
BLOG: http://blog.csdn.net/guoyjoe
WEIBO:http://weibo.com/guoyJoe0218