CKPT Checkpoint Process
Signals DBWn at checkpoints and updates all the data files and control files of the database to indicate the most recent checkpoint.
At specific times CKPT starts a checkpoint request by messaging DBWn to begin writing dirty buffers. On completion of individual checkpoint requests, CKPT updates data file headers and control files to record most recent checkpoint.
See Also: Oracle Database Concepts
CKPT performs tasks such as recording and starting checkpoints, generating heartbeat redo,and completing outstanding object drop/truncate cross-instance calls.
Oracle CKPT checkpoint 检查点知识汇总
CKPT 检查点进程:检查点(CKPT): 在检查点传送信号给DBWn, 并且更新数据库的所有数据文件及控制文件,以指示最近的检查点。当出现检查点时,所有确认的交易所造成的变更,都会被写入磁盘中数据文件。
检查点
LGWR 后台进程在一个周期中依次写入重做日志组
当一个组写满时 Oracle 服务器必须执行检查点 这意味着
DBWn 将全部或部分的坏块写入到数据文件 正在进行检查的日志会记录这些坏块
CKPT 更新数据文件标题和控制文件
虽然检查点产生许多磁盘写入 但检查点通常允许其它工作同时继续执行 如果 DBWn 进程没有完成对文件的检查 并且 LGWR 还需要该文件 则 LGWR
必须等待频繁的检查点意味着例程恢复时间更短 但也意味着 DBWn 写入 到数据文件 和 CKPT 写入 到数据文件标题 会增多 您的选择取决于恢复时间和运行时性能的优先级
后台进程和恢复:检查点 (CKPT)
CKPT 负责:
- 在检查点向 DBWn 发出信号
- 使用检查点信息更新数据文件头
- 使用检查点信息更新控制文件
要了解实例恢复,需要了解特定后台进程的功能。
每隔三秒(或频率更高),CKPT 进程就在控制文件中存储一次数据,以记录 DBWn 从SGA 写入到磁盘的已修改数据块。这就称为“检查点”。检查点的用途是标识联机重做日志文件开始进行实例恢复的位置(这个位置称为“检查点位置”)。
如果使用日志切换,CKPT 进程还会将这个检查点信息写入到数据文件头。使用检查点的原因如下:
- 确保定期将内存中的已修改数据块写入磁盘,以便在系统或数据库出现故障的情况下不会丢失数据
- 减少实例恢复所需的时间。在进行恢复时只需处理跟在最后一个检查点后面的联机重做日志文件
- 确保在关闭过程中所有已提交数据都写入到数据文件中
由 CKPT 进程写入的检查点信息包括检查点位置、系统更改号、联机重做日志文件中开始恢复的位置、关于日志的信息等等。
注:CKPT 进程并不将数据块写入到磁盘,也不将重做块写入到联机重做日志文件。
检查点优化原则
• 确定联机重做日志文件的大小以削减检查点数
• 添加联机重做日志组以延长 LGWR 开始重写之前的时间
• 用初始化参数控制检查点:
– FAST_START_IO_TARGET
– LOG_CHECKPOINT_INTERVAL
– LOG_CHECKPOINT_TIMEOUT
– DB_BLOCK_MAX_DIRTY_TARGET
监视检查点的频率
可以检查 alert.log 文件中日志切换的次数
同样 检查该文件是否有 Checkpoint not complete; unable to allocate file. 的错误消息 这些消息表示 LGWR 等待检查点的完成
如果系统统计 已启动的后台检查点 和 已完成的后台检查点 的值相差超过 1 则日志切换之间的检查点没有完成 您需要更大的日志文件
可以设置 LOG_CHECKPOINTS_TO_ALERT 参数 以便将检查点的开始和结束时间都记录在 alert.log 文件中
在 report.txt 中 DBWn 检查点写入请求 统计表明检查点发送到 DBWn的次数 如果每个事务都有大量检查点 则表明产生了过多的检查点
调整检查点
DBWn 必须总是在每个重做日志组的结尾执行检查点 也可以用初始化参数设置检查点
注 有关检查点和快速启动检查点的完整解释 以及这些概念所涉及的所有数的全部说明 。
如果有效的性能是您需要优先考虑的因素 则应选择重做日志文件的大小 以便检查点的发生频率尚不足以导致明显的响应延迟 但又不过于频繁
对许多站点 该频率一般为每 30 分钟一次 但是根据业务需要 数据库的检查点频率可以是 2 秒到 8 小时的任何值
您可以实验不同的检查点频率 例如 如果 SGA 非常大并且检查点很少发生则 OLTP 系统可能在检查点期间发生磁盘争用 在这种情况下 较频繁的检查点会使坏块更少
注 优化 DBWn I/O 一节中将解释 DB_BLOCK_MAX_DIRTY_TARGET参数
下面的alert.log例子是: 由于轮换重做日志文件太快而导致未完成检查点
Thread 1 advanced to log sequence 1597
Current log# 2 seq# 1597 mem# 0:/users/cours/tun8_08/DATA/DISK3/
log2a.rdo
Thread 1 cannot allocate new log, sequence 1598
Checkpoint not complete
下面的例子是: 示例 1 数据库写入器检查点
Statistic Total Per Trans Per Logon
————————— ——- ———– ———
DBWR checkpoint buffers written 1 1 1
DBWR free buffers found 11 11 11
DBWR 检查点 表明发送给数据库写入器的检查点消息数
检查点期间数据 I/O 的增长可导致系统性能下降
您可以通过增大 init.ora 参数 LOG_CHECKPOINT_INTERVAL 和
LOG_CHECKPOINT_TIMEOUT 来减少检查点的数目和频率 然而要注意 检
查点频率低会增加数据库的恢复时间
checkpoint 分成很多种 full 、file、thread、parallel query、 object 、incremental 、logfile switch
每一种checkpoint 都有其自身的特性,例如Incremental Checkpoint会要求ckpt 每3s 更新一次controlfile 但是不更新datafile header, 而FULL CHECKPOINT要求立即完成(同步的) 且会同时更新 controlfile 和 datafile header。
各种checkpoint 的特点见下表:
Full Checkpoint
Writes block images to the database for all dirty buffers from all instances
Statistics updated:
DBWR checkpoints
DBWR checkpoint buffers written
DBWR thread checkpoint buffers written
Caused by:
Alter system checkpoint [global]
Alter database begin backup
Alter database close
Shutdown
Controlfile and datafile headers are updated
CHECKPOINT_CHANGE#
Thread Checkpoint
Writes block images to the database for all dirty buffers from one instance
Statistics updated:
DBWR checkpoints
DBWR checkpoint buffers written
DBWR thread checkpoint buffers written
Caused by:
Alter system checkpoint local
Controlfile and datafile headers are updated
CHECKPOINT_CHANGE#
File Checkpoint
Writes block images to the database for all dirty buffers for all files of a tablespace from all instances
Statistics updated:
DBWR tablespace checkpoint buffers written
DBWR checkpoint buffers written
DBWR checkpoints
Caused by:
Alter tablespace XXX offline
Alter tablespace XXX begin backup
Alter tablespace XXX read only
Controlfile and datafile headers are updated
CHECKPOINT_CHANGE#
Parallel Query Checkpoint
Writes block images to the database for all dirty buffers belonging to objects accessed by the query from all instances
Statistics updated:
DBWR checkpoint buffers written
DBWR checkpoints
Caused by:
Parallel Query
Parallel Query component of PDML or PDDL
Mandatory for consistency
Object “Checkpoint”
Writes block images to the database for all dirty buffers belonging to an object from all instances
Statistics updated:
DBWR object drop buffers written
DBWR checkpoints
Caused by:
Drop table XXX
Drop table XXX purge
Truncate table XXX
Mandatory for media recovery purposes
Incremental Checkpoint
Writes the contents of “some” dirty buffers to the database from CKPT-Q
Block images written in SCN order
Checkpoint RBA updated in SGA
Statistics updated:
DBWR checkpoint buffers written
Controlfile is updated every 3 seconds by CKPT
Checkpoint progress record
Log Switch Checkpoint(8i 以前 LOG switch checkpoint是FULL CHECKPOINT)
Writes the contents of “some” dirty buffers to the database
Statistics updated:
DBWR checkpoints
DBWR checkpoint buffers written
background checkpoints started
background checkpoints completed
Controlfile and datafile headers are updated
CHECKPOINT_CHANGE#
无论是什么类型的checkpoint 检查点 ,所有的本地检查点(CKPT)已类似的本地化方法处理。 每一个实例中所有本地的活跃检查点请求(active local checkpoint request)都保存在一个队列(queue)中,这个队列叫做 Active Checkpoint Queue。 在这个队列(queue)中的每一条记录代表一个本地检查点(local checkpoint request)。 当某一个进程( 可能是前台进程 foreground process –例如前台进程执行“alter tablespace users begin/end backup”, 也可能是CKPT 或者其他后台进程) , 这个进程都会将新的 request 记录放到这个Active Checkpoint Queue中。 典型的一个checkpoint request 由 检查点类型checkpoint request type,优先级priority , 以及与该checkpoint request 关联的checkpoint structure, 等待进程 waiter process, 还有其余一些相关的属性如 FILE Checkpoint 的tablespace id、FILE NUMBER、 Object checkpoint的object id 等。
DBWR进程会不断地扫描这个Active Checkpoint Queue, 并服务于这个Queue上的checkpoint request 检查点请求。 一旦某个request 被完成了,DBWR 将这个request标记为completed 。 CKPT 进程也会不断监控这个 Active Checkpoint Queue 查看是否所有request都被完成了。 当CKPT发觉一个checkpoint request完成了, CKPT会将这个request从 Active Checkpoint Queue中移除。 取决于不同的检查点种类和目的, 当一个本地检查点(local checkpoint)完成,这意味着 某些特定的磁盘上的数据结构被更新,以反映这个检查点完成的物理表现。 这个操作 或者由 直接CKPT完成, 或者由提交checkpoint request的 等待进程直接完成, 或者由CKPT唤醒这个提交checkpoint request的等待进程间接地完成,以上具体由谁来完成操作 取决于检查点种类和目的。
图解Low RBA, Thread Checkpoint Queue, File Checkpoint Queue |
ODM FINDING: Understand SCN movement during online user managed backup; Before online backup, check current scn, system and datafile scn in controlfile and scn in datafile header. As expected checkpoint scn are same in controlfile and datafile headers, and it is behind current scn. SQL> select current_scn, checkpoint_change# from v$database; CURRENT_SCN CHECKPOINT_CHANGE# SQL> select name,checkpoint_change# from v$datafile; NAME CHECKPOINT_CHANGE# SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’; NAME CHECKPOINT_CHANGE# Start online tablespace backup Oracle did a checkpoint on USERS tablespace and datafile only, and freeze the checkpoint scn on datafile header. SQL> alter tablespace users begin backup; Tablespace altered. SQL> select current_scn, checkpoint_change# from v$database; CURRENT_SCN CHECKPOINT_CHANGE# SQL> select name,checkpoint_change# from v$datafile; NAME CHECKPOINT_CHANGE# SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’; NAME CHECKPOINT_CHANGE# during the online backup checkpoint scn is freeze on datafile belongs to USERS tablespace SQL> alter system checkpoint; System altered. SQL> select current_scn, checkpoint_change# from v$database; CURRENT_SCN CHECKPOINT_CHANGE# SQL> select name,checkpoint_change# from v$datafile; NAME CHECKPOINT_CHANGE# SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’; NAME CHECKPOINT_CHANGE# END online tablespace backup; Oracle advanced checkpoint scn on USERS tablespace and datafile only to be same as system checkpoint scn SQL> alter tablespace users end backup; Tablespace altered. SQL> select current_scn, checkpoint_change# from v$database; CURRENT_SCN CHECKPOINT_CHANGE# SQL> select name,checkpoint_change# from v$datafile; NAME CHECKPOINT_CHANGE# 9 rows selected. SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’; NAME CHECKPOINT_CHANGE# |
Leave a Reply