ODU命令详解 PartIII

接上文《ODU命令详解 PartII》,本文继续介绍ODU的命令

5.scan 命令

scan命令用于扫描数据文件中的segment以及extent。主要作用在于没有SYSTEM表空间时的数据恢复,以及TRUNCATE表和DROP表之后的数据恢复。命令格式如下:

scan extent [tablespace <ts#> [datafile <rfile#>] ] [object <data_object_id>]

扫描时可以指定表空间(只能指定表空间号),表空间中的1个文件;也可以扫描指定的data_object_id。扫描完成后,将在ODU的运行目录下生成ext.odu文件以及segment.txt文件,后者包含了扫描所找到的段头。

下面是一个示例:

ODU> scan extent tablespace 11

scanning extent...
scanning extent finished.

在恢复没有SYSTEM表空间和DROP,TRUNCATE表之前,需要运行scan命令。

6.dump 命令

dump命令模仿oracle的"alter system dump datafile"命令,解析并显示oracle的块格式。目前支持的块包括文件头(只有部分信息)、数据段头、表和索引数据块,其他的块只显示块头。这已经足够大部分情况的使用。ODU的升级版将解析并显示UNDO的段头和数据块。

dump命令用于帮助分析块格式,在ORACLE不能启动时(比如在关键的数据字典对象上有物理或逻辑坏块),用于分析块。dump命令的格式如下:

dump datafile <file#> block <block#>

这个命令格式与oracle的"alter system dump datafile“类似,这里的文件号是绝对文件号。
下面是几个示例输出:

dump文件头:

ODU> dump datafile 1 block 1
Block Header:
block type=0x0b (file header)
block format=0x02 (oracle 8 or 9)
block rdba=0x00400001 (file#=1, block#=1)
scn=0x0000.00000000, seq=1, tail=0x00000b01
block checksum value=0xcfe5=53221, flag=4
File Header:
Db Id=0xb0f1f85c=2968647772, Db Name=XJ, Root Dba=0x400341
Software vsn=0x9200000, Compatibility Vsn=0x8000000, File Size=0x1f400=128000 Blocks
File Type=0x3 (data file), File Number=1, Block Size=4096
Tablespace #0 - SYSTEM rel_fn:1
get_bootstrap_dba: compat header size:12
bootstrap rdba 0x004002f1 rfile#=1 block#=753

dump数据段头:

ODU> dump datafile 10 block 45
Block Header:
block type=0x23 (ASSM segment header block)
block format=0x02 (oracle 8 or 9)
block rdba=0x0280002d (file#=10, block#=45)
scn=0x0000.00209d2c, seq=3, tail=0x9d2c2303
block checksum value=0x7247=29255, flag=4
Data Segment Header:
  Extent Control Header
  -------------------------------------------------------------
  Extent Header:: extents: 1  blocks: 5
                  last map: 0x00000000  #maps: 0  offset: 668
      Highwater:: 0x02800030  (rfile#=10,block#=48)
                  ext#: 0  blk#: 5   ext size:5
      #blocks in seg. hdr's freelists: 0
      #blocks below: 2
      mapblk: 0x00000000   offset: 0
  --------------------------------------------------------
  Low HighWater Mark :
      Highwater::  0x02800030  ext#: 0      blk#: 5      ext size: 5
  #blocks in seg. hdr's freelists: 0
  #blocks below: 2
  mapblk  0x00000000  offset: 0
  Level 1 BMB for High HWM block: 0x0280002b
  Level 1 BMB for Low HWM block: 0x0280002b
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 2048   fbsz: 0
  L2 Array start offset:  0x00000434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x0280002c
  Last Level 1 BMB:  0x0280002b
  Last Level 1I BMB:  0x0280002c
  Last Level 1II BMB:  0x00000000
     Map Header:: next  0x00000000  #extents: 1    obj#: 31208  flag: 0x220000000
  Extent Map
  -------------------------------------------------------------
   0x0280002b  length: 5

  Auxillary Map
  -------------------------------------------------------------
   Extent 0      :  L1 dba:  0x0280002b Data dba:  0x0280002e
  -------------------------------------------------------------

   Second Level Bitmap block DBAs
  -------------------------------------------------------------
   DBA 1:   0x0280002c

dump数据块:

ODU> dump datafile 10 block 47
Block Header:
block type=0x06 (table/index/cluster segment data block)
block format=0x02 (oracle 8 or 9)
block rdba=0x0280002f (file#=10, block#=47)
scn=0x0000.00209f21, seq=1, tail=0x9f210601
block checksum value=0xc8d=3213, flag=6
Data Block Header Dump:
 Object id on Block? Y
 seg/obj: 0x79e8=31208  csc: 0x00.209d2c  itc: 2  flg: E  typ: 1 (data)
     brn: 0  bdba: 0x280002b ver: 0x01

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000a.008.000006a4  0x008018c1.00e0.13  --U-    2  fsc 0x0000.00209f21
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
Data Block Dump:
================
flag=0x0 --------
ntab=1
nrow=2
frre=-1
fsbo=0x16
ffeo=0x6e7
avsp=0x6fc
tosp=0x6fc
0xe:pti[0] nrow=2  offs=0
0x12:pri[0]  offs=0x76d
0x14:pri[1]  offs=0x6e7
Block Rows Dump:
tab 0, row 0, @0x76d
fb: --H-FL-- lb: 0x1  cc: 2
col   0: [  2]  c1 02
col   1: [ 36]  00 54 00 01 01 0c 00 00 00 01 00 00 00 01 00 00 00 00 d9 95 00 10 09 00 00 00 00 00 00 00 00 00 00 00 00 00
tab 0, row 1, @0x6e7
fb: --H-FL-- lb: 0x1  cc: 2
col   0: [  2]  c1 03
col   1: [ 84]  00 54 00 01 01 0c 00 00 00 01 00 00 00 01 00 00 00 00 d9 96 00 40 05 00 00 00 03 b6 01 a1 00 00 00 00 00 03 02 80 00 a7 02 80 00 a6 02
 80 00 b1 02 80 00 ae 02 80 00 af 02 80 00 b0 02 80 00 b6 02 80 00 b3 02 80 00 b4 02 80 00 b5 02 80 00 bb 02 80 00 b8

7. osdump命令

osdump命令用16进制显示数据文件中的数据,帮助用于分析块格式。其命令格式如下:

osdump datafile <file#> block <block#> [offset <offset>]

这里的偏移(offset)指的是从块头开始的偏移量。
下面是一个示例输出:

ODU> osdump datafile 10 block 47
                  -0--1--2--3--4--5--6--7--8--9--a--b--c--d--e--f-
0000000000017800   06 02 00 00 2f 00 80 02 21 9f 20 00 00 00 01 06
0000000000017810   8d 0c 00 00 01 00 00 00 e8 79 00 00 2c 9d 20 00
0000000000017820   00 00 00 00 02 00 32 00 2b 00 80 02 0a 00 08 00
0000000000017830   a4 06 00 00 c1 18 80 00 e0 00 13 00 02 20 00 00
0000000000017840   21 9f 20 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000017850   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000017860   00 00 00 00 00 01 02 00 ff ff 16 00 e7 06 fc 06
0000000000017870   fc 06 00 00 02 00 6d 07 e7 06 00 00 a3 00 80 02
0000000000017880   a3 00 80 02 00 00 00 00 00 00 00 00 00 00 00 00
0000000000017890   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000178a0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000178b0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000178c0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000178d0   03 00 00 00 00 08 00 00 01 00 00 00 34 04 00 00
00000000000178e0   00 00 00 00 a4 00 80 02 01 00 00 00 a3 00 80 02
00000000000178f0   a4 00 80 02 00 00 00 00 00 00 00 00 00 00 00 00
0000000000017900   00 00 00 00 00 00 00 00 33 00 00 00 a8 01 80 02
0000000000017910   e4 79 00 00 00 00 00 20 a3 00 80 02 05 00 00 00
0000000000017920   ad 00 80 02 05 00 00 00 b2 00 80 02 05 00 00 00
0000000000017930   b7 00 80 02 05 00 00 00 bc 00 80 02 05 00 00 00
0000000000017940   c1 00 80 02 05 00 00 00 c6 00 80 02 05 00 00 00
0000000000017950   cb 00 80 02 05 00 00 00 d0 00 80 02 05 00 00 00
0000000000017960   d5 00 80 02 05 00 00 00 da 00 80 02 05 00 00 00

--to be continued

,
Trackback

18 comments untill now

  1. 请教老熊,ODU的“支持复制操作系统命令不能复制的坏文件”如何使用?

  2. ODU> copy

    copy datafile to [force]

    是不是这个来?

    老熊 Reply:

    对,就是这个命令

  3. 老熊的这个“支持复制操作系统命令不能复制的坏文件”的这个功能太强悍了。
    向老熊致敬。

  4. 熊老大,ODU能不能导出某用户的object,比如package、procedure之类的

    老熊 Reply:

    @狒狒, ODU目前没有直接的功能来支持导出程序代码类对象,但是可以通过导出sys.source$来取得程序代码,只是需要手工整理。

  5. 茅塞顿开。。感谢老熊。。。偶像呀!

  6. MASTER熊,有问题请教了
    9I的数据库,我unload任何用户的表,这是如下提示
    Unloading table: table_name,object ID: XXXXX
    Unloading segment,storage(Obj#=0 DataObj#=0 TS#=0 File#=0 Block#=0 Cluster=0)
    显然应该是没找到数据吧,导出的table_name.txt大小为0,table_name.sql也是错的。。。
    这是为何,是不是system表空间有坏块?我用dbv检查,Total Pages Marked Corrupt : 0

    老熊 Reply:

    @狒狒, desc username.tablename看看是啥结果。
    Unloading segment,storage(Obj#=0 DataObj#=0 TS#=0 File#=0 Block#=0 Cluster=0),这里显示没有找到数据段的存储信息。可以与我在MSN或QQ上看看这个问题。

  7. master熊,俺的问题已解决了
    是我第一次unload dict的时候失败了,当时没有察觉到。
    今天再跑一次unload dict后,NO PROBLEM了。。呵呵

  8. 我很想知道你怎么搞定assm segment header的?不知道你方便透露一点不?

    老熊 Reply:

    @慢马, 这个没什么不方便的,都是根据DSI然后去dump block总结出来的。

  9. 用bbed可以弄出mssm segment header,datafile header和data block的结构,就是弄不出assm segment header的,你根据dsi那个课程dump总结主来的?

    老熊 Reply:

    @慢马, 主要是DSI402,不过段头本来就不是很复杂,配合dump出来的块,就可以了。

  10. 老熊,如果数据库不能启动,怎么样获的除system外文件的ts# fn rfn bsize blocks bf offset filename呢。

    老熊 Reply:

    @随风, 建议看ODU的使用文档。
    在block size确定的情况下,只需要知道文件名就可以了,前面几项设为0就可以了,比如
    0 0 0 1.dbf
    0 0 0 2.dbf

  11. 多谢老熊,不知道老熊,ODU有这样的功能没,将显示结果输出到一个文件。
    如 unload user sys to sys_tab.txt

    老熊 Reply:

    @随风,
    详细请参考http://www.laoxiong.net/odu下面的文章链接。

Add your comment now