dump一个表的数据块要知道这个块所在的位置(数据文件的编号和数据块的编号)
TEST@PROD2>select dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_number(rowid) bno,id,name from t1;
FNO BNO ID NAME
---------- ---------- ---------- ----------
4 539 1 cheng
4 539 1 zhuo
TEST@PROD2>alter system dump datafile 4 block 539;
System altered.
TEST@PROD2>select value from v$diag_info where name like '%Default Trace%';
VALUE
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/prod2/PROD2/trace/PROD2_ora_23959.trc
[oracle@enmo ~]$ more /u01/app/oracle/diag/rdbms/prod2/PROD2/trace/PROD2_ora_23959.trc
Trace file /u01/app/oracle/diag/rdbms/prod2/PROD2/trace/PROD2_ora_23959.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1
System name: Linux
Node name: enmo
Release: 3.8.13-16.2.1.el6uek.x86_64
Version: #1 SMP Thu Nov 7 17:01:44 PST 2013
Machine: x86_64
Instance name: PROD2
Redo thread mounted by this instance: 1
Oracle process number: 25
Unix process pid: 23959, image: oracle@enmo (TNS V1-V3)
*** 2016-03-04 17:22:57.841
*** SESSION ID:(40.419) 2016-03-04 17:22:57.841
*** CLIENT ID:() 2016-03-04 17:22:57.841
*** SERVICE NAME:(SYS$USERS) 2016-03-04 17:22:57.841
*** MODULE NAME:(SQL*Plus) 2016-03-04 17:22:57.841
*** ACTION NAME:() 2016-03-04 17:22:57.841
Start dump data blocks tsn: 4 file#:4 minblk 539 maxblk 539
可以看到我们dump的是文件编号是4,开始的block号为539(minblk),结束的block号为53(maxblk)。
可以从这里看出来
下面这部分主要是 buffer cache 里面的buffer的一些状态 比如在什么链表上之类的信息
Block dump from cache:
Dump of buffer cache at level 4 for tsn=4 rdba=16777755
BH (0x67fe3a40) file#: 4 rdba: 0x0100021b (4/539) class: 1 ba: 0x67d68000
set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 88633 objn: 88633 tsn: 4 afn: 4 hint: f
hash: [0x687e5490,0x83d4e160] lru: [0x67fe3c68,0x67fe39f8]
ckptq: [NULL] fileq: [NULL] objq: [0x66fec8b8,0x67fe3a20] objaq: [0x67fe4180,0x67fe3a30]
st: XCURRENT md: NULL fpin: 'ktspbwh2: ktspfmdb' tch: 5
flags: block_written_once redo_since_read
LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [1]
BH (0x687e53d8) file#: 4 rdba: 0x0100021b (4/539) class: 1 ba: 0x68592000
set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 88632 objn: 88632 tsn: 4 afn: 4 hint: f
hash: [0x83d4e160,0x67fe3af8] lru: [0x687e5c18,0x687e5390]
lru-flags: on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL] objaq: [NULL]
st: FREE md: NULL fpin: 'ktspbwh2: ktspfmdb' tch: 0 lfb: 33
flags:
下面是磁盘上块的数据,有用的数据在底部
Block dump from disk:
buffer tsn: 4 rdba: 0x0100021b (4/539)
rdba: relative database address of the block相对数据块地址0x01400039
可以看到(4/539),其实意思就是file# 4, block# 539。
scn: 0x0000.0010f567 seq: 0x01 flg: 0x06 tail: 0xf5670601
SCN是最后变化的scn,在上面的例子中SCN是0x0000.0010f567。
tail是由SCN的后4位(f567)、type(06)以及sequence(01)组成,即0xf5670601。
如果Tail与SCN的后4位(f567)、type(06)以及sequence(01)这三个值不一致,
那么这个块就存在问题,需要恢复或者回滚。
frmt: 0x02 chkval: 0xb6dd type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F6A58F66A00 to 0x00007F6A58F68A00
7F6A58F66A00 0000A206 0100021B 0010F567 06010000 [........g.......]
7F6A58F66A10 0000B6DD 00000001 00015A39 0010F562 [........9Z..b...]
7F6A58F66A20 00000000 00320002 01000218 000A0005 [......2.........]
7F6A58F66A30 000003A3 00C000C1 001500FB 00002002 [............. ..]
7F6A58F66A40 0010F567 00000000 00000000 00000000 [g...............]
7F6A58F66A50 00000000 00000000 00000000 00000000 [................]
7F6A58F66A60 00000000 00020100 0016FFFF 1F6B1F81 [..............k.]
7F6A58F66A70 00001F6B 1F8C0002 00001F81 00000000 [k...............]
7F6A58F66A80 00000000 00000000 00000000 00000000 [................]
Repeat 250 times
7F6A58F67A30 00000000 00010000 00020001 00000000 [................]
7F6A58F67A40 00000000 00000000 00000000 00000000 [................]
Repeat 249 times
7F6A58F689E0 00000000 02012C00 0402C102 6F75687A [.....,......zhuo]
7F6A58F689F0 0202012C 630502C1 676E6568 F5670601 [,......cheng..g.]
dump出来的块头信息
Block header dump: 0x0100021b
Object id on Block? Y
seg/obj: 0x15a39 csc: 0x00.10f562 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000218 ver: 0x01 opc: 0
inc: 0 exflg: 0
csc值(Cleanout System Change number)与SCN值相同时该快会被清除。
itc值(Interested Transaction List Count)表示ITL的数量,在上面的列子中itc的值为2 表示有这个数据块上相关的事物,这些事物id(xid)显示有2个事物。这些事物的id值与回滚段相关联被用来处理我们的事物
flag(flg)中"-"或者"O"表示是否在自由列表中,"0"则在,"-"则不在。估计E也是不在的意思。
如果在自由列表的话会出现:
fsl(ITL freelist slot)表示ITL自由列表的开始位置。
fnx(Next freelist block)表示segment自由列表中下一个block的RDBA地址。
事务信息
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0005.00a.000003a3 0x00c000c1.00fb.15 --U- 2 fsc 0x0000.0010f567
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
Xid:事务id,在回滚段事务表中有一条记录和这个事务对应。
Xid组成:Undo Segment Number +Transaction Table Slot Number+ Wrap。
Uba:回滚段地址,该事务对应的回滚段地址。
Uba组成:回滚块地址(undo文件号和数据块号)+回滚序列号+回滚记录号。
bdba: 0x0100021b
data_block_dump,data header at 0x7f6a58f66a64
===============tsiz: 0x1f98
上面的tsiz值显示了在数据块中还可以使用的空间大小,将1f98
转换成十进制为8088字节
hsiz: 0x16 pbl: 0x7f6a58f66a64
76543210
flag=--------
ntab=1
ntab的值告诉我们在这个数据块中存储有多少个表,除非这个数据块
属于一个集簇,否则这个值将会是1.
nrow=2
nrow的值告诉我有多少行数据存储在数据块中.上面显示这个数据块
有127行数据
frre=-1
fsbo=0x16
fseo=0x1f81
avsp=0x1f6b
tosp=0x1f6b
0xe:pti[0] nrow=2 offs=0
0x12:pri[0] offs=0x1f8c
0x14:pri[1] offs=0x1f81
block_row_dump:
从地址0xe开始,我们得到每一行的一个目录.我们可以看到第一行是从
数据块的偏移地址为'0x1f8c'.用这种方式可以快速找到数据行.
rowid是唯一指示每一行数据的它的格式是(对象编号+相关文件号+块号+行号)
块中数据行信息
第一行
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 5] 63 68 65 6e 67
第二行
tab 0, row 1, @0x1f81
tl: 11 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 4] 7a 68 75 6f
真实的行数据是从"block_row_dump"开始的.
然后给出一个行数据。只在这里显示的一行数据,其余的是类似的。
我们可以看到,这行属于表' 0 '(标签)我们的集簇。由于没有集簇在我们的例子中,
我们不会有一个以上的表,这个值将是零。我们还可以看到,这是行' 0 '和那一行的地址
这个地址必须与我们上面提到第一行数据是从数据块的偏移地址为'0x1f8c'
而在上面显示的row 0, @0x1f8c中的0x1f8c是相匹配的
t1说明这一行数据的总的字节数包含任何开销.我们可以看到这一行是有11字节
cc说明这一行有多少列,上面显示的是2列.
fb显示了行的标记.H是行头,F是行的第一个片段,L是行的最后一个片段.
如果显示为这一行的第一个和最后一个行片段说明行没有发生链接.因此
行头和行不会迁移
这些col后面的数据用函数转换一下就是表中的数据
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 539 maxblk 539