1. 头信息区
  2. 这个区包括数据块的地址,数据块类型,检查点信息,scn信息等信息。
  3. ---------
  4. Start dump data blocks tsn: 7 file#: 5 minblk 16 maxblk 16
  5. buffer tsn: 7 rdba: 0x01400010 (5/16)
  6. scn: 0x0000.001732d3 seq: 0x01 flg: 0x04 tail: 0x32d30601
  7. frmt: 0x02 chkval: 0x84cb type: 0x06=trans data
  8. ---------
  9. buffer tsn:7 --该块对应的表空间号,这里是7号表空间。
  10. rdba: 0x01400010 (5/16) --相对数据块地址,表示该块为5号数据文件第16个块,用4个字节32位来表示,前10位为相对数据文件号,后22位为块号。01400010=0000 0001 0100 0000 0000 0000 0001 0000(二进制)
  11. 我们看到前10位转换成十进制就是5,后22位转换成十进制就是16rdba在数据块中的offset4,即rdba存在于数据块中的第5-9字节中(offset0开始算),数据块中的每个部分在数据块中的偏移量后边会通过BBED
  12. 示,这里可以先不关心。
  13. scn: 0x0000.001732d3 --数据块头部SCN,总共占用6个字节,前2个字节表示SCN Wrap,后4个字节表示SCN
  14. Base。如果SCN Base达到了4个字节表示的最大值,SCN Wrap+1SCN Base0。在数据块中的offset8
  15. seq: 0x01 --Sequence number, incremented for every change made to the block at the same SCN。这里可以理解为数据块的版本。在数据块中的offset14.
  16. flg: 0x04 --Flag: 0x01 New block/0x02 Delayed Logging Change advanced SCN/seq 0x04 Check value/saved - block XORs to zero/0x08 Temporary block 。在数据块中的offset15
  17. tail: 0x32d30601 --即tail check,存放于数据块的最后4个字节,用于数据块一致性检查。tail check的组成:
  18. SCN Base的低2个字节+type+seq。即tail: 0x32d30601=32d3+06+01
  19. frmt: 0x02 -- 块格式。01表示Oracle 7 02表示Oracle 8+
  20. chkval: 0x84cb --块检查值。我们知道如果参数DB_BLOCK_CHECKSUM=TRUE,那么数据块在读入buffer和写回数据文件之前都要做检查计算,如果计算值和数据块中记录的计算值不匹配就会标记该块是坏块。
  21. type: 0x06=trans data --块类型,参考一下表格:
  22. Header Block Types
  23. ID Type
  24. 01 Undo segment header
  25. 02 Undo data block
  26. 03 Save undo header
  27. 04 Save undo data block
  28. 05 Data segment header (temp, index, data and so on)
  29. 06 KTB managed data block (with ITL)
  30. 07 Temp table data block (no ITL)
  31. 08 Sort Key
  32. 09 Sort Run
  33. 10 Segment free list block
  34. 11 Data file header
  35. 数据区、空闲区
  36. 数据区是真正存储数据的地方 空闲区是目前块内部空闲空间
  37. Dump of memory from 0x0CEB6400 to 0x0CEB8400
  38. CEB6400 0000A206 01400010 001732D3 04010000 [......@..2......]
  39. CEB6410 000084CB 00000001 0000D2B8 001732D3 [.............2..]
  40. CEB6420 00000000 00320002 01400009 00200006 [......2...@... .]
  41. CEB6430 00000271 00800205 00130257 00008000 [q.......W.......]
  42. CEB6440 001732C4 00060008 00000279 00800351 [.2......y...Q...]
  43. CEB6450 00150278 00000001 00000000 00000000 [x...............]
  44. CEB6460 00000000 00030100 0018FFFF 1F651F5E [............^.e.]
  45. CEB6470 00001F65 1F5E0003 1F801F66 00000000 [e.....^.f.......]
  46. CEB6480 00000000 00000000 00000000 00000000 [................]
  47. Repeat 499 times
  48. CEB83C0 022C0000 02C10202 002C6101 03C10202 [..,......a,.....]
  49. CEB83D0 012C6201 03C10202 2C626202 C1020200 [.b,......bb,....]
  50. CEB83E0 61610202 0202002C 630104C1 0202002C [..aa,......c,...]
  51. CEB83F0 620103C1 0202002C 610102C1 32D30601 [...b,......a...2]
  52. 事物列表区
  53. 事务列表区包括了在这个数据块内的事务,也就是我们知道的ITL(interested transaction list),从中我们可以知道XIDtransaction id),UBA(undo block address)等信息。
  54. 事物列表区分析:
  55. --------------
  56. Block header dump: 0x01400010 --rdba
  57. Object id on Block? Y --该块是否属于某个对象
  58. seg/obj: 0xd2b8 csc: 0x00.1732d3 itc: 2 flg: E typ: 1 - DATA
  59. brn: 0 bdba: 0x1400009 ver: 0x01 opc: 0
  60. inc: 0 exflg: 0
  61.  
  62. Itl Xid Uba Flag Lck Scn/Fsc
  63. 0x01 0x0006.020.00000271 0x00800205.0257.13 C--- 0 scn 0x0000.001732c4
  64. 0x02 0x0008.006.00000279 0x00800351.0278.15 ---- 1 fsc 0x0000.00000000
  65. ---------------
  66. seg/obj: 0xd2b8 --该数据块中对象的object_id。前面我们dump的是表testblock,下边来验证一下:
  67. SQL> select to_number('d2b8','xxxxxx') from dual;
  68. TO_NUMBER('D2B8','XXXXXX')
  69. ------------------------------
  70. 53944
  71. SQL> select object_name,object_type from dba_objects where object_id=53944;
  72. OBJECT_NAME OBJECT_TYPE
  73. ------------------------------ --------------------
  74. TESTBLOCK TABLE
  75. csc: 0x00.1732d3 --SCN at last Block CleanOut,表示最后一次块清除(Block CleanOut)时候的SCN
  76. itc: 2 --块中ITL slot的数量,我们看下边的ITL,的确只有2slot
  77. flg: E --flg: 0 表示此块被放置在自由列表(freelist)中。
  78. typ: 1 - DATA --类型1表示数据,类型2表示索引
  79. bdba --Block relative data block address(RDBA)
  80. 下边我们重点看一下ITL事物槽。Oracle的每个数据块中都有一个或者多个事务槽,每一个对数据块的并发访问
  81. 事务都会占用一个事务槽。
  82. 每个事物都会ITL事物槽由槽位号、XIDUbaFlagLckScn/Fsc几部分组成。
  83. Itl Xid Uba Flag Lck Scn/Fsc
  84. 0x01 0x0006.020.00000271 0x00800205.0257.13 C--- 0 scn 0x0000.001732c4
  85. 0x02 0x0008.006.00000279 0x00800351.0278.15 ---- 1 fsc 0x0000.00000000
  86. Xid:事务id,在回滚段事务表中有一条记录和这个事务对应。Xid组成:Undo Segment Number +Transaction
  87. Table Slot Number+ Wrap
  88. Uba:回滚段地址,该事务对应的回滚段地址。Uba组成:回滚块地址(undo文件号和数据块号)+回滚序列号+
  89. 回滚记录号
  90. SQL> select xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn,ubarec from v$transaction;
  91. XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC
  92. ---------- ---------- ---------- ---------- ---------- ---------- ----------
  93. 8 6 633 2 849 632 21
  94. Flag:事务标志位。这个标志位就记录了这个事务的操作状态,各个标志的含义分别是:
  95. C = transaction has been committed and locks cleaned out --事物已经提交,锁已经被清除
  96. B = this undo record contains the undo for this ITL entry
  97. U = transaction committed (maybe long ago); SCN is an upper bound --事物已经提交,但是锁还没有清除
  98. T = transaction was still active at block cleanout SCN --块清除的SCN被记录时,该事务仍然是活动的,块
  99. 上如果有已经提交的事务,那么在clean ount的时候,块会被进行清除,但是这个块里面的事务不会被清除。
  100. Lck:表示这个事务所影响的行数。我们看到01号事物槽Lck0,因为该事物槽中的事物FlagC,证明该事物
  101. 已经提交,锁也被清楚掉了,该事物槽可以被重用了。02号事物槽Lck1,是因为我对第一行做了一个更新,
  102. 并且没有提交,Flag为----说明该事物是活动的。
  103. Scn/FscCommit SCN或者快速提交(Fast Commit Fsc)的SCN
  104. 每条记录中的行级锁对应Itl条目lb,对应于Itl列表中的序号,即那个事务在该记录上产生的锁。
  105. 对于Oracle来说,对于一个事务,可以是快速提交、也可以是延迟提交,目的都是为了提高提交的速度。提交以后,oracle需要对ITL事务槽、每一行的锁定标记进行清除。如果是快速提交,那么在提交的时候,会将事务表和每一个数据块的ITL槽进行清除。但是锁定标记可能没有清除,等下次用到的时候再进行清除。如果是延迟提交,那么在提交的时候,只是将事务表进行清除,并没有对ITL事务槽进行清除,每一行的锁定标记也没有清除。因此CU的情况特别多。块清除的过程并不包括每个行的锁定标记的清除,主要指的是ITL的清除。
  106. 注意:
  107. 1、事务槽中首先记录的是XidUba,只有在提交以后,当对这个数据块进行cleanout的时候,才会更新FlagScn。因此Oracle总是以事务表中对这个数据块的Scn以及Flag为准。
  108. 2、一个事务开始以后,在一个数据块上得到一个事务槽,那么在这个事务提交以前,这个事务槽会一直占用,直到这个事务提交释放这个事务槽。
  109. 3、只有在已经提交以后,这个itl事务槽中的scn才会有数值。
  110. 4、事务是否已经提交、事务对应的SCN,这些信息都是以回滚段事务表中的为主,事务槽中的不准确
  111. 5、事务槽中的事务iduba地址是准确的
  112. 6、事务槽1中的事务id和回滚段中的事务id肯定不是一样的,不同回滚段中的事务id也一定不一样。
  113. 尾区
  114. 尾区储存着数据块的描述信息,用户数据
  115. data_block_dump,data header at 0xceb6464
  116. ===============
  117. tsiz: 0x1f98 --Total Data Area Size(数据区的大小
  118. hsiz: 0x18 --Data Header Size(数据块头大小)
  119. pbl: 0x0ceb6464 --ptr to buffer holding the block(指向这个数据块在内存中映象的指针)
  120. bdba: 0x01400010 --block dba / rdba(数据块地址)
  121. 76543210
  122. flag=--------
  123. ntab=1 --number of tables (>1 is a cluster)
  124. nrow=3 --number of rows
  125. frre=-1 --first free row index entry, -1=you have to add one(没有创建索引)
  126. fsbo=0x18 --free space begin offset(空闲空间起始位置)
  127. fseo=0x1f5e --free space end offset(空闲空间结束位置)
  128. avsp=0x1f65 --available space in the block(可用空间)
  129. tosp=0x1f65 --total available space when all txs commit
  130. 0xe:pti[] nrow=3 offs=0 --该块有3条记录
  131. 0x12:pri[] offs=0x1f5e --第1条记录在偏移量为0x1f5e的地方,下边两行以此类推。
  132. 0x14:pri[] offs=0x1f66
  133. 0x16:pri[] offs=0x1f80
  134. tab 0, row 0, @0x1f5e
  135. tl: 8 fb: --H-FL-- lb: 0x2 cc: 2 --lb: 0x2说明事物在该数据行上的锁还没清除,并且该锁指向02号事物槽。(此前对改行进行了更新,并且未提交)
  136. col 0: [] c1 02
  137. col 1: [] 61
  138. tab 0, row 1, @0x1f66
  139. tl: 8 fb: --H-FL-- lb: 0x0 cc: 2 --lb: 0x0说明事物在该数据行上的锁已经被清除。(此前对该行进行了更新,并且已经提交)
  140. col 1: [] 62
  141. tab 0, row 2, @0x1f80
  142. tl: 8 fb: --H-FL-- lb: 0x0 cc: 2
  143. col 0: [] c1 04
  144. col 1: [] 63
  145. ―――――――――――――
  146. tl --表示Row Size(number of bytes plus data)
  147. fb --Flag Byte
  148. K- Cluster key
  149. H- head of row piece
  150. D- Deleted row
  151. F- first data piece
  152. L- last data piece
  153. P- First column cintinues from previous row
  154. N- Last column cintinues in next piece
  155. 当我们delete一行数据的时候,数据并不是物理的被删除,而是把该行标记为删除,这个时候fb应该是--HDFL-- 而不是原来的--H-FL-- 。把第3行数据删除后提交,重新dump一下:
  156. tab 0, row 2, @0x1f80
  157. tl: 8 fb: --HDFL-- lb: 0x0 cc: 2
  158. col 0: [] c1 04
  159. col 1: [] 63
  160. Lb --表示lock byte,表示锁定该行的这个事务在itl的入口
  161. Cc --表示number of columns in this Row piece 关于行中的数据,我们以第一行来说明一下 ,我们知道表的第一行为(1,'a'),我们验证一下:
  162. col 0: [] c1 02
  163. col 1: [] 61
  164. SQL> select dump(1,16) from dual;
  165. DUMP(1,16)
  166. -----------------
  167. Typ=2 Len=2: c1,2
  168. SQL> select dump('a',16) from dual;
  169. DUMP('A',16)
  170. ----------------
  171. Typ=96 Len=1: 61

oracle 块速查的更多相关文章

  1. Oracle注入速查表

    注:下面的一部分查询只能由admin执行,我会在查询的末尾以"-priv“标注. 探测版本: SELECT banner FROM v$version WHERE banner LIKE ‘ ...

  2. 常用的14种HTTP状态码速查手册

    分类 1xx \> Information(信息) // 接收的请求正在处理 2xx \> Success(成功) // 请求正常处理完毕 3xx \> Redirection(重定 ...

  3. IL指令速查

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  4. HTML速查列表

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  5. Markdown 语法速查表

      Markdown 语法速查表 1 标题与文字格式 标题 # 这是 H1 <一级标题> ## 这是 H2 <二级标题> ###### 这是 H6 <六级标题> 文 ...

  6. Redis常用命令速查 02_转

    一.Key Key命令速查: 命令 说明 DEL 删除给定的一个或多个 key,不存在的 key 会被忽略,返回值:被删除 key 的数量 DUMP 序列化给定 key,返回被序列化的值,使用 RES ...

  7. HTML5速查表

    HTML5速查表 标签 描述 版本 属性 <!--...--> 定义注释 4 / 5 none <!DOCTYPE> 定义文档类型 4 / 5 none <a> 定 ...

  8. Markdown速查手册

    之前一直使用简书做笔记,沉浸式的写作环境很棒.然而不知什么时候起,氛围愈发浮躁,软文鸡汤泛滥,离"简"字越来越远. 相比更加喜欢沉稳低调.内涵取胜的博客园.于是乎搬家! 搬家就要丢 ...

  9. OpenStack 命令行速查表

    OpenStack 命令行速查表   updated: 2017-07-18 08:53 Contents 认证 (keystone) 镜像(glance) 计算 (nova) 实例的暂停.挂起.停止 ...

随机推荐

  1. 联合 CNCF 共同出品:Kubernetes and Cloud Native Meetup 成都站

    亮点解读 云原生前沿技术分享:阿里经济体“云原生化”宝贵经验与最佳实践成果 OpenKruise 价值几何? 防踩坑指南:国内知名容器平台架构师解读从 ECS 迁移到 K8S 走过哪些坑. ​云原生服 ...

  2. 端口快速扫描程序(c#版 一次可发起1000个连接)

    前言 为了探测本机或对方开放了哪些端口,需要用到端口扫描程序.扫描端口的原理很简单:就是尝试连接对方:如果成功,对方就开放了此端口.扫描程序的关键是速度,如果一次只能发起几个连接,显然速度太慢.如果对 ...

  3. 一文教您如何通过 Docker 搭建反向代理 Ngnix,并配置 Https SSL 证书

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注附送 100G 海量学习资源哟!! 个人网站: https://www.exception.site/docker/h ...

  4. python之三方库(冷门+热门)

    AES加密库 pycryptodome

  5. EF性能优化篇一

    https://www.cnblogs.com/chenwolong/p/7531955.html 1.合理使用AsNoTracking 若对查询的数据不需要做任何修改,则可采用AsNoTrackin ...

  6. Kibana插件开发

    当前开发环境 Kibana版本:7.2 elasticsearch版本:7.2 开发环境安装可参考:https://github.com/elastic/kibana/blob/master/CONT ...

  7. 图解Java数据结构之双向链表

    上一篇文章说到了单链表,也通过案例具体实现了一下,但是单链表的缺点也显而易见. 单向链表查找的方向只能是一个方向 单向链表不能自我删除,需要靠辅助节点 而双向链表则能够很轻松地实现上面的功能. 何为双 ...

  8. 数据库MySQL学习笔记高级篇

    数据库MySQL学习笔记高级篇 写在前面 学习链接:数据库 MySQL 视频教程全集 1. mysql的架构介绍 mysql简介 概述 高级Mysql 完整的mysql优化需要很深的功底,大公司甚至有 ...

  9. K8s容器编排

    K8s容器编排 Kubernetes(k8s)具有完备的集群管理能力: 包括多层次的安全防护和准入机制 多租户应用支撑能力 透明的服务注册和服务发现机制 内建智能负载均衡器 强大的故障发现和自我修复能 ...

  10. flask上下文管理之threading.local

    Flask之上下文管理 知识储备之问题情境: request中的参数: 单进程单线程 单进程多线程-->reqeust 会因为多个请求,数据发生错乱.--->可以基于threading.l ...