Oracle 数据块
以emp表为例
SYS@ prod>select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
得到文件号和块号
SYS@ prod>select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from scott.emp where rownum= 1; DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
4 151
转储块
SYS@ prod>alter system dump datafile 4 block 151; System altered.
trace文件
SYS@ prod>oradebug setmypid
Statement processed.
SYS@ prod>oradebug tracefile_name
/u01/diag/rdbms/prod/prod/trace/prod_ora_3890.trc
分析块
Block dump from disk:
buffer tsn: 4 rdba: 0x01000097 (4/151)
scn: 0x0000.00104463 seq: 0x01 flg: 0x04 tail: 0x44630601
frmt: 0x02 chkval: 0x47ea type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
- buffer tsn:tablespace number,表空间号,可通过select TS#,name from v$tablespace;验证。
- rdba(relative database block address ):用4个字节32位来表示,前10位为相对数据文件号,后22位为块号。01400010=0000 0001 0100 0000 0000 0000 0001 0000(二进制)我们看到前10位转换成十进制就是5,后22位转换成十进制就是16。rdba在数据块中的offset是4,即rdba存在于数据块中的第5-9字节中(offset从0开始算),数据块中的每个部分在数据块中的偏移量后边会通过BBED展示,这里可以先不关心。
- scn:数据块头部SCN,总共占用6个字节,前2个字节表示SCN Wrap,后4个字节表示SCN Base。如果SCN Base达到了4个字节表示的最大值,SCN Wrap+1,SCN Base清0。在数据块中的offset是8。
- seq: 在同一个SCN中,对一个块的每次更改都会增加一个序列号。如果序列号换行,则必须分配新的SCN。保留值0xFF。如果存在,则表明该块已被Oracle标记为损坏。在数据块中的offset是14。
- flg:1位标志值的组合。在数据块中的offset是15。1=原始区块 2=最后一次修改块是为了进行清理操作 4=设置校验和值 8=临时数据
- tail:即tail check,存放于数据块的最后4个字节,用于数据块一致性检查。tail check的组成:SCN Base的低2个字节+type+seq。即tail: 0x32d30601=32d3+06+01
- frmt:oracle8之后一直都是0x02
- chkval:块内容的可选校验和。写入块时,校验和将被清除或设置,具体取决于db_block_checksum参数的设置。读取块时,如果存在校验和且参数设置为真,则验证校验和。系统表空间中的块总是计算并检查校验和。校验和是块中所有其他2字节对的XOR。因此,当检查带有校验和的块时,块中所有2字节字的XOR应为0。
- type:块类型,比如06是表索引等的数据块
数据块头
Block header dump: 0x01000097
Object id on Block? Y
seg/obj: 0x11ddd csc: 0x00.f587b itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000090 ver: 0x01 opc: 0
inc: 0 exflg: 0
- object id on block:object_id是否保存在块中,oracle 6之后一直都是Y
- seg/obj:object_id,对应user_objects中的object_id.
- csc:SCN at last Block CleanOut,表示最后一次块清除(Block CleanOut)时候的SCN
- itc:itl事务槽的个数。
- flag:该块是否在freelist上的标志位,若为0标示在freelist上,-表示不再freelist上,E标示使用的ASSM。
- typ: 1 为 table ; 2 为 index。oracle进行查询的时候是根据 obj$表中的情况来判断对象的类型的,不是根据这个typ。也就是说如果有一个表但改变表中block的这个标志位,一样可以查询出数据来,但dump block 时会出错。
- brn:
- bdba:
- ver:
- opc:
- inc:
- exflg:
事物槽
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0001.010.00000198 0x00c15ab0.0061.12 C--- 0 scn 0x0000.000b6f31
0x02 0x000b.019.0000000a 0x0180000c.0003.23 ---- 4 fsc 0x0000.00000000
- itl:ITL事务槽编号。
- xid:transac[X]tion identified
- uba:undo block address
- flag: ---- 表示transaction is active, or committed pending cleanout;C---表示事务已经提交并且持有的锁已经清除;-B--表示this undo record contains the undo for this ITL entry;--U-表示transaction committed (maybe long ago); SCN is an upper bound,事物已经提交,但是锁还没有清除;---T = transaction was still active at block cleanout SCN块清除的SCN被记录时,该事务仍然是活动的,块上如果有已经提交的事务,那么在clean ount的时候,块会被进行清除,但是这个块里面的事务不会被清除。
- lck:表示这个事务所影响的行数。我们看到01号事务槽Lck为0,因为该事务槽中的事务Flag为C,证明该事务已经提交,锁也被清楚掉了,该事务槽可以被重用了。02号事务槽Lck为4,说明有4行做了一个更新,并且没有提交,Flag为----说明该事务是活动的。
- scn/fsc:Commit SCN或者快速提交(Fast Commit Fsc)的SCN
每条记录中的行级锁对应Itl条目lb,对应于Itl列表中的序号,即那个事务在该记录上产生的锁。对于Oracle来说,对于一个事务,可以是快速提交、也可以是延迟提交,目的都是为了提高提交的速度。提交以后,oracle需要对ITL事务槽、每一行的锁定标记进行清除。如果是快速提交,那么在提交的时候,会将事务表和每一个数据块的ITL槽进行清除。但是锁定标记可能没有清除,等下次用到的时候再进行清除。如果是延迟提交,那么在提交的时候,只是将事务表进行清除,并没有对ITL事务槽进行清除,每一行的锁定标记也没有清除。因此C和U的情况特别多。块清除的过程并不包括每个行的锁定标记的清除,主要指的是ITL的清除。
注意:
1、事务槽中首先记录的是Xid和Uba,只有在提交以后,当对这个数据块进行cleanout的时候,才会更新Flag和Scn。因此Oracle总是以事务表中对这个数据块的Scn以及Flag为准。
2、一个事务开始以后,在一个数据块上得到一个事务槽,那么在这个事务提交以前,这个事务槽会一直占用,直到这个事务提交释放这个事务槽。
3、只有在已经提交以后,这个itl事务槽中的scn才会有数值。
4、事务是否已经提交、事务对应的SCN,这些信息都是以回滚段事务表中的为主,事务槽中的不准确
5、事务槽中的事务id和uba地址是准确的
6、事务槽1中的事务id和回滚段中的事务id肯定不是一样的,不同回滚段中的事务id也一定不一样。
尾区储存着数据块的描述信息
bdba: 0x01000097
data_block_dump,data header at 0x4d0664
===============
tsiz: 0x1f98
hsiz: 0x2e
pbl: 0x004d0664
76543210
flag=--------
ntab=1
nrow=14
frre=-1
fsbo=0x2e
fseo=0x1aa7
avsp=0x1d32
tosp=0x1d32
- bdba:
- tsiz:top of size 数据块区的总大小
- hsiz:Data header size 数据头大小
- pbl:
- flag:
- ntab:表示这个块的数据在一个表(如果是聚簇表就有可能是2或2以上)
- nrow:块中存储了几行数据
- frre:first free row index entry, -1=you have to add one(没有创建索引)
- fsbo:Free space begin offset可以存放数据空间的起始位置
- fseo:Free space end offset可以存放数据空间的结束位置
- avsp:Available space for new entries可用空间的大小
- toap:Total space总剩余空间的大小
0xe:pti[] nrow=14 offs=0 --该块有3条记录
0x12:pri[] offs=0x1b2a --第1条记录在偏移量为0x1b2a的地方,下边以此类推。
0x14:pri[] offs=0x1aa7
0x16:pri[] offs=0x1b7b
0x18:pri[] offs=0x1ba6
0x1a:pri[] offs=0x1bcf
0x1c:pri[] offs=0x1bfc
0x1e:pri[] offs=0x1c25
0x20:pri[] offs=0x1c4e
0x22:pri[] offs=0x1c76
0x24:pri[] offs=0x1c9c
0x26:pri[] offs=0x1cc7
0x28:pri[] offs=0x1ced
0x2a:pri[] offs=0x1d13
0x2c:pri[] offs=0x1d3a
block_row_dump:
tab 0, row 0, @0x1b2a
tl: 38 fb: --H-FL-- lb: 0x2 cc: 8 --lb: 0x2说明事物在该数据行上的锁还没清除,并且该锁指向02号事物槽。(此前对改行进行了更新,并且未提交)
col 0: [] c2 4a 46
col 1: [] 53 4d 49 54 48
col 2: [] 43 4c 45 52 4b
col 3: [] c2 50 03
col 4: [] 77 b4 0c 11 01 01 01
col 5: [] c2 15
col 6: *NULL*
col 7: [] c1 15
tab 0, row 4, @0x1bcf
tl: 45 fb: --H-FL-- lb: 0x0 cc: 8 --lb: 0x0说明事物在该数据行上的锁已经被清除。(此前对该行进行了更新,并且已经提交)
col 0: [] c2 4d 37
col 1: [] 4d 41 52 54 49 4e
col 2: [] 53 41 4c 45 53 4d 41 4e
col 3: [] c2 4d 63
col 4: [] 77 b5 09 1c 01 01 01
col 5: [] c2 0d 33
col 6: [] c2 0f
col 7: [] c1 1f
tl --表示Row Size(number of bytes plus data)
fb --标志位
K- Cluster key
H- head of row piece
D- Deleted row
F- first data piece
L- last data piece
P- First column cintinues from previous row
N- Last column cintinues in next piece
当我们delete一行数据的时候,数据并不是物理的被删除,而是把该行标记为删除,这个时候fb应该是--HDFL-- 而不是原来的--H-FL-- 。
Lb --表示lock byte,表示锁定该行的这个事务在itl的入口
Cc --表示number of columns in this Row piece。
验证数据
SYS@ prod>select dump(7369,16) from dual; DUMP(7369,16)
---------------------
Typ=2 Len=3: c2,4a,46 SYS@ prod>select dump('SMITH',16) from dual; DUMP('SMITH',16)
----------------------------
Typ=96 Len=5: 53,4d,49,54,48
Oracle 数据块的更多相关文章
- [转]Oracle数据块体系的详细介绍
数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小 ...
- Oracle数据块损坏的恢复实例
测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test ...
- oracle数据块核心剖析
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp57 数据块(Oracle Data Blocks),本文简称为" ...
- java.sql.SQLException: ORA-01578: ORACLE 数据块损坏问题解决办法
错误信息: java.sql.SQLException: ORA-01578: ORACLE 数据块损坏 (文件号 17, 块号 315703) ORA-01110: 数据文件 17: 'D:\ORA ...
- Oracle数据块损坏篇之10231内部事件
实验:某个分区数据块损坏,不完全恢复此分区表数据 背景:数据库没有有效备份,某个分区中有数据块损坏. 要求:最大限度恢复此分区数据. 环境:RHEL 6.4 + Oracle 11.2.0.4 1. ...
- ORACLE 数据块dump
1. rdba(Tablespace relative database block address) 是相对数据块地址,是数据所在的地址,rdba可就是rowid 中rfile#+block#. 根 ...
- Oracle数据块深入分析总结
http: 最近在研究块的内部结构,把文档简单整理了一下,和大家分享一下.该篇文章借助dump和BBED对数据 库内部结构进行了分析,最后附加了一个用BBED解决ORA-1200错误的小例子.在总结的 ...
- 使用BBED理解和修改Oracle数据块
1.生成bbed list file文件: SQL> select file#||' '||name||' '||bytes from v$datafile; $ vim dbfile.txt ...
- Oracle 数据块损坏与恢复具体解释
1.什么是块损坏: 所谓损坏的数据块,是指块没有採用可识别的 Oracle 格式,或者其内容在内部不一致. 通常情况下,损坏是由硬件故障或操作系统问题引起的.Oracle 数据库将损坏的块标识为&qu ...
随机推荐
- VUE-013-为elementUI 设置 tootip 宽度
在表格显示列表中,通常添加 :show-overflow-tooltip="true" 以显示不能完全展示的单元格文案提示.单通常显示为全屏宽度,不易查看,可通过设置全局的样式,进 ...
- [转]Oringin 2016 安装教程
觉得有用的话,欢迎一起讨论相互学习~Follow Me 原文ll链接 http://www.downza.cn/soft/282296.html 打开setup.exe 一路Next和Yes,任意输入 ...
- Centos7快速安装Rancher
通过docker,我们可以快速安装rancher 安装步骤如下:[root@localhost ~]# #run运行,-d后台模式 --restart=always跟随docker启动,-p映射端口, ...
- 【NPDP笔记】第二章 组合管理
2.1 什么是产品组合 Product Portfolio 什么是组合管理,讲述的是完成正确的项目, 五大目标 财务稳健,财务目标 管道平衡,资源需求与可用资源之间的平衡 战略协同,与经营战略 组织战 ...
- 如何在Debian 9上安装和使用Docker
介绍 Docker是一个简化容器中应用程序进程管理过程的应用程序.容器允许您在资源隔离的进程中运行应用程序.它们与虚拟机类似,但容器更便携,更加资源友好,并且更依赖于主机操作系统. 在本教程中,您将在 ...
- (CSDN迁移) JAVA多线程实现-实现Runnable接口
实现Runnable接口 implements Runnable 重写run()方法 @Override public void run(){//TODO} 创建线程对象: Thread threa ...
- Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用
Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...
- Centos6 系统下源码方式安装Mysql 记录
在运维工作中经常部署各种运维环境,涉及mysql数据库的安装也是时常需要的.mysql数据库安装可以选择yum在线安装,但是这种安装的mysql一般是系统自带的,版本方面可能跟需求不太匹配. #### ...
- LeetCode 5214. 最长定差子序列(Java)HashMap
题目: 5214. 最长定差子序列 给你一个整数数组 arr 和一个整数 difference,请你找出 arr 中所有相邻元素之间的差等于给定 difference 的等差子序列,并返回其中最长的等 ...
- CF891E Lust 生成函数
传送门 设在某一次操作之后的\(a\)数组变为了\(a'\)数组,那么\(\prod\limits_{i \neq x} a_i = \prod a_i - \prod a_i'\).那么就不难发现我 ...