查看: 23935|回复: 96

[体系架构] [讨论话题]redolog switch会发生完全检查点还是增量检查点

[复制链接]
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
跳转到指定楼层
1#
发表于 2013-5-6 09:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 guoyJoe 于 2013-5-31 20:07 编辑

检查点这个概念在Oracle中非常重要,很多人对检查点这个概念很模糊,为了彻底搞懂,我们一起来讨论一下,嘿嘿!




讨论的话题:

1、什么是完全检查点?哪些操作会触发? 

2、什么是增量检查点?哪些条件会触发?

3、redolog  switch会发生完全检查点还是增量检查点?(此话题的核心部分:用实验验证)

4、Oracle中检查点(checkpoint)一共有多少种呢?


讨论时间:2013.5.6--2013.5.20


活动奖品:活动结束后将会抽取10名会员赠送精美徽章一枚。



cpasdfx5200 hexel   遗忘的deny 边-城  coloredice   renfengjun   ses19828   mlx_861201   broadrange   

论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
2#
 楼主| 发表于 2013-5-6 09:20 | 只看该作者
本帖最后由 guoyJoe 于 2013-5-13 16:06 编辑

网上有很多资料都没有说清楚发生log switch的时候,到底完全检查点还是增量检查点。有人说是完全检查点,也有人说是增
量检查点。其实如果你深入了解完全检查点和增量检查点的的区别,就应该知道log switch到底是增量检查点还是完全检查点。
   在8i以前,log switch的时候oracle确实是会做完全检查点;但从8i开始,oracle在log switch的时候做的是增量检查点,但
从严格意义上来说并不能完全算是增量检查点,因为在log switch的时候,不仅会像增量检查点那样更新控制文件,而且还会像完
全检查点那样会更新数据文件头。
   下面我们来一起来做做测试:证明了在log switch的时候,发生的既不是完全检查点,也不是严格意义上的增量检查点。

测试DB版本:
idle> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

一、我们首先来验证在log switch的时候,发生的不是完全检查点:

查几个跟日志切换检查点相关的参数
idle> @?/rdbms/admin/show_para
Enter value for p: _dbwr_scan_interval
old  12:     AND upper(i.ksppinm) LIKE upper('%&p%')
new  12:     AND upper(i.ksppinm) LIKE upper('%_dbwr_scan_interval%')
P_NAME                                   P_DESCRIPTION                                      P_VALUE               
ISDEFAULT ISMODIFIED ISADJ
---------------------------------------- --------------------------------------------------
------------------------------ --------- ---------- -----
_dbwr_scan_interval                      dbwriter scan interval                             300                    
TRUE      FALSE       FALSE
idle> @?/rdbms/admin/show_para
Enter value for p: _disable_selftune_checkpointing
old  12:     AND upper(i.ksppinm) LIKE upper('%&p%')
new  12:     AND upper(i.ksppinm) LIKE upper('%_disable_selftune_checkpointing%')
P_NAME                                   P_DESCRIPTION                                      P_VALUE               
ISDEFAULT ISMODIFIED ISADJ
---------------------------------------- --------------------------------------------------
------------------------------ --------- ---------- -----
_disable_selftune_checkpointing          Disable self-tune checkpointing                    FALSE                  
TRUE      FALSE       FALSE
idle> show parameter log_checkpoint_timeout
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_checkpoint_timeout               integer     1800
没修改参数之前:
idle>  select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE
idle> alter system switch logfile;
idle> !date
Sun May 12 19:43:20 CST 2013
idle> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 ACTIVE
         2 CURRENT
         3 INACTIVE
idle> !date
Sun May 12 19:49:25 CST 2013
idle> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 CURRENT
         3 INACTIVE
1号日志组从ACTIVE变成INACTIVE大约要5分钟左右

修改参数可以命alter system switch logfile;时redo log file的状态一直是active(保持一天):
_dbwr_scan_interval=24*3600
log_checkpoint_timeout=24*3600
_disable_selftune_checkpointing=TRUE
idle> alter system set "_dbwr_scan_interval"=86400;
System altered.
idle> alter system set log_checkpoint_timeout=86400;
System altered.
idle> alter system set "_disable_selftune_checkpointing"=true;
System altered.
哈哈。。。可以观察一下是不是一直是ACTIVE
idle> !date
Sun May 12 19:55:54 CST 2013
idle> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 INACTIVE
         3 CURRENT
idle> ALTER SYSTEM SWITCH LOGFILE;
System altered.
idle> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 ACTIVE

