知识大全 数据文件internal分析

Posted

篇首语:幽沉谢世事,俯默窥唐虞。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据文件internal分析相关的知识,希望对你有一定的参考价值。

  众所周知 Oracle的数据是储存在数据文件中的 那么Oracle是以什么格式来储存数据的呢?相信大家都对其内部结构很感兴趣 这篇文章就帮大家来了解Oracle数据文件的内部结构 我们知道数据库储存的最小单位是数据块 其他如extent segment tablespace等都是由数据块组成 所以我们就从数据块的结构来分析

  典型的数据块由 部分构成

   .      头信息区  

   .          这个区包括数据块的地址 数据块类型 检查点信息 scn信息 数据块版本号等 (以下是其大概的构造 稍后会做解释)

  ―――――――――――――――――――――――――――

  *** : :

   Start dump data blocks tsn: file#: minblk maxblk

  buffer tsn: rdba: x c ( / )

  scn: x d seq: x flg: x tail: x d

  frmt: x cval: x type: x =trans data

  Block header dump:   x c

  Object id on Block? Y

  seg/obj: x   csc: x d   itc:   flg: O  typ: – DATA

  fsl:   fnx: x ver: x

  ――――――――――――――――――――――――――――

   .  事务列表区

  事务列表去包括了在这个数据块内的事务 也就是我们知道的ITL(interested transaction list) 从中我们可以知道XID(transaction id) UBA(undo block address)等信息(以下是其大概的构造 稍后会做解释)

  Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

   x    xid:   x     uba: x c           fsc x

   .  数据区 尾区

  数据区顾名思义是真正存储数据的地方 在这里我们可以看到每一条记录 至于尾区 这里储存着数据块的版本号 与数据头信息区的版本号相对应 可以用来确定数据块前后是否一致

  (以下是其大概的构造 稍后会做解释)

  ―――――――――――――――――――――――――――

  data_block_dump

  ===============

  tsiz: x fb

  hsiz: x

  pbl: x f f

  bdba: x c

  flag=

  ntab=

  nrow=

  frre=

  fsbo= x

  fseo= x fb

  avsp= x f b

  tosp= x f b

   xe:pti[ ]  nrow=   offs=

   x :pri[ ]  offs= x fb

  block_row_dump:

  tab row @ x fb

  tl: fb: H FL lb: x cc:

  col   : [ ]  c (数据就在这里)

  end_of_block_dump

  End dump data blocks tsn: file#: minblk maxblk

  ―――――――――――――――――――――――――――

  下面我们来做一个完整的实验 首先创建一个新的表空间

    

  SQL> create tablespace testblock datafile d:\\oracle\\oradata\\test\\testblock ora

  size m ;

  

  表空间已创建

  

  创建一个新用户并指定默认表空间为testblock 临时表空间为temp  

  SQL> create user testblock identified by testblock default tablespace testblocktemporary tablespace temp;

  

  用户已创建

  SQL> grant create session to testblock;

  

  授权成功

  SQL> grant resource to testblock;

    

  授权成功

  SQL> connect testblock/testblock@test

  已连接

  SQL> create table testblock (a number);

  

  表已创建

  SQL> insert into testblock values( );

  

  已创建 行

  

  SQL> insert into testblock values( );

  

  已创建 行

  SQL> mit;

    

  提交完成

  SQL> connect internal/oracle@test

  已连接

  SQL> select header_file header_block from dba_segments where segment_name= TESTBLOCK ;

  

  HEADER_FILE HEADER_BLOCK

  

     

  从这里我们知道testblock表所在的数据文件号是 数据头块号是 下面我们dump出数据块来看下

  ――――――――――――――――――――――――――――――――――  *** : :

  *** SESSION ID:( ) : :

   Start dump data blocks tsn: file#: minblk maxblk

  buffer tsn: rdba: x c ( / )

  scn: x eb seq: x flg: x tail: x eb

  frmt: x cval: x type: x =DATA SEGMENT HEADER – UNLIMITED

  Extent Control Header

  

  Extent Header:: spare :       space :       #extents:       #blocks:       

  last map   x   #maps:       offset:   

  Highwater::   x c   ext#:       blk#:       ext size:       

  #blocks in seg hdr s freelists:       

  #blocks below:       

  mapblk   x   offset:       

  Unlocked

  Map Header:: next   x   #extents:     obj#:   flag: x

  Extent Map

  

   x c   length:       

  nfl = nfb = typ = nxf =

  SEG LST:: flg: USED   lhd: x c ltl: x c   

  End dump data blocks tsn: file#: minblk maxblk

  ――――――――――――――――――――――――――――――――――

  这里我们看到表空间号是tsn: 数据文件号是file#: 相对数据块地址是rdba: x c ( / ) SCN为scn: x eb(SCN Base= SCN Wrap= eb) 尾区版本号为tail: x eb (tail=SCN Wrap: eb + type: x + seq: x ) 由于这个块是整个Segment的头 所以它还包含整个Segment的一些存储信息 比如extent数 block数 高水位地址 Highwater::   x c 自由列表信息hdr s freelists: 等等 如果才用本地管理表空间 则此块的存储信息通过位图方式管理

  真正的数据是储存在下一个块也就是 x c + = x c 我们来看看究竟

  ――――――――――――――――――――――――――――――――――

  *** : :

   Start dump data blocks tsn: file#: minblk maxblk

  buffer tsn: rdba: x c ( / )

  scn: x ee seq: x flg: x tail: x ee

  frmt: x cval: x type: x =trans data

  

  Block header dump:   x c

  Object id on Block? Y

  seg/obj: x b  csc: x eb  itc:   flg: O  typ: DATA      fsl:   fnx: x ver: x

    Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

   x    xid:   x f da    uba: x ad ae    U        fsc x ee

  data_block_dump

  ===============

  tsiz: x fb

  hsiz: x

  pbl: x ec

  bdba: x c

  flag=

  ntab=

  nrow=

  frre=

  fsbo= x

  fseo= x fac

  avsp= x f

  tosp= x f

   xe:pti[ ]  nrow=  offs=

   x :pri[ ]  offs= x fb

   x :pri[ ]  offs= x fac

  block_row_dump:

  tab row @ x fb

  tl: fb: H FL lb: x cc:

  col   : [ ]  c

  tab row @ x fac

  tl: fb: H FL lb: x cc:

  col   : [ ]  c

  end_of_block_dump

  End dump data blocks tsn: file#: minblk maxblk

  ――――――――――――――――――――――――――――――――――

  谜团解开了 ITL 数据都呈现出来了 开始分析!

  Block header dump:   x c

  Object id on Block? Y

  seg/obj: x b  csc: x eb  itc:   flg: O  typ: DATA      fsl:   fnx: x ver: x

  数据块地址正是 x c + = x c

  segment/object id为 x b 转成 进制为 可以由obj#表中得知SQL> select obj# from sys obj$ where name= TESTBLOCK ;       OBJ#

  

  

  csc(SCN at last Block CleanOut): x eb表示最后一次块清除(Block CleanOut)时候的SCN 关于块清除的概念可以查阅Thomas Kyte 著的 expert one by one Oracle

  itc: 表示Number of itl slots

  flg: O 表示此块被放置在自由列表(freelist)中

  typ: – DATA 类型 表示数据 类型 表示索引

  fsl: ITL TX FREELIST SLOT  fnx: x 自由列表中下一块的地址

  ――――――――――――――――――――――――――――――――――

  Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

   x    xid:   x f da    uba: x ad ae    U        fsc x ee

  这个事务列表中当前有一个事务 里面记载着slot号 事务id undo block address 受影响的行数 事务递交时的scn等

  Itl slot = x   

  事务id= xid:   x f da

  由于xid由 部分组成 xid= Undo Segment Number +Transaction Table Slot Number+ Wrap 得到

   x – Undo Segment Number   f – Transaction Table Slot Number da– Wrap  

  回滚块地址=uba: x ad ae

  由于uba由 部分组成 uba= Address of the last undo block used+ Sequence+ Last Entry in UNDO record map得到

   x ad – Address of the last undo block used   ae– Sequence – Last Entry in UNDO record map  

  

  flag标志我引用 au的一段解释 这里的 U 表示已经递交

   = transaction is active or mitted pending cleanout

  C = transaction has been mitted and locks cleaned out

   B = this undo record contains the undo for this ITL entry

   U = transaction mitted (maybe long ago); SCN is an upper bound

   T = transaction was still active at block cleanout SCN

  Lck(number of rows affected by this transaction)表示这个事务所影响的行数 这里是 行 正好对应 次insert

  

  Scn/Fsc 标志我引用 au的一段解释If the transaction has been cleaned out this is the mit SCN or an upper bound thereof Otherwise the leading o bytes contain the free space credit for the transaction that is the number of bytes freed in the block by the transaction

  ―――――――――――――――――――――――――――――――――――――――

  data_block_dump

  ===============

  tsiz: x fb

  hsiz: x

  pbl: x ec

  bdba: x c

  flag=

  ntab=

  nrow=

  frre=

  fsbo= x

  fseo= x fac

  avsp= x f

  tosp= x f

   xe:pti[ ]  nrow=   offs=

   x :pri[ ]  offs= x fb

   x :pri[ ]  offs= x fac

  ―――――――――――――――――――――――――――――――――――――――――

  这一部分记载着一些储存参数 简单得分析一些 给出各个标志的解释

  tsiz:Total Data Area Size(数据块的大小)

  hsiz:Data Header Size(数据块头大小)

  pbl: ptr to buffer holding the block(指向这个数据块在内存中映象的指针)

  bdba: block dba / rdba(数据块地址)

  flag: n=pctfree hit (clusters) f=dont put on freelist k=flushable cluster keys

  ntab: number of tables (> is a cluster)

  nrow: number of rows

  frre: first free row index entry =you have to add one(没有创建索引)

  fsbo: free space begin offset(从hsiz开始)

  fseo: free space end offset()

  avsp: available space in the block(可用空间)

  tosp: total available space when all txs mit

   xe:pti[ ]  nrow=   offs= 本块储存 条记录

   x :pri[ ]  offs= x fb 记录的起始物理位置

    

  ―――――――――――――――――――――――――――――――――――――――――

  终于见到到数据了 这个部分就存储著对应的记录 继续分析

  block_row_dump:

  tab row @ x fb   

  tl: fb: H FL lb: x cc:   

  ol   : [ ]  c

  tab row @ x fac

  tl: fb: H FL lb: x cc:

  col   : [ ]  c

  end_of_block_dump

  End dump data blocks tsn: file#: minblk maxblk

  ―――――――――――――――――――――――――――――――――――――――

  tl表示Row Size(number of bytes plus data)

  fb:Flag Byte

  H head of row piece

  F first data piece  

  L last data piece  

  Lb表示lock byte 表示这个事务在itl的入口

  Cc表示number of columns in this Row piece 表示这一行只有 列

  col   : [ ]  c 第一列 [ ]表示长度 c 是数据(经过一套复杂的过程可以转换成 进制数据)

cha138/Article/program/Oracle/201311/18775

相关参考

知识大全 管理好密码文件对执行数据库管理的重要性[2]

  要进行此项授权操作需使用SYSDBA权限(或INTERNAL帐号)连入数据库且初始化参数REMOTE_LOGIN_PASSWORDFILE的设置必须为EXCLUSIVE具体操作步骤如下  创建相应

知识大全 深入分析Oracle数据库日志文件(2)

深入分析Oracle数据库日志文件(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  四如何利

知识大全 深入分析Oracle数据库日志文件(1)

深入分析Oracle数据库日志文件(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作为Or

知识大全 在Oracle中实现数据库的复制

在Oracle中实现数据库的复制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Interne

知识大全 BARE INTERNATIONAL是正规公司吗

BAREINTERNATIONAL是正规公司吗?在美国真的有这家神秘顾客公司吗?做神秘顾客不需要承担法律责任吗?  以下文字资料是由(本站网www.cha138.com)

知识大全 戴尔笔记本电脑连上wifi显示无interner

戴尔笔记本电脑连上wifi显示无interner可以通过以下方法解决问题:1、连接的无线WiFi没有流量。戴尔笔记本电脑连不上wifi解决方法:方法1路由器的无线加密码是WAP2的,而WinXPsp2

知识大全 internal heap limit reached问题的解决

  编译朋友一个程序pilerlimitinternalheaplimitreacheduse/Zmtospecifyahigherlimit  上网搜索了一下意思是超过内部默认分配的堆的限制解决办法

甲方和乙方采用公钥密码体制对数据文件进行加密传送,甲方用乙方的公钥加密数据文件,乙方要对数据文件进行解密应该使用__

甲方和乙方采用公钥密码体制对数据文件进行加密传送,甲方用乙方的公钥加密数据文件,乙方要对数据文件进行解密应该使用_____。A、乙的公钥B、乙的私钥C、甲的公钥D、甲的私钥答案:B解析:公开密钥密码体

知识大全 如何恢复一个只有完好数据文件的数据库

在没有控制文件备份的情况下重新创建控制文件也是其中一个选择本文旨在帮助初学者学习之用谢谢!!  如何恢复一个只有完好数据文件的数据库?  本文欲将此数据文件恢复成数据库TTI实例名TTI  $ORAC

知识大全 在非归档模式下如何更改数据文件位置

  如果数据库处于非归档模式下可以通过如下步骤更改文件路径:    关闭数据库    系统级进行文件复制    启动数据库到mount状态    通过SQL修改数据文件位置    打开数据库    以