在Oracle内部,SCN分为两部分存储,分别称之为scn wrap和scn base。实际上SCN长度为48位,即它其实就是一个48位的整数。只不过可一. scn 说明之前也整理过几遍Oracle SCN的文章,如下:Oracle DB 服务器系统时间修改问题 与SCN 关系的深入研究Oracle Blockscn/commit scn/cleanout scn 说明RedoLogCheckpoint 和 SCN关系这里在稍微小总结一下。
我们可以使用如下SQL 查看Oracle 的SCN:SQL> select CURRENT_SCN from v$database;CURRENT_SCN-----------3713849上述结果返回的是一串数字。
但实际上,Oracle 在内部并不是用数字来存储SCN的。
在Oracle内部,SCN分为两部分存储,分别称之为scn wrap和scn base。实际上SCN长度为48位,即它其实就是一个48位的整数。只不过可能是由于在早些年通常只能处理32位甚至是16位的数据,所以人为地分成了低32位(scnbase)和高16位(scn wrap)。
为什么不设计成64位,这个或许是觉得48位已经足够长了并且为了节省两个字节的空间:)。那么SCN这个48位长的整数,,最大就是2^48(2的48次方, 281万亿,281474976710656),很大的一个数字了。
这里有一个重要的公式:
SCN= (SCN_WRP * 4294967296) + SCN_BAS根据上面的公式,可以计算出SCN的数据值。
在很多与我们事务相关的记录中都是记录SCN WRAP 和 SCN BASE.
SQL> select START_SCNB,START_SCNW from v$transaction;SQL> desc smon_scn_time Name Null? Type------------------------------------------------- ----------------------------THREAD NUMBER TIME_MP NUMBER TIME_DP DATE SCN_WRP NUMBER SCN_BAS NUMBER NUM_MAPPINGS NUMBER TIM_SCN_MAP RAW(1200) SCN NUMBER ORIG_THREAD NUMBER包括在我们Data block 的内部,也是使用SCN WRP 和 SCN BASE的。
二.测试案例我们这里用Data File 1 上的DataBlock 92967为例。
BBED> show FILE# 1 BLOCK# 92967 OFFSET 0 DBA 0x00416b27 (4287271 1,92967) FILENAME /u01/app/oracle/oradata/dave/system.256.816661027 BIFILE bifile.bbd LISTFILE /u01/filelist.txt BLOCKSIZE 8192 MODE Edit EDIT Unrecoverable IBASE Dec OBASE Dec WIDTH 80 COUNT 8192 LOGFILE log.bbd SPOOL No BBED> p kcbh struct kcbh, 20 bytes @0 ub1 type_kcbh @0 0x06 ub1 frmt_kcbh @1 0xa2 ub1 spare1_kcbh @2 0x00 ub1 spare2_kcbh @3 0x00 ub4 rdba_kcbh @4 0x00416b27 ub4 bas_kcbh @8 0x003566cc ub2 wrp_kcbh @12 0x0000 ub1 seq_kcbh @14 0x01 ub1 flg_kcbh @15 0x04 (KCBHFCKV) ub2 chkval_kcbh @16 0xc36e ub2 spare3_kcbh @18 0x0000 Block Dump 的结果:
