Oracle Odu

http://www.oracleodu.com/cn/

OracleODU

什么是OracleODU?
OracleODU是国内最专业的Oracle数据库恢复团队之一。对于Oracle数据库数据内部构造有深入理解,擅长常规和非常规方式下的Oracle数据库恢复。如果您的数据库不幸遇到了数据损坏而不能正常工作,在没有备份或有效备份,或者常规恢复失效的情况下,我们或许是您最后的恢复机会。

什么是ODU?
ODU全称为Oracle Database Unloader,是由OracleODU开发的类似于Oracle的DUL(Oracle内部著名的数据库恢复工具)的一款恢复软件,用于直接从Oracle数据库的数据文件中获取表数据。在各种原因造成的数据库不能打开时,用于抢救数据,最大限度地减少数据丢失。ODU已经多次成功应用于产品环境下Oracle数据库的恢复,迄今为止,依然保持100%的恢复成功率。在一些实际的恢复案例中,DUL并不能将所有的重要数据都恢复出来(或者恢复出来的CLOB数据是乱码),但ODU却可以。

ODU的主要功能点:

不需要运行Oracle数据库软件,ODU直接读取数据库文件解析数据。
支持ASM,能够直接从ASM磁盘中导出数据,即使相关的磁盘组不能成功mount
支持从ASM中直接抽取出数据文件和其他任意存储在ASM中的文件(包括控制文件、日志文件和归档日志等),即使相关的磁盘组不能成功mount
支持的Oracle数据库版本包括7,8i,9i,10g,11g
支持多种平台的数据库,包括AIX、LINUX、HPUX、SOLARIS、WINDOWS等。能够在一个平台上导出其他平台的数据,比如在Windows 32位系统上,使用AIX系统上的数据文件导出数据。
支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+)
全面支持LOB字段:
支持CLOB、NCLOB和BLOB
CLOB支持Big Endian和Little Endian字节序
支持LOB分区,子分区
支持同一个表中,不同LOB列使用不同CHUNK SIZE的情况
CLOB数据可以导出到与其他列相同的文件中,或存储到单独的文件
LOB列在没有SYSTEM表空间的情况下仍然能够导出
LOB列在相关的lob index损坏的情况下依然能够导出
支持各种表,包括普通的HEAP表,IOT表和聚簇(CLUSTER)表
支持IOT表:
支持普通IOT表的导出
支持压缩IOT表的导出
支持IOT表溢出段
支持IOT表分区(包括子分区)
只能在有SYSTEM表空间时才能导出IOT表
支持压缩表
支持表被truncate后的数据恢复
支持表被drop后的数据恢复
在有SYSTEM表空间的情况下,自动获取数据字典信息
支持在没有SYSTEM表空间和数据字典损坏的情况下恢复数据,在没有数据字典可用时,ODU能够自动判断数据的类型
支持10g及以上的大文件(BigFile)表空间
全面支持64位系统,支持超过4G大小的数据文件。
支持复制操作系统命令不能复制的坏文件
支持同一个库中不同块大小的数据文件。
支持多种字符集之间的转换,能够正确的转换CLOB、NCLOB、NVARCHAR2列类型的数据到指定的字符集。
自动检测数据文件的表空间号和文件号
导出的数据格式包括纯文本和DMP文件两种。以纯文本导出时,能够自动生成建表的SQL语句和SQL*Loader导入所需的control文件
模拟Oracle的dump块功能,能够dump数据文件中的数据块
支持DESC表,以显示表的列定义
支持列出表的分区和子分区
ODU目前不支持的功能:

11g的SecureFiles
使用Oracle TDE加密的数据

ODU配置文件详解

http://www.laoxiong.net/odu_config_explain.html

