在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 的结果: