收藏What’s the Point of Oracle Checkpoints?

本文深入解析Oracle数据库中的检查点(checkpoint)概念,涵盖检查点的种类、触发条件及其对数据库性能与恢复的影响。同时,文章提供了调整在线重做日志文件大小的方法,以优化检查点的效率。

(oracle checkpoint相关的一些重要问题)

作者简介: Harald van Breederode (oracle大学高级DBA讲师,拥有25unix方面的经验和12oracle相关经验。Oracle 8i,9i,10g,11g ocpOracle 10g ocm)

 

原文是一个英文的PDF(PPT),同事推荐的,PDF内容比较粗。第一次翻译,有不正确的地方欢迎指正。原文下载

1.目录

1.       介绍。

2.       缓冲区(Buffer cache)基础知识。

3.       Redo和缓冲区的关系。

4.       什么是检查点(checkpoint)。

5.       检查点的种类。

6.       Oracle在什么情况下会进行检查点(checkpoint)。

7.       调整在线日志文件。

8.       总结。

 

2 .缓冲区基础知识

2.2 缓冲区的组成结构如下:

1.       Buffers(缓冲区)

一个缓冲区可以保持一个数据块在任何时刻的的映象。

2.       Buffer headers(缓冲区头)

存储缓冲内容的元数据(metadata)

作为一种缓存的管理结构。

3.       Buffer pools(缓冲池)

收集相同用途的缓冲区,并对它们做相应的管理

4.       它们的工作职责

缓冲池的全部或者一部分。

分配给一个DBWn进程。

2.3  缓冲区管理

缓冲区是通过双向链表来管理的。

REPL

这块缓冲区中包含正在使用的块映象。

REPL-AUX(辅助REPL):

这块缓冲区用来做I/OCR(一致性读)的重建工作。

WRITE and CKPT-Q

脏块请求I/O队列。

WRITE-AUX(辅助WRITE):

正在进行IO操作的脏缓冲。

 

缓冲区管理用计数的方式来决定块最初插块茎入到REPL链表中的位置。

辅助REPL链表用于避免多余的扫描。

3.Redobuffer cache的关系

1.       当一个块发生修改时,缓冲区中会包含这个块的脏块映象,并产生redo

2.       一个块在redo的一个的RBA 上变脏,RBA重做日志块(redo log block)的地址。

3.       lgwr进程将redo写入相应的redo log file,并将log file的状态设为active

4.       脏块映象被DBWn进程写入数据文件,并且将redo log file置为inactive状态。

5.       Redo总是在脏块写入数据文件之前完成。

6.       在日志文件中的Active redo的大小,会影响instance crash的恢复时间。

7.       需要在性能和恢复时间之间做好权衡。

3.2  Buffer Cache I/O

3.2.1  服务进程在辅助REPL上寻找一个可用的buffer,然后再将一个数据块读进来。

1. 将缓存从辅助REPL读取到REPL

2. 如果块被修改了,则修改的块会被增加到CKPT-Q(检查点队列)

3. 在搜索可用空间的过程中,服务进程会同时将脏缓存写出。

3.2.2 DBWn将脏块内容刷新输出到数据库中

1.内存读从写缓存区被移动到辅助写缓存区。

2.一旦块被写入后:

Buffer 被移回到辅助写缓存区。

Buffercheckpoint队列中移出。

3.2.3  DBWn的进程写请求

1.促使缓冲区空闲。

2.Checkpoint

4.什么是检查点?

1.       一个在特定时间点发生的同步事件。

2.       促使部分或者所有的脏块的映象写入到数据库,由此保证在那个点(checkpoint)之前脏掉的数据库块能够被及时写入数据库。

3.       将数据库状态带到新的时间点。

4.       存在很多种不同类型的检查点。

 

 

5.Checkpoint的种类

1.完全检查点。

2.线程检查点。

3.文件检查点。

4.对象检查点。

5.并行查询检查点。

6.增量检查点。

7.文件切换检查点(Log Switch Checkpoint)。

注:通过设置log_checkpoints_to_alert=true,某些检查点能够被记录到alter日志中。

5.2 完全检查点

1.       在所有的实例中(针对rac),将脏冲区的块刷新输出到数据库

2.       变更的统计信息条目(v$sysstat, name):

DBWR checkpoints

DBWR checkpoint buffers written

DBWR thread checkpoint buffers written

3.       发生的情况:

Alter system checkpoint [global]

Alter database begin backup

Alter database begin backup

Shutdown

4.       控制文件头和数据文件头被更新。

CHECKPOINT_CHANGE#

5.       相关问题:

log switch 之后,oracle instance是否发生一个完全检查点?
oracle8i之前(包括8i),一直是这样做的,但是oracle 8i之后,就这种方式就被改变了。

 

5.3 线程检查点

1.       在单个实例中(针对rac而言),将脏冲区的块刷新输出到数据库。

2.       变更的统计信息条目:

DBWR checkpoints

DBWR checkpoint buffers written

DBWR thread checkpoint buffers written

3.       发生的情况:

Alter system checkpoint local

4.       控制文件头和数据文件头被更新。

CHECKPOINT_CHANGE#

5.4 文件检查点

1.       在所有实例中,将一个表空间中的所有数据文件中的脏冲区块刷新输出到数据库。

2.       变更的统计信息:

DBWR tablespace checkpoint buffers written

DBWR checkpoint buffers written

DBWR检查点。

3.       发生的情况:

Alter tablespace XXX offline

Alter tablespace XXX begin backup

Alter tablespace XXX read only

4.       控制文件头和数据文件头被更新。

CHECKPOINT_CHANGE#

5.5 并行查询检查点

1.       在所有实例中,当进行并行查询时,这个查询有关的objects的所有脏块会被刷新数据到数据库。

2.       变更的统计信息.

DBWR checkpoint buffers written

DBWR checkpoints

3.       发生情况.

并行查询。

PDML(并行DML)和PDDL(并行DDL)中的并行查询部分。

强制一致性。(direct io

5.6 对象检查点

1.       在所有实例中,将一个对象的所有脏块输出到数据库。

2.       变更的统计信息条目:

DBWR object drop buffers written

DBWR checkpoints

3.       一般在drop/truncate段时发生:

Drop table XXX

Drop table XXX purge

Truncate table XXX

Drop index XXX

4.       强制性介质恢复的目的。(原文:Mandatory for media recovery purposes

1.       从检查点队列中,刷新输出一部分脏块到数据库。

5.7 增量检查点

块映象以SCN号的顺序来写。

Checkpointrba地址在SGA中被更新。

2.       变更的统计信息:

DBWR checkpoint buffers written

3.       控制文件每3秒钟被CKPT进程更新一次。

Checkpoint进程记录进度。

 

5.8 一些其它的定义

3秒钟,CKPT进程会根据以下参数来计算目标检查点的RBA地址:

1.       最近的RBA地址。

2.       log_checkpoint_timeout

3.       log_checkpoint_interval

4.       fast_start_mttr_target

5.       fast_start_io_target

6.       最小在线日志文件的90%

在所有的缓存区脏掉之前,将对应的目标RBA写入到数据库中。

5.9 文件切换检查点

写一部分脏块内容到数据库中。

变更的统计信息:

DBWR checkpoints

DBWR checkpoint buffers written

background checkpoints started

background checkpoints completed

控制文件头和数据文件头被更新:

CHECKPOINT_CHANGE#

6.检查点管理

一些有用的检查点管理视图:

V$INSTANCE_RECOVERY

V$SYSSTAT

V$DATABASE

V$INSTANCE_LOG_GROUP

V$THREAD

V$DATAFILE

V$DATAFILE_HEADER

 

问:什么是oracle checkpoint的目的?

:checkpoint的目的是:为了实现数据库的一致性,为了性能和恢复,同步所有的数据文件,部分数据文件或者一些对象到一个一致的时间点。但是必需在他们控制作之前控制他们(翻译者补充:意思是这块的性能影响会比较大,需要理解他们的原理 。)。

 

 

6.2 Checkpoint发生的触发条件

V$INSTANCE_RECOVERY

WRITES_MTTR

fast_start_mttr_target

WRITES_LOGFILE_SIZE

90% of the smallest online redo log file

WRITES_LOG_CHECKPOINT_SETTINGS

log_checkpoint_timeout

WRITES_OTHER_SETTINGS

fast_start_io_target

WRITES_AUTOTUNE

10g self tuning checkpoints

WRITES_FULL_THREAD_CKPT

Manual checkpoints

7.调整在线日志文件(online redo log file)的大小

1.增量checkpoint不应该被在线日志文件的大小所触发。

2.在线日志文件的大小必需被正确的设置。

3.使用REDO LOG文件大小的建议:

V$INSTANCE_RECOVERYOPTIMAL_LOGFILE_SIZE参数

4.或者参照:

V$INSTANCE_RECOVERYWRITES_LOGFILE_SIZE参数

5.使用archive_lag_target参数去控制日志文件切换(log switch)的频率。

6.在一个oraclerac系统上,日志必需在所有的实例上被准确的设置。

注意:在线日志文件,只会因为设置的过小,不会嫌大。

 

8.总结

如果性能是一个很关键的一个指标。那么,在进行以下操作时要尤其小心:

1.       drop/truncate object

2.       将表空间置于read only状态时。

3.       将数据库或表空间置于backup模式时。

1.       在有dml的对象上进行并行查询。

2.       调整在线重做日志文件的大小。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13750068/viewspace-696179/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13750068/viewspace-696179/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值