本文将以ODU 3.0.2版的配置文件为例,详细介绍ODU的配置参数,从配置文件也可以体会到ODU的众多功能特点。
ODU默认的配置文件是config.txt,在启动ODU时,会自动打开这个配置文件,当然在进入ODU后,仍然可以通过”load config [config filename]“命令来装入配置文件,这个命令中的config filename(配置文件名)是可选的,如果省略此项,将载入默认的配置文件config.txt。
配置文件是一个纯文本文件,每行为一个配置参数,为“参数名”和“值”,二者均不区分大小写,之间以若干空格分隔。下面是一个配置文件的内容示例:
byte_order little
block_size 8192
data_path data
lob_path /lob
charset_name ZHS16GBK
ncharset_name AL16UTF16
output_format text
lob_storage infile
clob_byte_order little
delimiter |
unload_deleted no
下面将详细介绍每一项配置参数的用法以及作用:
1. BYTE_ORDER
这个参数,指示数据文件平台字节序。可选值为“LITTLE”和”BIG”,默认值为“LITTLE”。
这个参数跟ODU运行在哪个平台无关,而只与数据文件的平台有关。比如,数据文件是AIX平台上的,那么这个值就是“BIG”,而数据文件是x86平台上的,那么这个值就是”LITTLE“。ODU能够跨平台恢复数据,比如可以将AIX上的Oracle数据文件复制到Windows上,由Windows版本上的ODU进行恢复,反之亦然。只要通过BYTE_ORDER这个参数正确地指示数据文件的平台,即可实现跨平台恢复。
2. BLOCK_SIZE
这个参数设置数据文件缺省的块大小。ODU支持同一数据库具有不同块大小数据文件,如果在ODU的control文件中没有没文件指定块大小(参见《ODU命令详解 PartI》中“open”命令),则使用配置文件中的BLOCK_SIZE指定的大小。这个参数可选的值有2048、4096、8192、16384、32768,默认值是8192。
3. DATA_PATH
DATA_PATH指定恢复的数据所存储的目录,如果需要恢复的数量量非常大,可以用这个参数值指定一个与ODU软件所在目录不同的路径。注意这个参数指定的目录必须是已经存在的,ODU不会自动创建这个目录。
可以使用相对路径,也可以使用绝对路径。默认值为”data“,表示恢复的数据默认放在ODU软件所在目录的data子目录中。
4. LOB_PATH
LOB_PATH指定恢复的LOB类型的数据所存储的目录。由于LOB数据一般非常消耗空间,因此可以通过这个参数把LOB数据放到与普通数据不同的目录。默认值为空,表示将LOB数据与普通数据放置在同一目录下,也就是DATA_PATH参数指定的目录。这个参数只有以恢复数据保存为文本文件(text)格式时才起作用,而以dmp格式时不会起作用。另外,即使时文本格式,如果LOB_STORAGE参数设置为INFILE,那么CLOB类型的数据会与普通的数据保存在同一个文件中,不会单独存储。值得注意的是,这个参数值不为空时,其设置的值应为”绝对路径“,否则在用SQLLDR导入恢复的数据时,将不能正确地找到LOB数据。
5. OUTPUT_FORMAT
OUTPUT_FORMAT参数指定恢复的数据保存的文件格式,目前支持的格式有TEXT和DMP两种,保存为TEXT格式时,ODU同时为数据生成建表的SQL和供SQLLDR导入数据需要的CTL文件。如果保存为DMP格式,则ODU使用与Oracle 8i兼容的DMP文件格式,可以使用imp工具导入恢复的数据。恢复的每一个表生成一个TEXT文件或DMP文件,不支持多个表存储在同一个DMP文件中,也不支持一个表分成几个部分保存在多个DMP文件中。此参数默认值为”TEXT“。
6. LOB_STORAGE
LOB_STORAGE参数指定LOB数据的存储位置以及是否要恢复LOB数据。这个参数可选的值有:FILE、INFILE、NONE,默认值为INFILE。值为NONE表示在恢复数据时,不恢复LOB数据。INFILE表示在以文本(TEXT)文件存储恢复数据时,CLOB列的数据与普通数据存储在同一文件中,BLOB数据不受此参数影响。FILE表示在以文本文件存储恢复数据时,CLOB列的数据存储在单独的文件中,在普通的数据文件中只存储了LOB数据所存储的文件名。BLOB列始终存储在单独的文件中,除非LOB_STORAGE设置为NONE,在这种情况下将不恢复LOB数据。在LOB列存储为单独的文件时,每一行的每个LOB列数据,存储为一个文件。
7. CLOB_BYTE_ORDER
CLOB_BYTE_ORDER参数指定CLOB列数据的字节序。由于CLOB列数据在数据块中以UNICODE编码存储,需要正确设置此参数才能将CLOB列数据转换为客户端数据。可选的值有”LITTLE”和”BIG”,默认值为”BIG“。从Oracle 10g开始,CLOB数据全部以big endian字节序存储,所以在10g以及以上版本,所有平台上应应该将此参数设置为”BIG“。9i及以下版本的数据文件,根据数据文件平台,设置为不同的值,比如x86平台上的应设置为”LITTLE”。注意,此参数与BYTE_ORDER一样,与ODU本身运行的平台无关,而只与数据文件的平台有关系。
8. CHARSET_NAME和NCHARSET_NAME
这两个参数主要用于标明要恢复的数据,其字符集与国家字符集,也就是数据库的NLS_CHARACTERSET和NLS_NCHAR_CHARACTERSET两个参数的设置。ODU在恢复数据时,将NCHAR、NVARHCAR2类型的列数据,从NCHARSET_NAME指定的字符集编码转换为CHARSET_NAME所指定的字符集编码,同时将CLOB转换为CHARSET_NAME所指定的字符集编码。不正确的设置将导致以上几种类型的列数据在恢复后是乱码。这两个参数的取值,其值名称与ORACLE数据库中的一值,CHARSET_NAME默认值为”ZHS16GBK”,NCHARSET_NAME默认值为”AL16UTF16″。ODU目前不支持所有的字集值,主要包括US7ASCII、ZHS16GBK、UTF8、AL16UTF16、ZHS16CGB231280这五种。在ODU中可以使用命令“CHARSET LIST”命令查看ODU当前版本所支持的字符集编码。
9. DELIMETER
DELIMITER指定以TEXT格式恢复数据时,列之间的分隔符。默认值为“|”(竖线)。由于字符型数据可能包含这个字符,可以将这个参数设为一个其他不会在数据出现的字符(比如某个特殊的符号)。分隔符可以指定为字符串,而不仅仅是一个单字符。比如,可以指定为“||”等。
10. UNLOAD_DELETED
UNLOAD_DELETED参数指定是否恢复已经被DELETE的行。可选的值为’YES”和“NO”,默认值为“NO”。这个参数用于在意外DELETE重要数据之后,并且不能够利用闪回查询,备份和logminer进行恢复,同时被DELETE的数据原来所在的空间没有被重用(覆盖)的情况下,恢复被DELETE掉的数据。由于不能判断DELETE的时间,因此利用这个功能恢复数据时,会恢复所有曾经DELETE的数据,另外,在某些情况下可能会导致ODU异常。因此,这个参数在大多数情况下应该设置为”NO“。