执行完上述switch logfile操作后等待12小时,然后再次执行上述查询语句:
idle> !date
Sun May 13 7:56:58 CST 2013
idle> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 ACTIVE
从结果里我们可以看到现在redo log group 3还是处于active状态,我现在的这个库是测试库只有我一个人在用,所以很空闲,如
果switch logfile的时候发生的是full checkpoint,则当我等待24小时后再次查询v$log的时候redo log group 3必然是处于
inactive状态:
即现在我们已经证明了在log switch的时候,发生的不是完全检查点。
idle> !date
Sun May 13 20:56:58 CST 2013
idle> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 INACTIVE
哈哈。。。你可以试试,那些参数的威力。。牛B的一比。。。
现在我们来证明在log switch的时候,发生的不是严格意义上的增量检查点。增量检查点只会更新control file,不会更新
datafile header,知道这个那就很好验证了,利用BBED恢复神器:
hr@OCP>  select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 CURRENT
         3 INACTIVE
BBED> set file 1 block 1
        FILE#           1
        BLOCK#          1
BBED> p kcvfhckp
struct kcvfhckp, 36 bytes                   @484     
   struct kcvcpscn, 8 bytes                 @484     
      ub4 kscnbas                           @484      0x000c592e
      ub2 kscnwrp                           @488      0x0000
   ub4 kcvcptim                             @492      0x3097e9b7
   ub2 kcvcpthr                             @496      0x0001
   union u, 12 bytes                        @500     
      struct kcvcprba, 12 bytes             @500     
         ub4 kcrbaseq                       @500      0x00000038
         ub4 kcrbabno                       @504      0x000000a3
         ub2 kcrbabof                       @508      0x0010
   ub1 kcvcpetb[0]                          @512      0x02
   ub1 kcvcpetb[1]                          @513      0x00
   ub1 kcvcpetb[2]                          @514      0x00
   ub1 kcvcpetb[3]                          @515      0x00
   ub1 kcvcpetb[4]                          @516      0x00
   ub1 kcvcpetb[5]                          @517      0x00
   ub1 kcvcpetb[6]                          @518      0x00
   ub1 kcvcpetb[7]                          @519      0x00
即现在的system01.dbf的datafile header的checkpoint scn的base是0x000c592e。
现在我执行一次switch logfile,再来观察system01.dbf的datafile header的checkpoint scn:
hr@OCP> update employees set salary=salary+1000;
107 rows updated.
hr@OCP> commit;
Commit complete.
hr@OCP> alter system switch logfile;
System altered.
hr@OCP> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 INACTIVE
         2 ACTIVE
         3 CURRENT

BBED> set file 1 block 1
        FILE#           1
        BLOCK#          1
BBED> p kcvfhckp
struct kcvfhckp, 36 bytes                   @484     
   struct kcvcpscn, 8 bytes                 @484     
      ub4 kscnbas                           @484      0x000c592e
      ub2 kscnwrp                           @488      0x0000
   ub4 kcvcptim                             @492      0x3097e9b7
   ub2 kcvcpthr                             @496      0x0001
   union u, 12 bytes                        @500     
      struct kcvcprba, 12 bytes             @500     
         ub4 kcrbaseq                       @500      0x00000038
         ub4 kcrbabno                       @504      0x000000a3
         ub2 kcrbabof                       @508      0x0010
   ub1 kcvcpetb[0]                          @512      0x02
   ub1 kcvcpetb[1]                          @513      0x00
   ub1 kcvcpetb[2]                          @514      0x00
   ub1 kcvcpetb[3]                          @515      0x00
   ub1 kcvcpetb[4]                          @516      0x00
   ub1 kcvcpetb[5]                          @517      0x00
   ub1 kcvcpetb[6]                          @518      0x00
   ub1 kcvcpetb[7]                          @519      0x00
我们发现现在的system01.dbf的datafile header的checkpoint scn的base还是0x000c592e,也就是说oracle在switch logfile的
时候的checkpoint并不是马上发生,oracle在等待一个发生的时机。
我们现在强制让log switch checkpoint马上发生:
hr@OCP> alter system switch logfile;
System altered.
hr@OCP> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 ACTIVE
         3 ACTIVE
等待日志组2变成INACTIVE
hr@OCP> select group#,status from v$log;
    GROUP# STATUS
---------- ----------------
         1 CURRENT
         2 INACTIVE
         3 ACTIVE
BBED> set file 1 block 1
        FILE#           1
        BLOCK#          1
BBED> p kcvfhckp
struct kcvfhckp, 36 bytes                   @484     
   struct kcvcpscn, 8 bytes                 @484     
      ub4 kscnbas                           @484      0x000c59cf
      ub2 kscnwrp                           @488      0x0000
   ub4 kcvcptim                             @492      0x3097eb6d
   ub2 kcvcpthr                             @496      0x0001
   union u, 12 bytes                        @500     
      struct kcvcprba, 12 bytes             @500     
         ub4 kcrbaseq                       @500      0x0000003b
         ub4 kcrbabno                       @504      0x00000002
         ub2 kcrbabof                       @508      0x0010
   ub1 kcvcpetb[0]                          @512      0x02
   ub1 kcvcpetb[1]                          @513      0x00
   ub1 kcvcpetb[2]                          @514      0x00
   ub1 kcvcpetb[3]                          @515      0x00
   ub1 kcvcpetb[4]                          @516      0x00
   ub1 kcvcpetb[5]                          @517      0x00
   ub1 kcvcpetb[6]                          @518      0x00
   ub1 kcvcpetb[7]                          @519      0x00
看到了吗?现在system01.dbf的datafile header的checkpoint scn的base已经变成了0x000c59cf,也就是说----在log switch的
时候,发生的不是严格意义上的增量检查点,因为其不仅更新了control file,还更新了datafile header。

最后,我们来说一下oracle中checkpoint的种类。oracle中的checkpoint一共有七种,它们分别是:
1、Full Checkpoint
2、Thread Checkpoint
3、File Checkpoint
4、Object Checkpoint
5、Parallel Query Checkpoint
6、Incremental Checkpoint
7、Log Switch Checkpoint


¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
增量checkpoint
增量checkpoint工作过程

       因为每次完全的checkpoint都需要把buffer cache所有的脏块都写入到数据文件中,这样就是产生一个很大的IO消耗,频繁的完全checkpoint操作很对系统的性能有很大的影响,为此 Oracle引入的增量checkpoint的概念,buffer cache中的脏块将会按照BCQ队列的顺序持续不断的被写入到磁盘当中,同时CKPT进程将会每3秒中检查DBWn的写入进度并将相应的RBA信息记录到控制文件中。有了增量checkpoint之后在进行实例恢复的时候就不需要再从崩溃前的那个完全checkpoint开始应用重做日志了,只需要从控制文件中记录的RBA开始进行恢复操作,这样能节省恢复的时间。

发生增量checkpoint的先决条件

    * 恢复需求设定 (FAST_START_IO_TARGET/FAST_START_MTTR_TARGET)
     * LOG_checkpoint_INTERVAL参数值
     * LOG_checkpoint_TIMEOUT参数值
     * 最小的日志文件大小
     * buffer cache中的脏块的数量

增量checkpoint的特点

    * 增量checkpoint是一个持续活动的checkpoint。
     * 没有checkpoint RBA,因为这个checkpoint是一直都在进行的,所以不存在normal checkpoint里面涉及的checkpoint RBA的概念。
     * checkpoint advanced in memory only
     * 增量checkpoint所完成的RBA信息被记录在控制文件中。
     * 增量checkpoint可以减少实例恢复时间。

完全checkpoint:
完全检查点主要包括以下步骤:
   ①首先,在日志缓冲中确定当前的(也就是最新的)重做记录,提取其RBA与SCN作为检查点目标
   ②LGWR清空日志缓存,将重作记录写入在线日志
   ③DBWn进程将检查点目标(RBA与SCN)产生的及检查点目标之前产生的脏数据块,按RBA的顺序写入数据文件
   ④最后,CKPT进程将检查点目标(RBA与SCN)写入数据文件的头部和控制文件

触发完全检查点的条件:
    ①执行shutdown immediate命令
    ②执行alter system checkpoint命令
    ③执行部分表空间维护命令:alter tablespace ...offline|online|begin backup|end backup|read only|read write

CHECKPOINT 优化
从9I开始CHECKPOINT的优化大大简化了
    设置FAST_START_MTTR_TARGET
       较大的值:恢复时间较长
       较小的值:增加IO负载

10g 的CHECKPOINT的自动优化
   fast_start_mttr_target设置为非零的值或者不设置



使用道具 举报

回复
论坛徽章:
15
奥运会纪念徽章:跆拳道
日期:2012-08-22 14:39:23马上有对象
日期:2014-11-20 15:55:50itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25青年奥林匹克运动会-艺术体操
日期:2014-09-12 16:09:192014年世界杯参赛球队: 瑞士
日期:2014-06-10 10:32:43马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:08奥运纪念徽章
日期:2013-05-20 09:57:09迷宫蛋
日期:2013-03-11 18:12:19
3#
发表于 2013-5-6 09:36 | 只看该作者
1.完全检查点: 概念说不太清楚,应该就是 log buffer---->log file  ,buffer cache--->datafile ,触发条件---》logfile switch,shutdown immediate

