Chinaunix首页 | 论坛 | 博客
  • 博客访问: 437252
  • 博文数量: 55
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1584
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-04 15:15
个人简介

热衷技术,热爱交流

文章分类

全部博文(55)

文章存档

2014年(7)

2013年(48)

分类: Oracle

2013-05-07 21:58:01

 

究竟是多长时间发生一次检查点呢

前面简单讨论了完全检查点和增量检查点。究竟是多长时间发生一次检查点呢,每次需要写入多少buffer cache块呢?

对完全检查点,一般是一次把所有的buffer cache全部写完。间隔如下(仅看自动执行的);

1.   Buffer cache中脏数据达到40%

2.   检查点跨度达到最小重做日志大小的90%

对于增量检查点,是如何进行的呢:

增量检查点可以通过Fast-Start Checkping特性来实现:

Oracle 8i以前是通过参数log_checkpoint_interval和log_checkpoint_timeout

由于log_checkpoint_interval(根据重做日志量)和log_checkpoint_timeout(时间间隔)参数都有其局限性,于是oracle8i通过Fast-Start Checkping引入fast_start_io_target,这个参数用于控制发生crash时候恢复需要的I/O数量。例如,假设操作系统的I/O为每秒100(表示100个扇区,每个扇区一般512bytes)。如果要求数据库在5分钟内恢复,那么共需要产生的IO数量是5*60*1000=3000。可见,当操作系统每秒的IO增大,如果需要恢复的时间不变,我们就可以把这个变小。当然,系统性能改善了,fast_start_io_target不变的话,恢复的时间会变短。

Oracle 9i引入了fast_start_mttr_target参数(废弃了fast_start_io_target),替换8i中的fast_start_io_target。这个参数很简单,表示实例crash时候,需要recovery instance的时间。默认这个参数0,表示禁用Fast-Start Checkping特性。 以11g为例,以下是默认状态:

SYS AS SYSDBA >show parameter fast_;

       NAME                                |TYPE       |VALUE
------------------------------------|-----------|------------------------------
    fast_start_io_target                |integer    |0
    fast_start_mttr_target              |integer    |0
    fast_start_parallel_rollback        |string     |LOW

 SYS AS SYSDBA >show parameter  log_checkpoint;
   NAME                                |TYPE       |VALUE
    ------------------------------------|-----------|------------------------------
    log_checkpoint_interval             |integer    |0
    log_checkpoint_timeout              |integer    |1800
    log_checkpoints_to_alert            |boolean    |FALSE

如果fast_start_io_target or log_checkpoint_interval 或者被指定,他们会自动覆盖由fast_start_mttr_target参数计算出来的值。

我们可以通过禁用log_checkpoint_interval, log_checkpoint_timeout,开启fast_start_mttr_target参数应用这一特性。

首先,确认参数statistics_level(参数值为all或者typical,才能可以进行建议视图的统计)

SYS AS SYSDBA >show parameter statistics_level;

NAME                                |TYPE       |VALUE

------------------------------------|-----------|------------------------------

statistics_level                    |string     |TYPICAL

禁用11g默认的参数:log_checkpoint_timeout(默认1800s)

SYS AS SYSDBA >alter system set log_checkpoint_timeout=0 scope=memory;

设置fast_start_mttr_target。fast_start_mttr_target一般为0~3600。太大恢复时间较长,太小IO太过频繁,可以通过系统负载以及系统性能设置这个参数值。综合系统性能,负载,重做日志块,buffer cache数量,以及这个参数的设置,oracle可以自动决定在什么时候执行增量检查点,一次需要写出多少buffer cache。

1, 设置fast_start_mttr_target=1为下限1

alter system set fast_start_mttr_target=1 scope=memory; 

3.      查看实例恢复视图:

select RECOVERY_ESTIMATED_IOS,

FAST_START_IO_TARGET_REDO_BLKS,

TARGET_MTTR tmttr,

ESTIMATED_MTTR emttr,

CKPT_BLOCK_WRITES cbw,

ESTD_CLUSTER_AVAILABLE_TIME

from v$instance_recovery;

RECOVERY_ESTIMATED_IOS|FAST_START_IO_TARGET_REDO_BLKS|     TMTTR|     EMTTR|       CBW|ESTD_CLUSTER_AVAILABLE_TIME