ODU命令详解 PartI

ODUmanual ODU2月 12th, 2009
本文将介绍ODU支持的命令,以v2.3.0为基础详细描述ODU的命令。
odu的命令以回车为结束,而不是像SQLPLUS那样的使用“;”号
1. help命令
help命令,显示ODU支持的命令列表,每个命令后面有简短描述:
ODU> help
help — get command list
exit -
- exit from odu
spool — spool information to file
host -
- enter os terminal
load config — load config information from file
open -
- load database filename list from file
osdump — dump file format hex
dump -
- dump oracle datafile block
rowid — decode rowid components
unload -
- unload data
scan — scan extent or segment
list -
- list schema object,partition,datafile
charset —— get or list supported charset name
在执行一个命令时,如果输入的命令格式不对,将会提示那个命令的命令格式。
2. load config命令
load config命令用于载入ODU的配置文件。命令格式如下:
load config [filename]
缺省的文件名是config.txt
ODU在启动时,会自动载入名为config.txt的配置文件。我将撰文专门介绍ODU的配置文件。
ODU启动后,也可以重新载入配置文件,载入新配置后,会立即生效。
下面是一个示例:
ODU> load config
byte_order little
block_size 8192
db_timezone -7
client_timezone 8
data_path data
lob_path lob
charset_name ZHS16GBK
ncharset_name AL16UTF16
output_format text
lob_storage infile
clob_byte_order little
trace_level 4
delimiter |
load control file ‘config.txt’ successful

3. open命令
open命令打开控制文件,这个控制文件类似于oracle的控制文件,存储了数据文件的信息。缺省的控制文件名是control.txt。该命令的格式如下:
open [filename]
如果不指定filename,则文件名缺省为control.txt
控制文件的格式如下:
表空间号 文件号 相对文件号 文件名 块大小 是否大文件表空间 文件头偏移量
这七项内容之间以一个或多个空格分隔。前四项是必填项,后三项是可填项。
块大小的有效值为2048, 4096, 8192, 16384, 32768
是否大文件表空间的有效值为yes,no,y,n如果不指定,默认值为no
文件头偏移量以字节为单位,一般来说,低版本的AIX所创建的裸设备有4K的偏移量,对于新版本的AIX,如果所建的VG为Scalable的,则偏移量为0。如果是BIG VG,建LV时指定了”-T O“,偏移量为0,否则为4096字节。Tru64系统上的裸设备偏移量为64K。
如果不指定文件头偏移量,则默认值为0。
如果文件头是完好的,则ODU会自动识别”表空间号,文件号和相对文件号“,因此这三项可通通填为0。
ODU启动时,自动加载默认的控制文件control.txt。ODU启动后,如果修改了control.txt,则可以使用此命令再次打开控制文件。
下面是一个示例:
ODU> open
ts# fn rfn bsize blocks bf offset filename
— -- — --- — -- ----------
0 1 1 4096 128000 N 0 D:\ORACLE\ORADATA\XJ\SYSTEM01.DBF
1 2 2 4096 51200 N 0 D:\ORACLE\ORADATA\XJ\UNDOTBS01.DBF
3 3 3 4096 5120 N 0 D:\ORACLE\ORADATA\XJ\DRSYS01.DBF
4 4 4 4096 37280 N 0 D:\ORACLE\ORADATA\XJ\EXAMPLE01.DBF
5 5 5 4096 6400 N 0 D:\ORACLE\ORADATA\XJ\INDX01.DBF
6 6 6 4096 5120 N 0 D:\ORACLE\ORADATA\XJ\ODM01.DBF
7 7 7 4096 5120 N 0 D:\ORACLE\ORADATA\XJ\TOOLS03.DBF
7 8 8 4096 512 N 0 D:\ORACLE\ORADATA\XJ\TOOLS02.DBF
9 9 9 4096 9760 N 0 D:\ORACLE\ORADATA\XJ\XDB01.DBF
11 10 10 2048 56655 N 0 D:\ORACLE\ORADATA\XJ\TEST01.DBF
14 11 11 16384 256 N 0 D:\ORACLE\ORADATA\XJ\K16.DBF
load control file ‘control.txt’ successful
控制文件打后,显示的信息,分别是”表空间号,(绝对)文件号,相对文件号,块大小,文件块数,是否大文件表空间,文件头偏移量,文件名

ODU命令详解 PartII

