dump命令可以 将 block 的内容显示到屏幕。每次显示的bytes由count控制,默认是512bytes。 使用 /v 选项,可以显示更多详细信息。
BBED> dump /v dba 1,116538 offset 0 count 128
File: /u01/app/oracle/oradata/T1/system01.dbf (1)
Block: 116538 Offsets: 0 to 127 Dba:0x0041c73a
-------------------------------------------------------
06a20000 3ac74100 23912c00 00000204 l .¢..: Ɓ .#.,.....
b79d0000 01000000 b4220100 1f912c00 l ·.......´"....,.
00800000 03000200 00000000 ffff0000 l ................
00000000 00000000 00000000 00800080 l ................
1f912c00 00000000 00000000 00000000 l ..,.............
00000000 00000000 00000000 00000000 l ................
00000000 00000000 00000000 00000000 l ................
00000000 00014100 ffff9400 ed035903 l ......A..... 뭙 .
<16 bytes per line>
看一下blockheader ( 06a20000 3ac74100 23912c00 00000204 ) 中第一行16个bytes 的架构:
|
Type |
Format |
Unused |
RDBA |
SCN Base |
SCN Wrap |
Seq |
Flag |
|
06 |
a2 |
0000 |
3ac74100 |
23912c00 |
0000 |
02 |
04 |
print命令输出data structures。在使用print时,可以指定dba,block 等参数来限定输出特定block。
在map章节讲了block结构,可以通过dump来查看block的type ,现在通过print也可以查看
BBED> set dba 1,116538
DBA 0x0041c73a (4310842 1,116538)
BBED> set offset 0
OFFSET 0
BBED> print kcbh.type_kcbh
ub1 type_kcbh @0 0x06
--------可以通过print 输出指定名称的block structures
BBED> print kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub2 wrp2_kcbh @2 0x0000
ub4 rdba_kcbh @4 0x0041c73a
ub4 bas_kcbh @8 0x002c9123
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x02
ub1 flg_kcbh @15 0x04 (KCBHFCKV)
ub2 chkval_kcbh @16 0x9db7
ub2 spare3_kcbh @18 0x0000
------如果我们想确定block 中row的数量,可以print data header structure 或者kdbh
BBED> p kdbh
struct kdbh, 14 bytes @116
ub1 kdbhflag @116 0x00 (NONE)
sb1 kdbhntab @117 1
sb2 kdbhnrow @118 65
sb2 kdbhfrre @120 -1
sb2 kdbhfsbo @122 148
sb2 kdbhfseo @124 1005
sb2 kdbhavsp @126 857
sb2 kdbhtosp @128 857
------也可以指定某个具体的structure元素进行print
BBED> p kdbhnrow sb2 kdbhnrow @118 65------ 该 block 中保存了 65 行
注意:
当print 一个data structure 时,输出的格式如下:
UnitSize* | Name | Offset | Value
BBED> p kdbr
sb2 kdbr[0] @134 7967
sb2 kdbr[1] @136 7846
sb2 kdbr[2] @138 7741
sb2 kdbr[3] @140 7620
...
sb2 kdbr[63] @260 1102
sb2 kdbr[ 64] @262 1005
格式对应关系:
|
UnitSize* |
Name |
Offset |
Value |
|
sb2 |
kdbr[0] |
@134 |
7967 |
从上面的结果,可以看出,在这个数据块里有 64 行记录 。 每行的 pointer 需要 2 个 bytes 来存储。 这 64 行 row 的 offset 从 134 到 262
------ 在 pointer 加前缀 * 可以 print location data structure 。可以使用 kdbr[0] 作为一个指针来 print 它对应的内容。这个 kdbr[0] 是一个本地的 data structure , print 需要加 * 号前缀
BBED> p *kdbr[0]
rowdata[6962]
-------------
ub1 rowdata[6962] @ 8083 0x2c
通过这个信息,可以知道 该行记录的偏移量是8083. dump它的具体信息
BBED> d /v dba 1,116538 offset 8083 count 128
File: /u01/app/oracle/oradata/T1/system01.dbf (1)
Block: 116538 Offsets: 8083 to 8191 Dba:0x0041c73a
-------------------------------------------------------
2c001603 53595311 495f4848 5f4f424a l ,...SYS.I_HH_OBJ
235f494e 54434f4c 23ff02c1 4702c147 l #_INTCOL#...
05494e44 45580778 77041101 39100778 l .INDEX.xw...9..x
77041101 39101332 3031392d 30342d31 l w...9..2019-04-1
373a3030 3a35363a 31350556 414c4944 l 7:00:56:15.VALID
014e014e 014e02c1 05ff044e 4f4e45ff l .N.N.N.????..NONE.
0159014e ff014e01 4e020623 91 l .Y.N..N.N..#.
<16 bytes per line>
print命令也可以直接输出一个绝对的offset内容
BBED> p offset 8083
rowdata[6962]
-------------
ub1 rowdata[6962] @8083 0x2c
------这个输出结果默认是16进制的。我们可以将其修改成其他格式
|
Switch |
Display Format |
|
/x |
Hex 十六进制 |
|
/d |
signed decimal 十进制 |
|
/u |
unsigned decimal |
|
/o |
Octal 八进制 |
|
/c |
Character |
|
/n |
Oracle Number |
|
/t |
Oracle Date |
|
/i |
Oracle ROWID |
BBED> p offset 8083
rowdata[6962]
-------------
ub1 rowdata[6962] @8083 0x2c
BBED> p /d offset 8083
rowdata[6962]
-------------
ub1 rowdata[6962] @8083 44
