1. 什么是CKPT进程?
CKPT(Checkpoint Process)是Oracle数据库中的检查点进程,负责协调和管理数据库检查点操作。在Oracle 19c中,CKPT进程负责维护数据一致性,确保内存中的修改能够及时写入持久化存储,同时在实例恢复时提供准确的恢复起点。
2. 深入理解检查点机制
2.1 检查点的核心作用
检查点是一种关键的数据保护机制,其主要功能是通知DBWn(Database Writer)进程将Buffer Cache中的脏数据块(Dirty Blocks)写入数据文件中。在Oracle 19c中,这个协调工作由CKPT进程完成。
检查点机制的核心价值在于显著减少数据库崩溃后的恢复时间。通过定期将内存中的修改持久化到磁盘,数据库在重启时需要重放的redo日志量大大减少,从而加快恢复速度。
2.2 数据修改与恢复机制
当数据被修改时,Oracle的执行流程如下:
-
将数据块从磁盘读入Buffer Cache
-
在内存中修改数据块
-
同时生成重做信息(Redo)写入Redo Log Buffer
-
LGWR进程将Redo信息写入在线重做日志文件
由于Redo日志的存在,Oracle不需要在每次事务提交时立即将数据块写回磁盘,这种设计显著提升了数据库性能。当发生实例故障时,Oracle可以通过Redo日志进行前滚操作,将数据库恢复到故障前的状态。
2.3 检查点的分类(Oracle 19c)
在Oracle 19c中,检查点主要分为以下类型:
-
完全检查点(Full Checkpoint):更新所有数据文件头和控制文件
-
线程检查点(Thread Checkpoint):包括本地和全局检查点
-
数据文件检查点(Datafile Checkpoint):针对单个数据文件
-
对象检查点(Mini-checkpoint):由DDL操作触发
-
并行查询检查点(Parallel Query Checkpoint):并行查询时触发
-
增量检查点(Incremental Checkpoint):日志切换时触发
2.4 增量检查点的增强特性
Oracle 19c对增量检查点机制进行了进一步优化:
-
持续活跃的检查点推进:不再依赖传统的完全检查点
-
内存中检查点推进:主要在内存中维护检查点信息
-
控制文件更新:增量检查点的RBA信息记录在控制文件中
-
智能写入机制:DBWn进程根据多种因素决定脏块写入频率
-
恢复时间优化:显著减少实例恢复所需时间
增量检查点的触发条件包括:
-
恢复时间上限要求
-
最小在线重做日志文件大小
-
log_checkpoint_interval参数设置 -
log_checkpoint_timeout参数设置 -
Buffer Cache中脏块总量
3. CKPT进程的工作原理
3.1 多维度触发机制
手工触发
-- 手动触发检查点
ALTER SYSTEM CHECKPOINT;
-- 刷新缓冲区并触发检查点
ALTER SYSTEM FLUSH BUFFER_CACHE;
在计划维护或重大操作前,建议手动触发检查点并多次切换重做日志,确保所有脏块完全写入磁盘。
日志切换触发
在Oracle 19c中,日志切换自动触发增量检查点。LGWR进程在切换日志时通知DBWn写入脏块,同时如果是归档模式还会通知ARCH进程。
对象级检查点
DDL操作(如DROP、TRUNCATE)会触发对象级检查点,确保相关对象的所有脏块都被写入磁盘:
-- 这些操作会自动触发对象检查点
TRUNCATE TABLE employees;
DROP TABLE sales_data;
并行查询检查点
并行查询可能触发检查点以确保数据一致性,防止直接路径读取时出现数据版本冲突。
3秒检测机制
CKPT进程每隔3秒检测一次系统状态,但这不是每次都会更新控制文件或数据文件头。主要目的是:
-
推进增量检查点位置
-
更新控制文件中的Low Cache RBA
-
优化实例恢复时间
那么ckpt 进程的每3s 触发的机制是⼲嘛的呢?
实际上就是post信息给dbwn进程去安装检查点队列写脏块,把脏块写⼊到disk上。这样可以尽可能的减少实例恢复时所需要的时间。 那么这⾥有个问题? 那这3s 触发机制,ckpt进程会更新controlfile中什么信息呢? 我们知道实例恢复的起点是low cache rba,那么既然⽬的是为了缩短实例恢复的时间,那么是不是就是将low cache rba的位置往后移动呢?换句话讲,也就是会更新low cache rba信息。 【10013 event】
+++for Oracle 19c
2025-01-06T22:02:11.190895-05:00
ALTER SYSTEM SET log_checkpoints_to_alert=TRUE SCOPE=BOTH; 2025-01-06T22:03:27.867567-05:00
Thread 1 cannot allocate new log, sequence 1134 Private strand flush not complete
Current log# 7 seq# 1133 mem# 0: /u01/app/oracle/oradata/ORA19C/onlinelog/redo07.log Beginning log switch checkpoint up to RBA [0x46e.2.10], SCN: 45928822
2025-01-06T22:03:28.053595-05:00
Thread 1 advanced to log sequence 1134 (LGWR switch), current SCN: 45928822
Current log# 4 seq# 1134 mem# 0: /u01/app/oracle/oradata/ORA19C/onlinelog/redo04.log 2025-01-06T22:03:30.096687-05:00
ARC0 (PID:22853): Archived Log entry 414 added for T-1.S-1133 ID 0x494132c2 LAD:1 2025-01-06T22:03:44.400972-05:00
Beginning global checkpoint up to RBA [0x46e.9.10], SCN: 45928841 2025-01-06T22:03:45.870816-05:00
Completed checkpoint up to RBA [0x46e.9.10], SCN: 45928841 Completed checkpoint up to RBA [0x46e.2.10], SCN: 45928822 2025-01-06T22:04:52.422610-05:00
MTTR advisory was temporarily turned off because FAST_START_MTTR_TARGET was altered. 2025-01-06T22:04:52.435022-05:00
ALTER SYSTEM SET fast_start_mttr_target=60 SCOPE=BOTH;
2025-01-06T22:05:33.726726-05:00
Incremental checkpoint up to RBA [0x46e.9.0], current log tail at RBA [0x46e.1385.0]
3.2 检查点的高级监控
在Oracle 19c中,可以使用以下方法监控检查点活动:
-- 启用检查点跟踪
ALTER SYSTEM SET log_checkpoints_to_alert = TRUE;
-- 查看检查点信息
SELECT file#, checkpoint_change#, last_change#
FROM v$datafile;
-- 监控检查点进度
SELECT * FROM v$instance_recovery;
4. 检查点相关的Latch
4.1 各版本Latch对比分析
Oracle 10.2.0
SQL> select latch#,level#,name from v$latch where name like '%check%';
LATCH# LEVEL# NAME
------ ------ --------------------------
122 5 active checkpoint queue latch
123 5 checkpoint queue latch
Oracle 11.2.0.4
SYS@rac11g1>select latch#,level#,name from v$latch where name like '%check%';
LATCH# LEVEL# NAME
------ ------ ----------------------------------------
158 5 heartbeat check
175 5 active checkpoint queue latch
176 5 checkpoint queue latch
216 6 gc checkpoint
245 8 lock new checkpoint scn during media recovery
259 6 Block new check invariant rollback SCN latch
6 rows selected.
Oracle 19c
SQL> select latch#,level#,name from v$latch where name like '%check%';
LATCH# LEVEL# NAME
------ ------ ----------------------------------------
286 5 heartbeat check
325 5 active checkpoint queue latch
326 5 checkpoint queue latch
399 0 Backup Appliance health check latch
421 8 lock new checkpoint scn during media recovery
435 6 Block new check invariant rollback SCN latch
1074 6 Raw MKID check latch - S non-parent
7 rows selected.
4.2 Oracle 19c检查点相关Latch详解
4.2.1 核心检查点Latch
| LATCH# | LEVEL# | NAME | 描述 |
|---|---|---|---|
| 325 | 5 | active checkpoint queue latch | 保护活动检查点队列的访问,协调多个检查点操作 |
| 326 | 5 | checkpoint queue latch | 管理检查点队列结构,确保检查点信息的一致性 |
4.2.2 恢复相关Latch
| LATCH# | LEVEL# | NAME | 描述 |
|---|---|---|---|
| 421 | 8 | lock new checkpoint scn during media recovery | 介质恢复期间保护新检查点SCN的分配和更新 |
| 435 | 6 | Block new check invariant rollback SCN latch | 确保回滚段SCN检查的一致性 |
4.2.3 系统健康检查Latch
| LATCH# | LEVEL# | NAME | 描述 |
|---|---|---|---|
| 286 | 5 | heartbeat check | 数据库心跳机制相关的检查latch |
| 399 | 0 | Backup Appliance health check latch | Oracle零数据丢失恢复一体机健康检查 |
4.2.4 高级功能Latch
| LATCH# | LEVEL# | NAME | 描述 |
|---|---|---|---|
| 1074 | 6 | Raw MKID check latch - S non-parent | 保护多租户环境中元数据标识检查 |
4.3 Latch争用监控与优化
4.3.1 监控检查点Latch争用
-- 检查点相关latch的争用情况
SELECT ln.name,
ls.gets,
ls.misses,
ls.sleeps,
ls.immediate_gets,
ls.immediate_misses,
ROUND((ls.misses / DECODE(ls.gets, 0, 1, ls.gets)) * 100, 2) miss_ratio
FROM v$latchname ln, v$latch ls
WHERE ln.name LIKE '%check%'
AND ln.latch# = ls.latch#
ORDER BY ls.gets DESC;
4.3.2 常见的Latch争用解决方案
-
active checkpoint queue latch争用
-
优化检查点频率
-
调整
_db_fast_obj_ckpt参数 -
减少不必要的对象检查点
-
-
checkpoint queue latch争用
-
增加DBWn进程数量
-
优化脏块写入策略
-
调整Buffer Cache大小
-
-
介质恢复相关latch争用
-
优化恢复并行度
-
调整恢复相关参数
-
避免频繁的介质恢复操作
-
4.3.3 预防性优化措施
-- 检查latch争用趋势
SELECT * FROM (
SELECT sn.name,
s.value,
RANK() OVER (ORDER BY s.value DESC) as rank
FROM v$sysstat s, v$statname sn
WHERE sn.name LIKE '%latch%'
AND s.statistic# = sn.statistic#
)
WHERE rank <= 10;
-- 监控检查点活动频率
SELECT name, value
FROM v$sysstat
WHERE name IN ('background checkpoints started',
'background checkpoints completed',
'incremental checkpoints');
4.4 Oracle 19c新增特性对Latch的影响
4.4.1 多租户环境的影响
Oracle 19c在多租户环境中引入了新的latch机制:
-
PDB级别的检查点优化
-
改进的资源隔离机制
-
增强的并发控制
4.4.2 自动维护特性
-
自动检查点调优
-
智能latch管理
-
动态资源分配
4.5 性能优化建议
-
参数调优
-- 调整检查点相关参数 ALTER SYSTEM SET "_db_fast_obj_ckpt" = TRUE; ALTER SYSTEM SET "_checkpoint_pre_alloc_latches" = 8; -
监控策略
-
定期检查latch争用情况
-
监控检查点完成时间
-
分析AWR报告中的latch统计
-
-
架构优化
-
合理配置重做日志大小和组数
-
优化存储I/O性能
-
使用适当的并发控制机制
-
通过深入理解Oracle 19c中检查点相关的latch机制,DBA可以更好地诊断和解决性能问题,确保数据库的高效稳定运行。
5. 检查点相关参数详解
5.1 关键参数配置
Oracle 19c提供了多个与检查点相关的优化参数:
| 参数名 | 默认值 | 描述 | 建议配置 |
|---|---|---|---|
_db_fast_obj_ckpt | TRUE | 启用快速对象检查点 | 保持默认 |
_rbr_ckpt_tracing | 0 | 重用块范围检查点跟踪 | 诊断时启用 |
_obj_ckpt_tracing | 0 | 对象检查点跟踪级别 | 诊断时调整 |
_disable_incremental_recovery_ckpt | FALSE | 禁用增量恢复检查点 | 保持默认 |
_incremental_recovery_ckpt_min_batch | 500 | 增量恢复最小写入批次 | 根据负载调整 |
_time_based_rcv_ckpt_target | 180 | 基于时间的恢复检查点目标(秒) | 根据RTO调整 |
_defer_log_boundary_ckpt | TRUE | 延迟日志边界检查点 | 保持默认 |
5.2 ADG环境特殊配置
在Active Data Guard环境中,可能需要特殊配置:
-- 解决Standby控制文件SCN不更新问题
ALTER SYSTEM SET "_time_based_rcv_ckpt_target" = 0 SCOPE = BOTH;
-- 启用对象检查点跟踪
ALTER SYSTEM SET "_obj_ckpt_tracing" = 100;
5.3 性能优化建议
-
监控检查点频率:使用AWR报告分析检查点活动
-
优化重做日志大小:确保日志文件大小适当
-
调整增量检查点:根据恢复时间目标配置参数
-
避免过度检查点:过多的检查点会影响性能
6. 实战案例与故障处理
6.1 检查点性能问题诊断
-- 检查检查点相关等待事件
SELECT event, total_waits, time_waited
FROM v$system_event
WHERE event LIKE '%checkpoint%' OR event LIKE '%CKPT%';
-- 监控检查点进度
SELECT * FROM v$instance_recovery;
6.2 常见问题解决方案
-
检查点不完全:优化重做日志配置
-
检查点时间过长:调整DBWn进程和检查点参数
-
增量检查点推进缓慢:检查系统负载和I/O性能
7. 总结与最佳实践
Oracle 19c中的CKPT进程通过智能化的检查点机制,在确保数据一致性和持久性的同时,最大化系统性能与可用性。基于对CKPT进程的深度分析,以下是关键的最佳实践建议:
7.1 检查点参数优化配置
核心参数调优
-- 启用自动检查点调优(默认启用)
ALTER SYSTEM SET fast_start_mttr_target = 300 SCOPE=BOTH;
-- 配置增量检查点目标时间(秒)
ALTER SYSTEM SET "_time_based_rcv_ckpt_target" = 180 SCOPE=SPFILE;
-- 启用快速对象检查点
ALTER SYSTEM SET "_db_fast_obj_ckpt" = TRUE SCOPE=SPFILE;
参数配置建议
-
fast_start_mttr_target: 根据业务RTO要求设置,通常建议200-600秒
-
log_checkpoint_timeout: 设置检查点超时时间,避免过于频繁的检查点
-
log_checkpoint_interval: 结合重做日志大小合理配置
7.2 检查点活动监控体系
实时监控脚本
-- 检查点完成状态监控
SELECT * FROM v$instance_recovery;
-- 检查点进度查询
SELECT file#, checkpoint_change#, last_change#
FROM v$datafile_header;
-- 检查点相关统计信息
SELECT name, value
FROM v$sysstat
WHERE name LIKE '%checkpoint%';
预警阈值设置
-
检查点完成时间超过fast_start_mttr_target的80%
-
增量检查点推进速度异常缓慢
-
检查点相关的等待事件持续出现
7.3 重做日志优化配置
日志配置最佳实践
-- 查看当前日志配置
SELECT group#, bytes, members, status
FROM v$log;
-- 优化日志大小建议
SELECT optimal_logfile_size
FROM v$instance_recovery;
配置建议
-
日志文件大小:确保切换间隔在15-30分钟
-
日志组数量:至少3组,推荐4-5组
-
日志成员:多路镜像确保可用性
7.4 自动检查点调优策略
利用19c自动化功能
-- 确认自动检查点调优状态
SELECT name, value
FROM v$parameter
WHERE name = 'fast_start_mttr_target';
-- 监控自动调优效果
SELECT * FROM v$mttr_target_advice;
自动化优势
-
根据系统负载动态调整检查点频率
-
自动平衡性能与恢复时间要求
-
减少人工干预和调优成本
7.5 定期健康检查体系
Latch争用监控
-- 检查点相关latch争用监控
SELECT ln.name, ls.gets, ls.misses,
ROUND((ls.misses/DECODE(ls.gets,0,1,ls.gets))*100,2) miss_ratio
FROM v$latchname ln, v$latch ls
WHERE ln.name LIKE '%check%' AND ln.latch# = ls.latch#;
等待事件分析
-- 检查点相关等待事件
SELECT event, total_waits, time_waited_micro
FROM v$system_event
WHERE event LIKE '%checkpoint%' OR event LIKE '%CKPT%';
7.6 性能优化检查清单
日常维护项目
-
[ ] 定期检查fast_start_mttr_target实际效果
-
[ ] 监控检查点完成时间趋势
-
[ ] 分析AWR报告中的检查点统计
-
[ ] 检查重做日志切换频率
-
[ ] 验证增量检查点推进情况
性能优化指标
-
检查点完成时间:< fast_start_mttr_target的90%
-
日志切换频率:每小时2-4次为宜
-
latch争用率:< 1%
-
检查点相关等待时间:占总等待时间< 5%
7.7 故障处理与应急预案
常见问题处理
-
检查点不完全: 增加日志文件大小或组数
-
检查点时间过长: 优化I/O子系统性能
-
latch争用严重: 调整相关参数或升级硬件
应急响应流程
-- 紧急情况下手动触发检查点
ALTER SYSTEM CHECKPOINT;
-- 强制推进检查点
ALTER SYSTEM SWITCH LOGFILE;
1万+

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