ODUmanual ODU2月 19th, 2009
接上文《ODU命令详解 PartI》,本文继续介绍ODU的命令
4.unload 命令
unload命令是ODU中命令格式最复杂的命令,但也是最关键的命令。命令的格式如下:
unload dict
unload table <schema.tablename> [partition <partition_name>]
unload table <schema.tablename> object <data_obj_id> [tablespace <ts_no>]
unload object <data_obj_id> [cluster <cluster_no>] [tablespace <ts_no>] column <type[,type,type……]>
type: VARCHAR2 VARCHAR CHAR NUMBER SKIP LONG RAW
DATE LONGRAW TIMESTAMP TIMESTAMPTZ TIMESTAMPLTZ
BINARY_FLOAT BINARY_DOUBLE
unload user <schema name>
1) unload dict
unload dict用于从SYSTEM表空间解析数据字典,并将ODU所需要的数据字典数据保存到user.odu,tab.odu,obj.odu,col.odu,ind.odu等文件中。这样,ODU就可以利用数据字典信息UNLOAD数据。对于在有数据字典的情况下,ODU的功能能够得到最大程度地发挥:全面支持IOT表,全面支持LOB类型。
ODU> unload dict
get_bootstrap_dba: compat header size:12
CLUSTER C_USER# file_no: 1 block_no: 177
TABLE OBJ$ file_no: 1 block_no: 241
CLUSTER C_OBJ# file_no: 1 block_no: 49
CLUSTER C_OBJ# file_no: 1 block_no: 49
found IND$’s obj# 19
found IND$’s dataobj#:2,ts#:0,file#:1,block#:49,tab#:3
found TABPART$’s obj# 230
found TABPART$’s dataobj#:230,ts#:0,file#:1,block#:3313,tab#:0
found INDPART$’s obj# 234
found INDPART$’s dataobj#:234,ts#:0,file#:1,block#:3377,tab#:0
found TABSUBPART$’s obj# 240
found TABSUBPART$’s dataobj#:240,ts#:0,file#:1,block#:3473,tab#:0
found INDSUBPART$’s obj# 245
found INDSUBPART$’s dataobj#:245,ts#:0,file#:1,block#:3553,tab#:0
found IND$’s obj# 19
found IND$’s dataobj#:2,ts#:0,file#:1,block#:49,tab#:3
found LOB$’s obj# 156
found LOB$’s dataobj#:2,ts#:0,file#:1,block#:49,tab#:6
found LOBFRAG$’s obj# 258
found LOBFRAG$’s dataobj#:258,ts#:0,file#:1,block#:3761,tab#:0
值得注意的是,ODU并不是从文件号为1的数据文件中得到bootstrap地址进而得到数据字典,而是从control.txt的第一行中得到bootstrap地址。所以,需要将SYSTEM表空间中的第1个数据文件放置于control.txt中的第1行。否则会得到如下的错误:
can not get bootstrap$ address from SYSTEM tablespace
得到数据字典后,你可以使用list user, list table等命令查看数据库中的用户及用户下的表、视图等对象。
2) unload table <schema .tablename> [partition <partition_name>]
这个命令格式用于导出某个用户下的表,如果指定了partition,则只导出分区表中的那个分区。例如:
ODU> unload table sys.t1
Unloading table: T1,object ID: 31417
Unloading segment,storage(Obj#=31417 DataObj#=31418 TS#=0 File#=1 Block#=83041 Cluster=0)
导出表时,会显示表名,对象ID(Object ID),以及导出段的段头等信息。
使用此命令,表名要使用表的全限定名,则“用户名”+“表名“。
3) unload table <schema.tablename> object <data_obj_id> [tablespace <ts_no>]
此命令格式与上一命令格式的差别在于,在导出的表名之后指定了数据对象ID(data object id),这用于导出表其实际data object id与数据字典中表的data object id不一致时的表数据。简单点说,就是用于导出被truncate的表数据。导出前需要用SCAN命令扫描数据文件,导出truncate表的数据的详细操作,将另行撰文说明。
4) unload object <data_obj_id> [cluster <cluster_no>] [tablespace <ts_no>] column <type[,type,type……]>
这条命令简单点说,就是用于没有SYSTEM表空间或者没有数据字典时的数据导出,或用于导出被DROP了的表。
这条命令中,列类型为以下:
VARCHAR2 VARCHAR CHAR NUMBER SKIP LONG RAW
DATE LONGRAW TIMESTAMP TIMESTAMPTZ TIMESTAMPLTZ
BINARY_FLOAT BINARY_DOUBLE
SKIP表示不导出那个列。目前不支持没有数据字典(和SYSTEM表空间)时的IOT表和LOB类型的列。导出前需要用SCAN命令扫描数据文件。
此条命令和上条命令中,为啥可以指定TABLESPACE,这是因为在一个数据库中,data object id可能不是唯一的。比如,使用了表空间传输就可能会有这样的情况。
后面将专门有文章描述如何在没有数据字典时导出数据。这是一个比较复杂的过程,所以此处只是介绍一下命令,不再详述。
5) unload user <schema name>
此命令格式用于导出一个用户下的所有表。此命令在有数据字典时才支持。这样简化了导出一个用户下所有的表的操作。

