检查点队列简单总结

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 检查点是恢复的起启点。

1、Oracle日志原理
REDO流(重做日志流)
RBA (重做字节地址由4部分组成:日志线程号、日志序列号、日志文件块编号和日志文件字节偏移量,长度为10个字节.例如Thread:1 RBA:0x000014.00000003.0010)
ckpt equeue :1.每3秒会触发检查脏块,2.每3秒检查ckpt equeue头的RBA,把检查队列头RBA写到控制文件)

  作用:(1).统计脏数据块
       (2).RBA按顺序排序,刷数据到磁盘就按这顺序
       (3).每个RBA除指向下一个RBA,还指向脏数据块地址

2、检查点队列(检查点只是一个数据库事件,它存在的根本意义在于减少崩溃恢复时间),在BH中有一个ckptq项,双向链表.
(1)只有脏块才会在检查点队列中,非脏块的ckptq为空。
(2)当块首次被更改时,块会立即被加进检查点队列。 如果检查点队列中的脏块再次被修改,并不会改变其在
检查点队列中的位置。
(3)检查点队列中脏块的排列顺序:根据第2点,所有脏块按照首次被更改的时间的顺序排列。 更准确点说:按
照块的lrba排列。

3、什么是RBA?LRBA?HRBA?ON DISK RBA?
(1)RBA:就是重做块地址
(2)LRBA:第一次对此数据块修改对应的Redo Block Address的顺序排列
(3)HRBA:相对于LRBA,后面修改的RBA
(4)on disk rba:磁盘中重做日志文件的最后一条重做记录的rba,是最高的重做值。

4、参与检查点的进程主要包括lgwr、dbwn和ckpt,分为两大类:完全检查点和增量检查点
(1)完全检查点主要包括以下步骤:
 ①首先,在日志缓冲中确定当前的(也就是最新的)重做记录,提取其RBA与SCN作为检查点目标
 ②LGWR清空日志缓存,将重作记录写入在线日志
 ③DBWn进程将检查点目标(RBA与SCN)产生的及检查点目标之前产生的脏数据块,按RBA的顺序写入数据文件
 ④最后,CKPT进程将检查点目标(RBA与SCN)写入数据文件的头部和控制文件

(2)触发完全检查点的条件:

①执行shutdown immediate命令
②执行alter system checkpoint命令
③LGWR切换在线日志,不论是因为日志写满还是执行alter system switch logfile命令
④执行部分表空间维护命令:alter tablespace ...offline|online|begin backup|end backup|read only|read write

5、增量检查点并不会去更新数据文件头,而只是每3秒由CKPT进程去更新控制文件中的LRBA和SCN
(1)增量检查点主要包含以下步骤

①CKPT每3秒一次记录检查点位置的工作(更新控制文件)
②CKPT定期触发DBWR

(2)增量检查点的意义有以下两个:
①减少发生完全检查点时DBWn进程的工作负担
②提高实例恢复的速度

6、CHECKPOINT 优化
(1)从9I开始CHECKPOINT的优化大大简化了

设置FAST_START_MTTR_TARGET
   较大的值:恢复时间较长
   较小的值:增加IO负载

(2)10g 的CHECKPOINT的自动优化
fast_start_mttr_target设置为非零的值或者不设置


show parameter mttr
alter system checkpoint;
alter system switch logfile;
select file#,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi:ss') cpt from v$datafile;
select file#,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi:ss') cpt from v$datafile_header;
select dbid,checkpoint_change# from v$database;
select group#,sequence#,status,first_change#,next_change# from v$log;
alter session set events 'immediate trace name controlf level 8';//CKPT每3秒写进控制文件的信息
grep "low cache rba" test_ora_22708.trc
/ low cache rba:(0x51.bef8.0)[检查点位置] on disk rba:(0x51.bf36.0)[最后一条重做记录的rba] /
alter session set events 'immediate trace name buffers level 2'; //BH(脏块)上有CHPTQ和FILEQ,非脏块为NULL
grep ckptq test_ora_22468.trc |grep -v NULL
grep ckptq test_ora_22468.trc

  /* ckptq: [0x60be41a8,0x60bf9d98] fileq: [0x60be41b8,0x60bf9da8]
    ckptq: [NULL] fileq: [NULL] */

alter session set events 'immediate trace name file_hdrs level 10';//控件文件与数据文件头
/* DATA FILE #5 控制文件

    V10 STYLE FILE HEADER: 数据文件头
 status:0x4 root dba:0x00000000 chkpt cnt: 106 ctl cnt:105*/
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
消息中间件 监控 安全
服务Down机了,线程池中的数据如何保证不丢失?
在分布式系统与高并发应用开发中,服务的稳定性和数据的持久性是两个至关重要的考量点。当服务遭遇Down机时,如何确保线程池中处理的数据不丢失,是每一位开发者都需要深入思考的问题。以下,我将从几个关键方面分享如何在这种情况下保障数据的安全与完整性。
80 2
|
2月前
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
124 62
|
4月前
|
消息中间件 存储 Java
服务重启了,如何保证线程池中的数据不丢失?
【8月更文挑战第30天】为确保服务重启时线程池数据不丢失,可采用数据持久化(如数据库或文件存储)、使用可靠的任务队列(如消息队列或分布式任务队列系统)、状态监测与恢复机制,以及分布式锁等方式。这些方法能有效提高系统稳定性和可靠性,需根据具体需求选择合适方案并进行测试优化。
268 5
|
5月前
|
存储 监控 Java
|
8月前
|
分布式计算 Java Hadoop
NameNode 处理线程配置(心跳并发)
NameNode线程池处理客户端和数据节点请求,如读写文件及心跳、块报告。通过调整`dfs.namenode.handler.count`(默认10,示例设为21)在`hdfs-site.xml`中可控制并发处理能力。线程数过多或过少都可能影响性能,需平衡资源使用并进行基准测试以确定最佳值。合理线程数可通过公式`int(math.log(N) * 20)`计算,N为服务器数量。例如,3台服务器的计算结果为21。
211 4
|
8月前
|
消息中间件 运维 监控
【Kafka】分区副本什么情况下会从 ISR 中剔出
【4月更文挑战第12天】【Kafka】分区副本什么情况下会从 ISR 中剔出
|
8月前
|
Java
提交任务时,线程池队列已满,这时会发生什么
提交任务时,线程池队列已满,这时会发生什么
|
分布式计算 Java 调度
21 MapTask并行度决定机制
21 MapTask并行度决定机制
72 0
|
消息中间件
死信队列和延迟队列的介绍
死信队列和延迟队列的介绍