oracle 完全检查点条件,ORACLE Checkpoint(检查点)

1定义:

ORACLE数据库采用“提交时并不强迫针对数据块的修改完成”,而是“提交是保证修改记录(以重做日志形式)写入日志文件”的机制,来获得性能优势。即

用户发出COMMIT时,写数据文件是异步的,但是写日志文件是同步的。

数据库实例崩溃时,内存中buffer中的修改过的数据,可能没有写入到数据块中。数据库重新打开时,需要进行修复,来恢复buffer中的数据状态,并确保

已经提交的数据被写入到数据块中。

检查点是这个过程中的保证机制,通过它来确定恢复时,哪些重做日志应该被扫描并应用于恢复。

check queue:检查点发生后,触发DBWn,CKPT获取发生检查点时对应的SCN,通过DBWn写到这个SCN为止,DBWR写dirty buffer中的数据,是根据buffer在首次被修改的时间的顺序写出,

也就是buffer被modify的时候会进入一个queue(checkpoint queue),DBWR就根据queue中的顺序批量写入到数据文件。由于无法适时将dbwr的进度记录,所以采用了

ckpt进程的检查点和heartbeat。

检查点发生后,CKPT进程将检查checkpoing queue是否过长,如果是,则触发DBWn,将一部分数据写入数据文件,缩短checkpoint queue.Checkpoint发生时,一面通过DBWn进行下一

批写操作(每次写的块数是有一个批量写的隐藏参数控制),另一方面,采用了heartbeat概念,每3秒钟将DBWn写的进度反应到控制文件中,也就是把DBWn当前刚写完的dirty buffer

对应的SCN写入到数据文件头和控制文件,这就是检查点SCN。

检查点发生后的数据库的数据文件、控制文件处理一致的状态的含义是不需要进行介质恢复,只表示数据文件头一致,但是不表示数据文件内容一致,因为数据文件内容可能包括在没有发生

检查点的其它情况下的dbwr写数据文件。这样文件内容就可能不一致,如果断电则要进行恢复。

触发DBWn进程的条件有:

1.DBWn超时。

2.系统中没有多余的缓冲区来存储数据。

3.CKPT触发DBWn

checkpoint 目的:

1.确保数据一致性

2.使数据库快速恢复。

checkpoint期间如下进程发生

1.DBWn写所有的脏数据到数据文件

2.LGWR更新控制文件和数据文件的SCN

2.checkpoint优化参数。

所有的数据文件在checkpoint期间会被冻结。频繁的checkpoints可以快速恢复数据库。优化checkpoint有如下几个参数

1.fast_start_mttr_target

2.log_checkpoint_interval

3.log_checkpoint_timeout

4.log_checkpoints_to_alert

2.1 fast_start_mttr_target

9i以来fast_start_mttr_target是调整checkpoint的首先方法,它可以指定单实例恢复需要的秒数。v$instance_recovery.estimated_mttr显示当前估计需要的秒数,

这个值会显示,即使fast_start_mttr_target没有被指定。instance_recovery.target_mttr表明短时间内MTTR的目标。v$mttr_target_advice显示这个当前MTTR设置

的工作量产生的I/O数量和其他I/O。帮助用户评定在优化和恢复之前平衡。

2.2 log_checkpoint_interval

log_checkpoint_interval指定这个最大的重做块的间隔数目。如果fast_start_mttr_target被指定,则log_checkpoint_interval不能设置为0.log_checkpoint_interval

会影响checkpoint频率。这个参数影响数据库向前回滚的时间,实际的恢复时间也基于这个时间,当然还有失败的类型和需要归档日志的数量。

2.3 log_checkpoint_timeout

指每N秒发生一个checkpoint,不顾事务提交的频率,这可能导致一些没有必要的checkpoint。

2.4 log_checkpoints_to_alert

设置为真,可以在警告日志中观察到增量检查点的触发。

3.触发完全检查点

触发完全检查点,促使DBWn将检查点时刻前的所有的脏数据写入数据文件,一般运行期间的数据库不会产生完全检查点。

3.1.正常事务处理或立即选项关闭例程时shutdown immediate 和 shutdown normal

3.2.设置初始化参数:

log_checkpoint_interval,log_checkpoint_timeout,fast_start_io_target强制时。

3.3.DBA手动请求时

alter system checkpoint;

alter tablespace XXX offline;

3.4 日志切换时

alter system switch logfile;

注意:

alter databae datafile xxx offline 不会触发检查点进程。单纯的 datafile offline不会触发文件检查点,只有针对 tablespace offline才会触发检查点,这也是online datafile 需要介质

恢复,而online tablespace 不需要的原因。当然对于表空间offline 再online的情况 ,最好做个强制checkpoint;

4.触发增量检查点

4.1 联机热备份数据文件前,要求该数据文件中被修改的块从BUFFER写入数据文件,所以发出如下命令

alter tablespace XXX begin backup(end backup);也会触发和该表空间的数据文件有关的局部检查点。

