oracle的增量检查点与block buffer

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 通过dump工具分析oracle的增量检查点机制

增量检查点

  首先本文不会作过多的概念描述,对于增量检查点机制,其实在任何关系型数据库里都会存在。从事务的持久性角度来看,他的目的也是显而易见的,即保证数据块的正常刷新以及崩溃恢复,那么检查点其实也就是对数据块刷新情况的一个位点记录,至于通过什么形式记录,不同的数据库各有差异。因此,要想实现日志预写协议,检查点机制是必不可少的。

dump控制文件

  oracle里的增量检查点是由ckpt进程维护在控制文件里的,这里我们借助trace从控制文件头部找到相关信息。

SQL> alter session set events 'immediate trace name controlf level 2';

Session altered.

接下来查看trace文件,
clipboard
向下寻找出本次dump结果里的checkpoint信息,如下,

***************************************************************************
CHECKPOINT PROGRESS RECORDS
***************************************************************************
 (size = 8180, compat size = 8180, section max = 11, section in-use = 0,
  last-recid= 0, old-recno = 0, last-recno = 0)
 (extent = 1, blkno = 2, numrecs = 11)
THREAD #1 - status:0x2 flags:0x0 dirty:43
low cache rba:(0x211.43f.0) on disk rba:(0x211.540.0)
on disk scn: 0x0000.0073a315 08/14/2015 20:31:34
resetlogs scn: 0x0000.001a002c 08/04/2015 16:38:12
heartbeat: 887720057 mount id: 2580966972

  那么,这里注意几个关键信息.。

low cache rba    最早的脏块对应的日志地址
on disk rba    redolog中最后一条日志所在的地址
on disk scn    LGWR每写完日志,会更新这个值
heartbeat    控制文件每被修改一次,heartbeat增加一次

  我们不难发现,low cache rba与on disk rba之间的日志对应当前数据库中已提交的脏块。而checkpoint主要的功能,也是维护这两个地址。如果此时发生断电,这里就是进行崩溃恢复的依据。

从脏块查看LRBA

SQL> alter system dump datafile 1 block 178440;

System altered.

该操作会dump出磁盘中的数据块、对应的dirty buffer及CR块。
接下来查看刚生成的dump文件,

[oracle@oracle11g trace]$ pwd 
/u01/app/oracle/diag/rdbms/oracle11g/oracle11g/trace 
[oracle@oracle11g trace]$ vim oracle11g_ora_2564.trc

78782bc3f429a0fe836a0153ee05a18975a74e1f

这里需要关注的关键信息如下,

rdba:  数据块地址
ST:    CR/XCURRENT(CR块/当前块)
current块lru:  LRUW链上下指针
ckptq:        检查点队列上下成员指针 
LRBA:        这个脏块第一次被修改时的redo日志地址。为空值表示对应日志还未写入磁盘
LSCN、HSCN:  构造这个脏块所需日志的SCN。为空值表示对应日志还未写入磁盘
cr:[scn:]  构造CR块的SCN号
xid、uba:    构造CR块时读取的undo数据的xid及undo数据块地址

  那么这里,我们看到的是同一个block在buffer中的两种状态,即CR块和XCURRENT块,对于CR块记录的是事务号以及undo块的地址,对于XCURRENT块记录的则是redo日志相关的信息。需要注意的一点是,dirty buffer里的lrba与控制文件中lrba的意义是不一样的,dirty buffer中的记录只会关心与此buffer相关的redo log,而控制文件中的lrba是针对整个buffer cache中的dirty buffer。
  另外,这里还有一个信息,就是ckptq(检查点队列),检查点队列由ckpt进程去维护。dbwr进程沿着此队列进行刷新工作,ckpt进程检查此队列完成向控制文件中的检查点信息维护。

  除buffer之外,trace文件中的block信息如下,
clipboard

rdba:  数据块的地址
scn:   最近写入磁盘的SCN号

  对于DBWR,每次刷新脏块后,会去维护这个block的SCN号,代表这个block的数据版本。

比对事务槽信息

  对于前面dump出来的CR块信息,可以通过查看事务槽的信息来做比对验证。
clipboard
这里我们所关注的uba地址以及xid完全吻合。

ps,关于undo机制以及事务槽的分析,可参考博文:Oracle undo机制拙见

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
存储 Oracle 关系型数据库
|
4月前
|
Oracle 关系型数据库 数据库
关系型数据库Oracle增量备份
【7月更文挑战第18天】
51 2
|
4月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在online模式下增量抓取Oracle数据时,在archive_log切换时,出现数据丢失的情况,是什么原因
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
SQL DataWorks Oracle
DataWorks产品使用合集之datax解析oracle增量log日志该如何操作
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
58 0
|
5月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之同步oracle表时,数据量约800万,检查点异常,该如何排查
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
存储 SQL 监控
Oracle BCT(Block Change Tracking)与增量备份---发表在数据和云
BCT(Block Change Tracking)是Oracle从10g开始有的特性。BCT的原理是记录数据文件里每个数据块的变化,并把这些变化信息保存在BCT的跟踪文件中。
398 0
|
SQL 分布式计算 运维
【大数据开发运维解决方案】Sqoop增量同步mysql/oracle数据到hive(merge-key/append)测试文档
上一篇文章介绍了sqoop全量同步数据到hive, 本片文章将通过实验详细介绍如何增量同步数据到hive,以及sqoop job与crontab定时结合无密码登录的增量同步实现方法。
【大数据开发运维解决方案】Sqoop增量同步mysql/oracle数据到hive(merge-key/append)测试文档
|
SQL 分布式计算 运维
【大数据开发运维解决方案】sqoop增量导入oracle/mysql数据到hive时时间字段为null处理
前面几篇文章详细介绍了sqoop全量增量导入数据到hive,大家可以看到我导入的数据如果有时间字段的话我都是在hive指定成了string类型,虽然这样可以处理掉时间字段在hive为空的问题,但是在kylin创建增量cube时需要指定一个时间字段来做增量,所以上面那种方式不行,这里的处理方式为把string改成timestamp类型,看实验:
【大数据开发运维解决方案】sqoop增量导入oracle/mysql数据到hive时时间字段为null处理
|
SQL 运维 Oracle
【大数据开发运维解决方案】Sqoop增量同步Oracle数据到hive:merge-key再次详解
这篇文章是基于上面连接的文章继续做的拓展,上篇文章结尾说了如果一个表很大。我第一次初始化一部分最新的数据到hive表,如果没初始化进来的历史数据今天发生了变更,那merge-key的增量方式会不会报错呢?之所以会提出这个问题,是因为笔者真的有这个测试需求,接下来先对oracle端的库表数据做下修改,来模拟这种场景。
【大数据开发运维解决方案】Sqoop增量同步Oracle数据到hive:merge-key再次详解
|
canal SQL Oracle
新的增量数据同步工具闪亮登场,完美支持Oracle增量同步
新的增量数据同步工具闪亮登场,完美支持Oracle增量同步
新的增量数据同步工具闪亮登场,完美支持Oracle增量同步