ODU命令详解 PartIII

ODUmanual ODU3月 3rd, 2009
接上文《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=0×0b (file header)
block format=0×02 (oracle 8 or 9)
block rdba=0×00400001 (file#=1, block#=1)
scn=0×0000.00000000, seq=1, tail=0×00000b01
block checksum value=0xcfe5=53221, flag=4
File Header:
Db Id=0xb0f1f85c=2968647772, Db Name=XJ, Root Dba=0×400341
Software vsn=0×9200000, Compatibility Vsn=0×8000000, File Size=0×1f400=128000 Blocks
File Type=0×3 (data file), File Number=1, Block Size=4096
Tablespace #0 - SYSTEM rel_fn:1
get_bootstrap_dba: compat header size:12
bootstrap rdba 0×004002f1 rfile#=1 block#=753
dump数据段头:
ODU> dump datafile 10 block 45
Block Header:
block type=0×23 (ASSM segment header block)
block format=0×02 (oracle 8 or 9)
block rdba=0×0280002d (file#=10, block#=45)
scn=0×0000.00209d2c, seq=3, tail=0×9d2c2303
block checksum value=0×7247=29255, flag=4
Data Segment Header:
Extent Control Header
-------------
Extent Header:: extents: 1 blocks: 5
last map: 0×00000000 #maps: 0 offset: 668
Highwater:: 0×02800030 (rfile#=10,block#=48)
ext#: 0 blk#: 5 ext size:5
#blocks in seg. hdr’s freelists: 0
#blocks below: 2
mapblk: 0×00000000 offset: 0
------------
Low HighWater Mark :
Highwater:: 0×02800030 ext#: 0 blk#: 5 ext size: 5
#blocks in seg. hdr’s freelists: 0
#blocks below: 2
mapblk 0×00000000 offset: 0
Level 1 BMB for High HWM block: 0×0280002b
Level 1 BMB for Low HWM block: 0×0280002b
------------
Segment Type: 1 nl2: 1 blksz: 2048 fbsz: 0
L2 Array start offset: 0×00000434
First Level 3 BMB: 0×00000000
L2 Hint for inserts: 0×0280002c
Last Level 1 BMB: 0×0280002b
Last Level 1I BMB: 0×0280002c
Last Level 1II BMB: 0×00000000
Map Header:: next 0×00000000 #extents: 1 obj#: 31208 flag: 0×220000000
Extent Map
-------------
0×0280002b length: 5
Auxillary Map
-------------
Extent 0 : L1 dba: 0×0280002b Data dba: 0×0280002e
-------------
Second Level Bitmap block DBAs
-------------
DBA 1: 0×0280002c
dump数据块:
ODU> dump datafile 10 block 47
Block Header:
block type=0×06 (table/index/cluster segment data block)
block format=0×02 (oracle 8 or 9)
block rdba=0×0280002f (file#=10, block#=47)
scn=0×0000.00209f21, seq=1, tail=0×9f210601
block checksum value=0xc8d=3213, flag=6
Data Block Header Dump:
Object id on Block? Y
seg/obj: 0×79e8=31208 csc: 0×00.209d2c itc: 2 flg: E typ: 1 (data)
brn: 0 bdba: 0×280002b ver: 0×01
Itl Xid Uba Flag Lck Scn/Fsc
0×01 0×000a.008.000006a4 0×008018c1.00e0.13 U- 2 fsc 0×0000.00209f21
0×02 0×0000.000.00000000 0×00000000.0000.00 -
- 0 fsc 0×0000.00000000
Data Block Dump:

flag=0×0 --
ntab=1
nrow=2
frre=-1
fsbo=0×16
ffeo=0×6e7
avsp=0×6fc
tosp=0×6fc
0xe:pti[0] nrow=2 offs=0
0×12:pri[0] offs=0×76d
0×14:pri[1] offs=0×6e7
Block Rows Dump:
tab 0, row 0, @0×76d
fb: —H-FL
lb: 0×1 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, @0×6e7
fb: H-FL lb: 0×1 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
-0123456789abcde—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