Oracle CKPT checkpoint 检查点知识汇总

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

checkpoint_file_queue.png

 

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#
———– ——————
325011036          325009912

SQL> select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/system.270.675355175              325009912
+DBA_DATA/dbaprd/datafile/sysaux.269.675355177              325009912
+DBA_DATA/dbaprd/datafile/undotbs1.266.675355179            325009912
+DBA_DATA/dbaprd/datafile/undotbs2.264.675355187            325009912
+DBA_DATA/dbaprd/datafile/users.263.675355189               325009912
+DBA_DATA/dbaprd/datafile/xml_data.262.675355189            325009912

SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/users.263.675355189               325009912

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#
———– ——————
325011196          325009912

SQL>  select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/system.270.675355175              325009912
+DBA_DATA/dbaprd/datafile/sysaux.269.675355177              325009912
+DBA_DATA/dbaprd/datafile/undotbs1.266.675355179            325009912
+DBA_DATA/dbaprd/datafile/undotbs2.264.675355187            325009912
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011168
+DBA_DATA/dbaprd/datafile/xml_data.262.675355189            325009912

SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011168

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#
———– ——————
325011272          325011243

SQL>  select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/system.270.675355175              325011243
+DBA_DATA/dbaprd/datafile/sysaux.269.675355177              325011243
+DBA_DATA/dbaprd/datafile/undotbs1.266.675355179            325011243
+DBA_DATA/dbaprd/datafile/undotbs2.264.675355187            325011243
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011168
+DBA_DATA/dbaprd/datafile/xml_data.262.675355189            325011243

SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011168

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#
———– ——————
325011488          325011243

SQL> select name,checkpoint_change# from v$datafile;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/system.270.675355175              325011243
+DBA_DATA/dbaprd/datafile/sysaux.269.675355177              325011243
+DBA_DATA/dbaprd/datafile/undotbs1.266.675355179            325011243
+DBA_DATA/dbaprd/datafile/undotbs2.264.675355187            325011243
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011243
+DBA_DATA/dbaprd/datafile/xml_data.262.675355189            325011243

9 rows selected.

SQL> select name,checkpoint_change# from v$datafile_header where name like ‘%users%’;

NAME                                               CHECKPOINT_CHANGE#
————————————————– ——————
+DBA_DATA/dbaprd/datafile/users.263.675355189               325011243

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号