Oracle SCN 深入研究


一. SCN 说明

之前也整理过几遍Oracle SCN的文章,如下:

Oracle DB 服务器系统时间修改问题 与SCN 关系的深入研究

http://blog.csdn.net/tianlesoftware/article/details/6163859

Oracle Blockscn/commit scn/cleanout scn 说明

http://blog.csdn.net/tianlesoftware/article/details/6660530

Oracle SCNheadroom、ORA-19706 和_external_scn_rejection_threshold_hours 参数 说明

http://blog.csdn.net/tianlesoftware/article/details/8164455

RedoLogCheckpoint 和 SCN关系

http://blog.csdn.net/tianlesoftware/article/details/5251916

这里在稍微小总结一下。

我们可以使用如下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

------------------------------------------------- ----------------------------

THREADNUMBER

TIME_MPNUMBER

TIME_DPDATE

SCN_WRPNUMBER

SCN_BASNUMBER

NUM_MAPPINGS NUMBER

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

Start dump data blocks tsn: 0 file#:1minblk 92967 maxblk 92967

Block dump from cache:

Dump of buffer cache at level 4 for tsn=0rdba=4287271

Block dump from disk:

buffer tsn: 0 rdba: 0x00416b27 (1/92967)

scn: 0x0000.003566cc seq: 0x01 flg: 0x04 tail: 0x66cc0601

frmt: 0x02 chkval: 0xc36e type: 0x06=transdata

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x00007FBE18328A00 to0x00007FBE1832AA00

7FBE18328A00 0000A206 00416B27 003566CC04010000 [....'kA..f5.....]

7FBE18328A10 0000C36E 00000001 00012965003566B8 [n.......e)...f5.]

......

7FBE1832A9F0 0144494C 014E014E 02C1024E66CC0601 [LID.N.N.N......f]

这里的SCN 是:0x0000.003566cc

初看这里估计很晕,在联系一下我们上面BBED的结果,就应该明白了。

ub4 bas_kcbh @8 0x003566cc

ub2 wrp_kcbh @12 0x0000

这里的SCN 格式是: SCNWRAP.SCN BASE.

我们用第一节讲的公式计算一下SCN:

SQL>select to_number('3566cc','xxxxxxx') from dual;

TO_NUMBER('3566CC','XXXXXXX')

-----------------------------

3499724

--系统当前的SCN 是:

SQL> select CURRENT_SCN from v$database;

CURRENT_SCN

-----------

3715593

我们的block修改时的SCN 是:

SCN= (0 * 4294967296) + 3499724 = 3499724

即,我们的block:92967 在修改时,对应的SCN 是3499724。

--------------------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

QQ: 251097186

Skype: tianlesoftware

Email: tianlesoftware@gmail.com

Blog: http://blog.csdn.net/tianlesoftware

Weibo: http://weibo.com/tianlesoftware

Twitter: http://twitter.com/tianlesoftware

Facebook: http://www.facebook.com/tianlesoftware

Linkedin: http://cn.linkedin.com/in/tianlesoftware


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值