----------------------|------------------------------|----------|----------|----------|---------------------------

                    48|                              |        35|        29|      2595|

虽然fast_start_mttr_target设置成了1,但是这个视图的TARGET_MTTR值仍然显示,系统启动需要35s,因为系统打开数据库还需要读取各种文件,自然要费更多的时间。

4.      执行事务,继续观察ESTIMATED_MTTR和TARGET_MTTR

begin

for i in 0 .. 100

        loop

        insert into huangxing.test select * from dba_objects;

    end loop;

end;

再次查看视图,由于在不断写出脏数据,可以看到ESTIMATED_MTTR实际已经高于TARGET_MTTR。这个是因为产生了太多的脏块,自然估计恢复时间的就要高于TARGET_MTTR。

select RECOVERY_ESTIMATED_IOS,

FAST_START_IO_TARGET_REDO_BLKS,

TARGET_MTTR tmttr,

ESTIMATED_MTTR emttr,

CKPT_BLOCK_WRITES cbw,

ESTD_CLUSTER_AVAILABLE_TIME

from v$instance_recovery;

RECOVERY_ESTIMATED_IOS|FAST_START_IO_TARGET_REDO_BLKS|     TMTTR|     EMTTR|       CBW|ESTD_CLUSTER_AVAILABLE_TIME

----------------------|------------------------------|----------|----------|----------|---------------------------

                  2585|                              |        35|        38|      2699|

使用常规检查点把脏数据全部写出,我们看到,又回到了最开始之前的状态了(不一定完全一致):

SYS AS SYSDBA >alter system checkpoint;

select RECOVERY_ESTIMATED_IOS,

FAST_START_IO_TARGET_REDO_BLKS,

TARGET_MTTR tmttr,

ESTIMATED_MTTR emttr,

CKPT_BLOCK_WRITES cbw,

ESTD_CLUSTER_AVAILABLE_TIME

from v$instance_recovery;                                    

RECOVERY_ESTIMATED_IOS|FAST_START_IO_TARGET_REDO_BLKS|     TMTTR|     EMTTR|       CBW|ESTD_CLUSTER_AVAILABLE_TIME

----------------------|------------------------------|----------|----------|----------|---------------------------

                     0|                              |        35|        29|      2873|

5.      设置fast_start_mttr_target为上限3600,

alter system set fast_start_mttr_target=3600 scope=memory;         

提交与之前相同事务,可以看到,视图记录的实例恢复时间和估计恢复时间并不是那么高

提交事务的时候,如果频繁切换重做日志,发生了常规检查点,这会使得emttr上升并没有那么快

RECOVERY_ESTIMATED_IOS|FAST_START_IO_TARGET_REDO_BLKS|     TMTTR|     EMTTR|       CBW|ESTD_CLUSTER_AVAILABLE_TIME

----------------------|------------------------------|----------|----------|----------|---------------------------

                  2869|                              |        51|        47|      2916|

如果当前重做日志文件很大,没有发生日志切换,不会发生完全检查点,那么emttr最终也是会超过tmttr的。超过与否实际取决于还有多少脏数据需要写出。

于是,讨论了两个极端后,我们就可以得到一个较为均衡的数值

需要注意的事,TMTTR数值的确定,应该是在连续考察系统运行状态后决定的。长时间运行生成的MTTR建议视图更具参考意义:

看看这段时间生成的建议视图

select MTTR_TARGET_FOR_ESTIMATE,ADVICe_status,DIRTY_LIMIT,ESTD_CACHE_WRITES,ESTD_TOTAL_WRITES,ESTD_TOTAL_IOS from  v$mttr_target_advice;

MTTR_TARGET_FOR_ESTIMATE|ADVIC|DIRTY_LIMIT|ESTD_CACHE_WRITES|ESTD_TOTAL_WRITES|ESTD_TOTAL_IOS

------------------------|-----|-----------|-----------------|-----------------|--------------

                      57|ON   |       6792|           259998|           259998|        488743

                      46|ON   |       4050|           259998|           259998|        488743

                      68|ON   |       9534|           259998|           259998|        488743

                      80|ON   |      11422|           259998|           259998|        488743

                      36|ON   |       1309|           260381|           260381|        489126

 


阅读(2274) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~