当前位置:  数据库>oracle

Oracle SCN 深入研究

    来源: 互联网  发布时间:2017-05-25

    本文导语: 一. SCN 说明 之前也整理过几遍Oracle SCN的文章,如下: Oracle DB 服务器系统时间修改问题 与SCN 关系的深入研究 Oracle Blockscn/commit scn/cleanout scn 说明 RedoLogCheckpoint 和 SCN关系 这里在稍微小总结一下。 我们可以使用如下SQL 查看Oracl...

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

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。


    
 
 

您可能感兴趣的文章:

  • 深入oracle特定信息排序的分析
  • 深入理解Oracle数据库的启动和关闭
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • 深入解析Oracle参数及参数文件
  • 深入探讨:Oracle中如何查询正锁表的用户以及释放被锁的表的方法
  • Oracle表连接深入浅出
  • 深入剖析哪些服务是Oracle 11g必须开启的
  • 深入分析关于Oracle数据库的备份策略
  • [Oracle] RAC 之 - 负载均衡深入解析
  • Oracle 9i数据库中动态重配置深入分析
  • 深入ORACLE变量的定义与使用的详解
  • oracle日期时间型timestamp的深入理解
  • Oracle中RAISE异常深入分析
  • 深入Oracle的left join中on和where的区别详解
  • oracle 索引不能使用深入解析
  • oracle的rownum深入解析
  • 深入探讨:oracle中row_number() over()分析函数用法
  • 深入ORACLE迁移到MYSQL的总结分析
  • 深入oracle分区索引的详解
  • 深入sql oracle递归查询
  • 安全研究专家发现访问Oracle数据库的新攻击方法
  • Oracle数据完整性嵌套事务调用分析研究
  • Oracle中虚拟专用数据控制方法研究
  • Oracle数据库的备份及恢复策略研究
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • 网络技术 iis7站长之家
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,