(oracle checkpoint相关的一些重要问题)
作者简介: Harald van Breederode (oracle大学高级DBA讲师,拥有25年unix方面的经验和12年oracle相关经验。Oracle 8i,9i,10g,11g ocp。Oracle 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/O或CR(一致性读)的重建工作。
WRITE and CKPT-Q:
脏块请求I/O队列。
WRITE-AUX(辅助WRITE):
正在进行IO操作的脏缓冲。
缓冲区管理用计数的方式来决定块最初插块茎入到REPL链表中的位置。
辅助REPL链表用于避免多余的扫描。
3.Redo和buffer 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 被移回到辅助写缓存区。
Buffer从checkpoint队列中移出。
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号的顺序来写。
Checkpoint的rba地址在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_RECOVERY的OPTIMAL_LOGFILE_SIZE参数
4.或者参照:
V$INSTANCE_RECOVERY的WRITES_LOGFILE_SIZE参数
5.使用archive_lag_target参数去控制日志文件切换(log switch)的频率。
6.在一个oracle的rac系统上,日志必需在所有的实例上被准确的设置。
注意:在线日志文件,只会因为设置的过小,不会嫌大。
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/
本文深入解析Oracle数据库中的检查点(checkpoint)概念,涵盖检查点的种类、触发条件及其对数据库性能与恢复的影响。同时,文章提供了调整在线重做日志文件大小的方法,以优化检查点的效率。
274

被折叠的 条评论
为什么被折叠?