2.增量检查点:是根据第一次RBA,增加检查点队列,顺序写出,写出之后,RBA推进,-------COMMIT,ROLLBACK,手动发出检查点

3.完全检查点,实验验证(考虑...)

4.系统检查点,数据文件检查点,控制文件检查点



还有好多不知道的,坐等学习。。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
20
祖国60周年纪念徽章
日期:2009-10-09 08:28:00数据库板块每日发贴之星
日期:2011-02-20 01:01:01ITPUB季度 技术新星
日期:2011-04-02 10:31:09ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:192013年新春福章
日期:2013-02-25 14:51:242011新春纪念徽章
日期:2011-02-18 11:43:33
4#
发表于 2013-5-6 10:12 | 只看该作者
8i 之后redo switch就是增量检查点了。

使用道具 举报

回复
论坛徽章:
24
技术图书徽章
日期:2013-08-16 14:31:52问答徽章
日期:2013-11-04 08:53:14目光如炬
日期:2013-12-23 06:00:11目光如炬
日期:2013-12-30 06:00:11明星写手
日期:2014-02-22 06:00:12马上有钱
日期:2014-03-31 14:09:05沸羊羊
日期:2015-05-20 12:42:59秀才
日期:2015-06-24 13:05:36秀才
日期:2015-07-13 09:48:14
5#
发表于 2013-5-6 11:00 | 只看该作者
支持一下

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
论坛徽章:
6402
娜美
日期:2021-10-12 20:11:36技术图书徽章
日期:2021-09-30 12:11:1120周年集字徽章-年	
日期:2021-09-30 12:12:5820周年集字徽章-20	
日期:2021-09-30 12:43:0619周年集字徽章-周
日期:2021-09-30 13:18:3120周年集字徽章-20	
日期:2021-09-30 16:44:1219周年集字徽章-周
日期:2021-09-30 17:01:04技术图书徽章
日期:2021-09-30 17:59:14技术图书徽章
日期:2021-10-06 10:36:4019周年集字徽章-19
日期:2021-10-06 14:43:24
6#
发表于 2013-5-6 12:19 | 只看该作者
占领有利位置!

使用道具 举报

回复
论坛徽章:
9
ITPUB 11周年纪念徽章
日期:2012-10-31 14:48:002013年新春福章
日期:2013-02-25 14:51:24奥运纪念徽章
日期:2013-05-20 09:57:09大众
日期:2013-09-26 08:56:23三菱
日期:2013-11-09 10:48:19凯迪拉克
日期:2013-11-28 09:17:19红旗
日期:2013-12-16 12:38:48雪佛兰
日期:2013-12-17 09:11:49马上有车
日期:2014-03-30 11:41:45
7#
发表于 2013-5-6 12:21 | 只看该作者
占位

使用道具 举报

回复
论坛徽章:
9
ITPUB 11周年纪念徽章
日期:2012-10-31 14:48:002013年新春福章
日期:2013-02-25 14:51:24奥运纪念徽章
日期:2013-05-20 09:57:09大众
日期:2013-09-26 08:56:23三菱
日期:2013-11-09 10:48:19凯迪拉克
日期:2013-11-28 09:17:19红旗
日期:2013-12-16 12:38:48雪佛兰
日期:2013-12-17 09:11:49马上有车
日期:2014-03-30 11:41:45
8#
发表于 2013-5-6 12:22 | 只看该作者
huanhuanlove 发表于 2013-5-6 10:12
8i 之后redo switch就是增量检查点了。

真的假的,来个证明啥roger大神

使用道具 举报

回复
论坛徽章:
4
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB社区12周年站庆徽章
日期:2013-08-20 11:30:11路虎
日期:2013-09-05 15:36:31
9#
发表于 2013-5-6 12:33 | 只看该作者
凑数

使用道具 举报

回复
论坛徽章:
12
奥运纪念徽章
日期:2013-05-20 09:57:09问答徽章
日期:2014-03-04 13:57:52技术图书徽章
日期:2014-09-28 09:06:52
10#
发表于 2013-5-6 13:00 | 只看该作者
Incremental Checkpoint会要求ckpt 每3s 更新一次controlfile 但是不更新datafile header, 而FULL CHECKPOINT要求立即完成(同步的) 且会同时更新 controlfile 和 datafile header

使用道具 举报

回复

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

本版积分规则 发表回复

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