4.2 其他命令

aler tablespace XXX readonly;

alter tablespace xxx offline normal

会触发增量检查点。

5.检查点等待事件。

日志切换必须等检查点完成。log file switch(checkpoint incomplete),这个等待事件本身也说明,日志切换时产生的检查点是需要等待的。

这个日志文件对应的脏块全部写完后,检查点更新控制文件和数据头,检查点才完成。也就是说,日志切换必须等待检查点完成,而检查点等待

DBWn完成。这种等待DBWn完成的检查点,最后一步写入控制文件和数据文件头的SCN,肯定是DBWn完成的最后一块的SCN。

log switch时,不能立即切换到active状态,log group 必须等待。active表示该log group 还没有完成归档(归档模式下),或者该log group有进行

实例恢复时需要用到的日志,所以当checkpoint发生时,如果DBWn还没有写完它该写完的dirty buffer,则log group 处于active状态,不会进行日志切换,当然

也不会发生日志文件被覆盖的问题。

检查点发生后,就是lgwr和dbwr写buffer到磁盘文件的过程,但是两者的读写速度不同,dbwr写buffer到数据文件的过程较慢,因为此过程是一个随机读取存储的过程。而

lgwr写buffer到redo文件的过程比dbwr要快得多,因为是顺序读取写入的。因为此两者速度不同,就会产生等待问题,当LGWR轮循一圈后,进行日志切换,覆盖redo log file,

如果此时dbwr没有写完,则lgwr会等待,oracle 会挂起,同时在alter日志中会提示一个checkpoint not complete,检查点结束后数据库会自动恢复。

6.checkpoint 与 scn关系

checkpoint发生的目的就是要把储存的buffer内的已提交的事务写入到Disk,提交一个事务时,立刻将redo buffer 写入到redo log file中,但是不一定马上将dirty buffer

写入到disk datafile中,这是为了减少I/O考虑,所以采用BATCH方式写入。

checkpoint发生时,会把SCN写入到以下四个地方,三个位于控制文件,一个位于数据文件头。

control file三个地方:

1.system checkpoint scn

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

------------------

9369637

2.datafile checkpoint scn

SQL> select name,checkpoint_change# from v$datafile where name like '%users01%';

NAME                                                                             CHECKPOINT_CHANGE#

-------------------------------------------------------------------------------- ------------------

/u01/app/oracle/oradata/orcl/users01.dbf                                                    9369637

3.stop scn

SQL> select name,last_change# from v$datafile where name like '%users01%';

NAME                                                                             LAST_CHANGE#

-------------------------------------------------------------------------------- ------------

/u01/app/oracle/oradata/orcl/users01.dbf

正常datafile在read_write模式下,last_change#一定是NULL

4.start scn 在datafile header

SQL> select name,checkpoint_change# from v$datafile_header where name like '%users01%';

NAME                                                                             CHECKPOINT_CHANGE#

-------------------------------------------------------------------------------- ------------------

/u01/app/oracle/oradata/orcl/users01.dbf                                                    9369637

7.crash recovery 和 media recovery

启动数据库时,如果发现stop scn = NULL,则表示需要进行crash recovery

启动数据库时,如果发现datafile header 的start scn 不等于存储于控制文件中的datafile scn ,则要进行media recovery.

8.recovery database两种问题

8.1.recovery database until cancel => open database resetlog

此种情况下datafile header中的scn一定小于control file 的datafile scn,必须进行media recovery,重做archive log直到相等。

restore datafile 后,可以mount database ,然后检查controlfile and datafile header的上SCN。

SQL> select 'controlfile' "SCN  location", name, checkpoint_change#

from v$datafile

where name like '%users01%'

union

select 'file header', name, checkpoint_change#

from v$datafile_header

where name like '%users01%';

SCN  location NAME                                                                             CHECKPOINT_CHANGE#

------------- -------------------------------------------------------------------------------- ------------------

controlfile   /u01/app/oracle/oradata/orcl/users01.dbf                                                    9369637

file header   /u01/app/oracle/oradata/orcl/users01.dbf                                                    9369637

8.2 recover database until cancel using backup controlfile => open database resetlog

这种情况下的的datafile header中的SCN一定大于controlfile中的datafile scn,因为控制文件是旧的,所以它保存的信息也是以前的。

如果某个表被DROP掉,没有破坏整体结构,可以用不完全恢复解决。

如果某个tablespace或datafile被DROP掉,因为数据库整体结构破坏,所以controlfile已经没有该数据文件的信息,就算restore datafile 再进行不完全恢复

也无法未回文件。此种情况下只好restore之前备份的controlfile(里面被drop 掉的datafile metadata此时还存在),不过restore controlfile ,此时controlfile

中的SYSTEM SCN 小于目前datafile header scn,也不会等待目前存储于log file内的SCN,此时必须使用recover database until cancel using backup controlfile 到

drop datafile or drop tablespace之前的SCN。

阅读(2831) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值