About Oracle SCN序列号相关

0、工作中用到SCN分析数据异常原因现象

OLTP系统中业务数据在业务定义时间字段之后写入库中,当OLAP系统在按照业务时间做增量抽取时出现数据未取到异常:

SELECT to_char(scn_to_timestamp(ora_rowscn),'yyyy/mm/dd hh24:mi:ss') AS 数据写入时间,
	   to_char(t.trans_time,'yyyy/mm/dd hh24:mi:ss') AS 业务时间,
	   t.trans_type,t.* 
FROM wip_lot_his t 
WHERE t.org_rrn='11' AND t.lot_id='C41A8A137860' AND t.trans_type LIKE 'TRACK%'

问题产生原因及调整方案:ETL自动调度未整点时间(根据OLTP的业务时间字段),当出现数据延迟入库时,导致数据错过调度时间段,最简单调整,调整ETL调度触发时间往后一些,保证源数据写入完成。

1、在Oracle中,SCN是什么?

SCN(System Change Number,系统改变号)是一个由系统内部维护的序列号,在数据库全局是唯一的。当系统需要更新的时候自动增加,它是系统中维持数据的一致性和顺序恢复的重要标志,是数据库中非常重要的一种数据结构。在数据库中,SCN作为一种时钟机制来标记数据库动作,比如,当事务发生时,数据库会用一个SCN来标记它。SCN是在某个时间点定义数据库已提交版本的时间戳标记,Oracle为每个已提交的事务分配一个唯一的SCN。SCN的值是对数据库进行更改的逻辑时间点。SCN是一个只会增加、不会减少的数字。
在数据库中,SCN可以说是无处不在,例如数据文件头、控制文件、数据块头、日志文件等等都标记着SCN。也正因为如此,数据库的一致性维护和SCN密切相关。不管是数据的备份还是恢复都离不开SCN。由于SCN描述的是数据一致性的状态,所以,它会在各种涉及数据一致性的场合中起到重要作用。
SCN的组成

  • SCN是一个6字节(48bit)的数字,其值为281,474,976,710,656(2^48 ),分为2个部分:SCN_BASE和SCN_WRAP。SCN_BASE是一个4字节(32bit)的数字,而SCN_WRAP是一个2字节(16bit)的数字。每当SCN_BASE达到其最大值(2^32 = 4294967296)时,SCN_WRAP增加1,SCN_BASE将被重置为0,一直持续到SCN_WRAP达到其最大值,即2^16 = 65536。
  • SCN =(SCN_WRAP * 4294967296)+ SCN_BASE
  • SCN随着每个事务的完成而增加。提交不会写入数据文件,也不更新控制文件。当发生checkpoint时,控制文件更新,SCN被写入到控制文件。

2、在Oracle中,SCN可以分为哪几类?

严格来说SCN是没有分类的,之所以会有不同类型的SCN,并不是说这些SCN的概念不一样,而是说不同分类的SCN代表的意义不一样,不管什么时候,SCN所指代的都是数据库的某个一致性的状态。
与Checkpoint相关的SCN可以分为4类,系统检查点SCN(System Checkpoint SCN)、文件检查点SCN(Datafile Checkpoint SCN)、开始SCN(Start SCN)和结束SCN(Stop SCN),参考下表:
表 SCN的分类:
在这里插入图片描述
与Checkpoint无关的SCN可以分为日志文件SCN(Lowest SCN in the log)和当前系统SCN。查询日志文件SCN的SQL如下所示:

SELECT THREAD#,GROUP#,SEQUENCE#,STATUS,FIRST_CHANGE#,SCN_TO_TIMESTAMP(FIRST_CHANGE#)+0,FIRST_TIME FROM V$LOG;

查询当前系统的SCN号的SQL如下所示:

SELECT CURRENT_SCN SCN1,DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER SCN2,TIMESTAMP_TO_SCN(SYSDATE) SCN3 FROM V$DATABASE;

为什么Oracle在控制文件中记录System checkpoint SCN号的同时,还需要为每个数据文件记录Datafile Checkpoint SCN?原因有两点:

  1. 如果有表空间是READ ONLY模式的话,那么该表空间的所有datafile的start SCN和stop SCN将被冻结,这个时候就跟System Checkpoint SCN不一致,但在库open的时候是不需要做media recovery的,如果没有DatafileCheckpoint SCN就无法判断这些datafile是否是最新的。
  2. 如果控制文件不是当前的控制文件,那么System Checkpoint会小于Start SCN或End SCN号。记录这些SCN号,可以区分控制文件是否是当前的控制文件。

如何查看系统当前SCN

  • Oracle数据库提供了两种直接查看系统当前SCN的方法,一个是通过查询V$DATABASE中的CURRENT_SCN列,另外一个就是通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER得到,如下所示:
  • 一般情况下,SCN1列和SCN2列的结果一致,但在系统比较繁忙的时候,可能SCN2比SCN1稍微大一点。
    SYS@lhrdb> COL SCN1 FOR 9999999999999
    SYS@lhrdb> COL SCN2 FOR 9999999999999
    SYS@lhrdb> COL SCN3 FOR 9999999999999
    SYS@lhrdb> SELECT CURRENT_SCN SCN1,DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER SCN2,TIMESTAMP_TO_SCN(SYSDATE) SCN3 FROM V$DATABASE;
             SCN1           SCN2       SCN3
    -------------- -------------- ----------
       1495460388     1495460388 1495460387
    
  • 一般情况下,SCN1列和SCN2列的结果一致,但在系统比较繁忙的时候,可能SCN2比SCN1稍微大一点。

1、2部分文章链接:https://mp.weixin.qq.com/s/Zmx7bWePLNeBG3bjaFVqNw

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值