ASM Disk Header
每个ASM磁盘有一个disk header。disk header它标识了磁盘属于ASM磁盘,disk header占用了每个磁盘的第一个allocation unit(AU 0)中的第一个块(block 0)。disk header条目包括以下内容:
1.disk name
2.disk number
3.diskgroup name
4.failure group name
5.disk size
6.allocation unit(AU) size
7.creation time
8.mount time
9.ASM compatibility
10.RDBMS compatibility
11.file directory pointer
12.ASMLIB reserved block
这些内容从它们的名字就可以知道其作用。如果在特定的磁盘组中有两个磁盘都要使用相同的磁盘名称与磁盘号,那么在mount磁盘组时mount time与creation time被用来决定选择正确的磁盘。这种情况可能出现在一个磁盘临时出现故障而向磁盘组中添加另一块磁盘。
ASM compatibility指示mount磁盘组的ASM实例的最小软件版本。Oracle 10g软件总是使用10.1。录compatible.asm属性被推进到11.1后,ASM将在PST中存储版本号,但也会更新磁盘组中的disk headers来确保Oracle 10g软件将不能访问不兼容的磁盘组。
RDBMS compatibility指示RDBMS实例访问磁盘组兼容性参数的最小设置。这个值在disk header中将总是10.1。Oracle 10g软件从不更新这个值,并且如果compatible.asm设置为11.1或更高,Oracle 11g软件将对于RDBMS compatibility询问属性目录。
如果磁盘包含文件目录,那么file directory pointer描述了文件目录的第一个区所在位置。对于引导虚拟ASM元数据这个指针是需要的。
ASMLIB供应商可以在disk header中的ASMLIB保留块中存储达32 bytes的信息。Oracle的ASMLIB在这里存储了磁盘的ASMLIB名称。
因为disk header是磁盘特定的,在另一磁盘上对它进行镜像没有意义。磁盘目录包含了与disk header相同的信息。执行alter diskgroup … check命令可以验证磁盘目录与disk header的一致性
ASM磁盘是以AU为单位进行格式化的,部分AU会存放ASM元数据,其他AU存放数据库中的相关数据(如数据文件、备份文件、归档文件等等)。包含ASM元数据的AU会以元数据块的方式进行格式化(一个元数据块的大小为4K)。AU0位于ASM磁盘的起始位置,它始终用于存储ASM元数据。AU0的第一个块,即block 0,就是ASM的磁盘头。ASM 磁盘头的大部分内容仅与本磁盘相关,但也有部分信息与整个磁盘组相关,有些甚至于与整个cluster相关。
在10g中查询会得到如下结果
SQL> SELECT number_kffxp file#, disk_kffxp disk#,COUNT(disk_kffxp) extents FROM x$kffxp WHERE group_kffxp=1 AND disk_kffxp <>65534 GROUP BY number_kffxp, disk_kffxp; FILE# DISK# EXTENTS ---------- ---------- ---------- 1 0 1 1 1 1 2 0 1 2 1 1 3 0 6 3 1 6 4 0 1 4 1 1 5 0 1 5 1 1 6 0 1 6 1 1 256 0 29 256 1 29 257 0 35 257 1 35 258 0 3 258 1 3 259 0 1 259 1 1 260 0 1 260 1 1 261 0 4 261 1 4 262 0 4 262 1 4 263 0 2 263 1 2 264 0 7 264 1 7 265 0 4 265 1 4 266 0 4 266 1 4 267 0 4 267 1 4 268 0 1 268 1 1 269 0 7 269 1 7 270 0 1 270 1 1 42 rows selected.
上述查询的file信息,对于10g版本中asm所涉及的元数据信息,对应关系如下:
file# 1 ---ASM file 1,file directory file# 2 ---ASM file 2,disk directory file# 3 ---ASM file 3,active Change Directory(ACD) file# 4 ---ASM file 4,continuing Operations Directory (COD) file# 5 ---ASM file 5,template directory file# 6 ---ASM file 6,alias directory
File Directory
文件目录包含与ASM文件相关的所有元数据。目录对于每个ASM文件都有一个条目并且通过文件号来进行索引。文件目录在每个磁盘组中都是文件号1(F1)。
文件目录包含以下内容:
.Incarnation number .File size .File block size .File type .Redundancy(none,normal,or high) .Striping(coarse or fine-grained) .File creation time .File modification time(the time that the file was last opened for writing)) .File layout
如果一个文件被删除,对于新创建的文件ASM会使用它的文件号,那么文件号将是唯一的,有不同的incarnation号。incarnation号是当文件创建时由时间来推算出来的,它保证对于相同文件号来说incarnation号是唯一的。
ASM文件的块大小是独立于ASM元数据块大小。所有的ASM元数据目录的块大小为4K。RDBMS数据文件在创建表空间时指定的块大小可以是2K,4K,8K,16K或32K。RDBMS的redo log文件通常的块大小是512 byte。ASM跟踪逻辑文件大小,通过数据库,与磁盘组中所占用的物理空间,考虑文件的冗余可以很显然的看出。RDBMS在文件创建时也提供了文件类型。对于不是由RDBMS实例显式创建的文件(比如由XML DB ftp命令或ASMCMD cp命令所创建的文件),ASM为了在创建时判断文件类型会检查文件头。
文件创建时间有一个明显的语义。文件修改时间,然后不是每次更新时间文件都会写入。而是当文件被打开执地写操作时文件修改时间会被更新。这意味着即使文件没有被写入,文件的修改时间也可能发生改变,并且存储的修改时间可能比修改文件内容所处的时间早。为了减小在集群ASM实例中的buffer cache中的文件目录块的竞争,修改时间以小时为精度。因此,在RAC中多个实例以较短时间打开文件,那么只有第一个访问文件的实例需要更新文件修改时间。
文件的布局信息由一系列的区指针组成。区指针指定了磁盘号与区所在的AU号。文件目录条目包含了一个文件的前60个区指针,有时也叫direct extens。文件目录剩余的部分包含了指向indirect extents的指针。indirect extents是其它虚拟元数据区,包含ASM文件的区指针。每个indirect extent是一个AU。每个文件目录条目可以包含最多300个indirect exten。indirect指针的概念存在于大多数传统文件系统中,比如Unix的BSD文件系统。文件布局的解释也叫extent map,文件布局受条带与冗余的影响。
Disk Directory
磁盘目录包含磁于磁盘组中所有磁盘的信息。磁盘目录信息比PST更详细。磁盘组中的每块磁盘通过磁盘号在磁盘目录索引中有一个条目。这个磁盘目录在每个磁盘组中的文件号为2(F2)
Disk Directory条目包含以下内容:
.Disk name .Failure group name .Disk size .Disk free space .Disk creation time
在磁盘目录中的许多信息在磁盘头中也可用。执行alter diskgroup … check可以验证关于磁盘这些结构的详细信息。
磁盘目录当磁盘组被mount时总是可用状态,因此对于正常或高级冗余磁盘组中的脱机磁盘也能提供信息。
Active Change Directory(ACD)
ACD是一个日志允许ASM对多个数据结构执行原子性改变。它类似于RDBMS的重做日志。每个实例将得到一个大小为42MB的ACD大块。每个大块的第一个块包含打开/关闭的状态与检查点。检查点每3秒更新一次。剩下的块被作为ACD改变记录的循环缓存区。ACD为了适应亲的ASM实例并根据需要动态增长。ASM使用ACD来执行崩溃恢复与实例恢复来确保ASM元数据的一致性。ACD在每个磁盘组中的文件号为3(F3)。
Continuing Operations Directory(COD)
COD用来跟踪长时间执行的磁盘组操作,比如文件创建与rebalance操作。长时间执行操作不适用于ACD。COD条目允许ASM在执行长时间操作期间从故障状态恢复。对于实例,ASM可以回滚没有完成的文件创建操作。RDBMS故障或用户操作可能导致这样的情况。对于磁盘的rebalance操作,如果实例执行rebalance失败,ASM可以在正常节点上重启rebalance或者当磁盘组再次在单实例ASM中mount时重启rebalance。COD在每个磁盘组中的文件号为4(F4)。
Template Directory
Template Directory包含关于磁盘组所有文件模板的信息。创建磁盘组时对于每种支持的文件类型将使用缺省的系统模板进行填充。如果用户创建自己的模板将会增加新的条目。模板目录通过模板号进行索引。
每种模板条目包含以下内容:
.Template name .File redundancy .File striping policy .System flag
Template Directory在每个磁盘组中的文件号为5(F5)。缺省模板的模板名与文件类型相关。文件冗余默认为磁盘组冗余。文件条带默认是文件类型特定。system flag被设置为系统模板。用户创建的模板不会设置system flag。
Alias Directory
Alias Directory包含所有别名元数据以及每种系统别名,系统目录,用户目录与用户别名。通过别名号进行索引。
别名目录条目包含以下信息:
.Alias name(or directory name) .Alias incarnation number .File number .File incarnation number .Parent directory .System flag
Alias Directory在每个磁盘组中的文件号为6(F6)。Alias incarnation number,很像file incarnation number,被用来区分可能重复使用相同别名号的别名或目录。system flag被设置给系统创建的别名与目录,但不对用户创建的别名或目录进行设置。
在11gr2中执行以下查询得到如下结果:
SQL> SELECT number_kffxp file#, disk_kffxp disk#,COUNT(disk_kffxp) extents FROM x$kffxp WHERE group_kffxp=3 AND disk_kffxp <>65534 GROUP BY number_kffxp, disk_kffxp; FILE# DISK# EXTENTS ---------- ---------- ---------- 1 0 1 1 1 2 1 2 2 1 3 1 2 0 1 2 1 1 2 2 1 3 0 64 3 1 63 3 2 64 3 3 64 4 0 6 4 1 5 4 2 6 4 3 7 5 0 1 5 1 1 5 3 1 6 1 1 6 2 1 6 3 1 8 0 1 8 1 1 8 2 1 9 1 1 9 2 1 9 3 1 256 0 1 256 1 1 257 0 19 257 1 19 257 2 19 257 3 18 258 0 611 258 1 612 258 2 611 258 3 611 259 0 382 259 1 381 259 2 381 259 3 381 260 0 175 260 1 174 260 2 174 260 3 174 261 0 77 261 1 75 261 2 76 261 3 77 262 0 52 262 1 51 262 2 51 262 3 51 263 0 3 263 1 2 263 2 4 263 3 3 264 0 25 264 1 26 264 2 27 264 3 27 265 0 27 265 1 25 265 2 26 265 3 27 266 0 26 266 1 26 266 2 26 266 3 27 267 0 27 267 1 26 267 2 24 267 3 28 268 0 11 268 1 10 268 2 10 268 3 11 269 1 1 269 2 1 270 0 52 270 1 51 270 2 50 270 3 52 83 rows selected.
可以看到,file 1到9都是元数据信息。前面的file 1到 6与10g中的对应一样,后面的file 7,file 8,file 9为以下内容:
file# 7 —volume directory (使用ACFS才会有) file# 8 —disk Used Space Directory (USD) file# 9 —attributes directory
volume directory
ASM元信息7号文件,是ASM的逻辑卷目录,用于跟踪与ADVM有关的文件。
ASM动态逻辑卷设备是由ASM动态逻辑卷构建的。一个磁盘组中可以配置一个或多个ASM动态逻辑卷设备。ASM集群文件系统通过ADVM接口构建在ASM磁盘组之上。ADVM像数据库一样,也是ASM的一个客户端。当一个逻辑卷被访问时,相应的ASM文件会被打开并且ASM extent的信息会被发送到ADVM驱动。
disk Used Space Directory (USD)
ASM元信息8号文件是磁盘空间使用目录Used Space Directory,简称USD,它记录了每个ASM磁盘组中每个磁盘的每个zone上被使用的AU数。一个磁盘的zone包含hot zone-热区(磁盘外圈)和cold zone-冷区(磁盘内圈)。USD目录为每个磁盘提供了一个条目,条目信息记录了2个zone(COLD和HOT)的AU使用数。USD结构是在11.2版本中引入的,并且与智能数据存放特性有关。USD元数据文件在ASM兼容性参数设置为11.2以上时会存在。
attributes directory
Attributes Directory包含了关于磁盘组属性的元数据。只有当compatible.asm设置为11.1或更高版本时目录才会在磁盘组中存在。Attribute Directory在磁盘组中的文件号为9(F9)(文件号7与8被保留给将来的功能使用,在11g中file 7为volume directory,file 8为disk Used Space Directory (USD))。AU_SIZE属性为了引导实际存储在disk header中。如果compatible.asm
设置为11.1或更高版本那么compatible.asm将会存储在PST中,否则compatible.asm将会被存储在disk header中。在Oracle 11gr1中,compatible.rdbms与disk_repair_time以及compatible.asm被存储在属性目录中。将来的版本将支持额外的属性。
这里将使用kfed工具来查看asm disk header的内容,对于10g首先需要统计kfed工具,如下:
[root@jyrac3 ~]# su - oracle [oracle@jyrac3 ~]$ cd $ORACLE_HOME/rdbms/lib [oracle@jyrac3 lib]$ make -f ins_rdbms.mk ikfed Linking KFED utility (kfed) rm -f /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed gcc -o /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed -L/u01/app/oracle/product/10.2.0/db/rdbms/lib/ -L/u01/app/oracle/product/10.2.0/db/lib/ - L/u01/app/oracle/product/10.2.0/db/lib/stubs/ -L/usr/lib -lirc /u01/app/oracle/product/10.2.0/db/lib/s0main.o /u01/app/oracle/product/10.2.0/db/rdbms/lib/sskfeded.o /u01/app/oracle/product/10.2.0/db/rdbms/lib/skfedpt.o /u01/app/oracle/product/10.2.0/db/rdbms/lib/defopt.o -ldbtools10 -lclntsh `cat /u01/app/oracle/product/10.2.0/db/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /u01/app/oracle/product/10.2.0/db/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lmm -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat /u01/app/oracle/product/10.2.0/db/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /u01/app/oracle/product/10.2.0/db/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 - lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 -lclient10 -lnnetd10 -lvsn10 - lcommon10 -lgeneric10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat /u01/app/oracle/product/10.2.0/db/lib/sysliblist` -Wl,-rpath,/u01/app/oracle/product/10.2.0/db/lib -lm `cat /u01/app/oracle/product/10.2.0/db/lib/sysliblist` -ldl -lm -L/u01/app/oracle/product/10.2.0/db/lib mv -f /u01/app/oracle/product/10.2.0/db/bin/kfed /u01/app/oracle/product/10.2.0/db/bin/kfedO mv /u01/app/oracle/product/10.2.0/db/rdbms/lib/kfed /u01/app/oracle/product/10.2.0/db/bin/kfed chmod 751 /u01/app/oracle/product/10.2.0/db/bin/kfed
[oracle@jyrac3 lib]$ which kfed /u01/app/oracle/product/10.2.0/db/bin/kfed [oracle@jyrac3 lib]$ cd /u01/app/oracle/product/10.2.0/db/bin/kfed -bash: cd: /u01/app/oracle/product/10.2.0/db/bin/kfed: Not a directory
[oracle@jyrac3 lib]$ kfed -h as/mlib ASM Library [asmlib='lib'] aun/um AU number to examine or update [AUNUM=number] aus/z Allocation Unit size in bytes [AUSZ=number] blkn/um Block number to examine or update [BLKNUM=number] blks/z Metadata block size in bytes [BLKSZ=number] ch/ksum Update checksum before each write [CHKSUM=YES/NO] cn/t Count of AUs to process [CNT=number] d/ev ASM device to examine or update [DEV=string] o/p KFED operation type [OP=READ/WRITE/MERGE/REPAIR/NEW/FORM/FIND/STRUCT] p/rovnm Name for provisioning purposes [PROVNM=string] s/eek AU number to seek to [SEEK=number] te/xt File name for translated block text [TEXT=string] ty/pe ASM metadata block type number [TYPE=number]
11gR2版本中的kfed工具,你会发现其更为强大了,还具有修复功能,在11gR2中你可以直接使用kfed修复disk header block,如下(11gR2中是不需要编译即可使用的)
[grid@jyrac1 ~]$ kfed -h as/mlib ASM Library [asmlib='lib'] aun/um AU number to examine or update [AUNUM=number] aus/z Allocation Unit size in bytes [AUSZ=number] blkn/um Block number to examine or update [BLKNUM=number] blks/z Metadata block size in bytes [BLKSZ=number] ch/ksum Update checksum before each write [CHKSUM=YES/NO] cn/t Count of AUs to process [CNT=number] de/v ASM device to examine or update [DEV=string] dm/pall Don't suppress repeated lines when dumping corrupt blocks [DMPALL=YES/NO] o/p KFED operation type [OP=READ/WRITE/MERGE/REPAIR/NEW/FORM/FIND/STRUCT] p/rovnm Name for provisioning purposes [PROVNM=string] s/eek AU number to seek to [SEEK=number] te/xt File name for translated block text [TEXT=string] ty/pe ASM metadata block type number [TYPE=number]
下面使用kfed来查看ASM磁盘头的内容:
10g操作如下:
查询磁盘组相关磁盘信息
SQL> select group_number,disk_number,name,path,redundancy from v$asm_disk; GROUP_NUMBER DISK_NUMBER NAME PATH REDUNDANCY ------------ ----------- ------------------------------ ------------------------------ -------------- 0 1 /dev/raw/raw1 UNKNOWN 0 5 /dev/raw/raw2 UNKNOWN 1 1 DATADG_0001 /dev/raw/raw4 UNKNOWN 2 0 YBDG_0000 /dev/raw/raw5 UNKNOWN 2 1 YBDG_0001 /dev/raw/raw6 UNKNOWN 1 0 DATADG_0000 /dev/raw/raw3 UNKNOWN 6 rows selected.
查询磁盘组相关信息,可以看到ASM磁盘组的块大小为4096 byte,也就是4K,AU大小为16777216 byte,也就是16M
SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup; GROUP_NUMBER NAME BLOCK_SIZE ALLOCATION_UNIT_SIZE ------------ ------------------------------ ---------- -------------------- 1 DATADG 4096 16777216 2 YBDG 4096 16777216
磁盘组1为DATADG用来存储数据库相关文件,它包含两块磁盘/dev/raw/raw3与/dev/raw/raw4,磁盘头存储在AU0的第一个块,即block 0
[oracle@jyrac3 lib]$ kfed read /dev/raw/raw3 aun=0 blkn=0 kfbh.endian: 1 ; 0x000: 0x01 --01即使1 表示的是Little Endian 相反,0的话即使表示BIG endian kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD --表示块类型为磁盘头 kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0 --表示ASM块号,0表示ASM磁盘头块 kfbh.block.obj: 2147483648 ; 0x008: TYPE=0x8 NUMB=0x0 kfbh.check: 2110140068 ; 0x00c: 0x7dc62ea4 kfbh.fcn.base: 0 ; 0x010: 0x00000000 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8 --ASMLIB磁盘是ORCLDISK+磁盘名,非ASMLIB磁盘是ORCLDISK kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000 kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000 kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000 kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000 kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000 kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000 kfdhdb.compat: 168820736 ; 0x020: 0x0a100000 kfdhdb.dsknum: 0 ; 0x024: 0x0000 --ASM磁盘编号 kfdhdb.grptyp: 2 ; 0x026: KFDGTP_NORMAL --磁盘组冗余方式为正常冗余 kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER --磁盘header 状态 3是可用状态 kfdhdb.dskname: DATADG_0000 ; 0x028: length=11 --ASM磁盘名 kfdhdb.grpname: DATADG ; 0x048: length=6 --ASM磁盘组名 kfdhdb.fgname: DATADG_0000 ; 0x068: length=11 --ASM故障组名 kfdhdb.capname: ; 0x088: length=0 kfdhdb.crestmp.hi: 33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0 kfdhdb.crestmp.lo: 431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6 kfdhdb.mntstmp.hi: 33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0 kfdhdb.mntstmp.lo: 2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a kfdhdb.secsize: 512 ; 0x0b8: 0x0200 kfdhdb.blksize: 4096 ; 0x0ba: 0x1000 --ASM元数据块大小,单位是byte,大小为4K kfdhdb.ausize: 16777216 ; 0x0bc: 0x01000000 --au单位大小,单位是byte,大小为16M kfdhdb.mfact: 454272 ; 0x0c0: 0x0006ee80 kfdhdb.dsksize: 320 ; 0x0c4: 0x00000140 --该disk的大小,单位是au,由于au是16m,所以大小为5G kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002 kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001 --指针指向ASM的空闲空间表,1代表本AU中的ASM块1 kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002 --指针指向ASM的分配表,2代表本AU中的ASM块2 kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 --指针指向ASM的文件目录,2代表本ASM磁盘的AU2 kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000 kfdhdb.redomirrors[1]: 0 ; 0x0da: 0x0000 kfdhdb.redomirrors[2]: 0 ; 0x0dc: 0x0000 kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000 kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000 --最小的数据库兼容版本,0x0a100000=10.1 kfdhdb.grpstmp.hi: 33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0 kfdhdb.grpstmp.lo: 428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6 kfdhdb.ub4spare[0]: 0 ; 0x0ec: 0x00000000 kfdhdb.ub4spare[1]: 0 ; 0x0f0: 0x00000000 kfdhdb.ub4spare[2]: 0 ; 0x0f4: 0x00000000 kfdhdb.ub4spare[3]: 0 ; 0x0f8: 0x00000000 kfdhdb.ub4spare[4]: 0 ; 0x0fc: 0x00000000 kfdhdb.ub4spare[5]: 0 ; 0x100: 0x00000000 kfdhdb.ub4spare[6]: 0 ; 0x104: 0x00000000 kfdhdb.ub4spare[7]: 0 ; 0x108: 0x00000000 kfdhdb.ub4spare[8]: 0 ; 0x10c: 0x00000000 kfdhdb.ub4spare[9]: 0 ; 0x110: 0x00000000 kfdhdb.ub4spare[10]: 0 ; 0x114: 0x00000000 kfdhdb.ub4spare[11]: 0 ; 0x118: 0x00000000 kfdhdb.ub4spare[12]: 0 ; 0x11c: 0x00000000 kfdhdb.ub4spare[13]: 0 ; 0x120: 0x00000000 kfdhdb.ub4spare[14]: 0 ; 0x124: 0x00000000 kfdhdb.ub4spare[15]: 0 ; 0x128: 0x00000000 kfdhdb.ub4spare[16]: 0 ; 0x12c: 0x00000000 kfdhdb.ub4spare[17]: 0 ; 0x130: 0x00000000 kfdhdb.ub4spare[18]: 0 ; 0x134: 0x00000000 kfdhdb.ub4spare[19]: 0 ; 0x138: 0x00000000 kfdhdb.ub4spare[20]: 0 ; 0x13c: 0x00000000 kfdhdb.ub4spare[21]: 0 ; 0x140: 0x00000000 kfdhdb.ub4spare[22]: 0 ; 0x144: 0x00000000 kfdhdb.ub4spare[23]: 0 ; 0x148: 0x00000000 kfdhdb.ub4spare[24]: 0 ; 0x14c: 0x00000000 kfdhdb.ub4spare[25]: 0 ; 0x150: 0x00000000 kfdhdb.ub4spare[26]: 0 ; 0x154: 0x00000000 kfdhdb.ub4spare[27]: 0 ; 0x158: 0x00000000 kfdhdb.ub4spare[28]: 0 ; 0x15c: 0x00000000 kfdhdb.ub4spare[29]: 0 ; 0x160: 0x00000000 kfdhdb.ub4spare[30]: 0 ; 0x164: 0x00000000 kfdhdb.ub4spare[31]: 0 ; 0x168: 0x00000000 kfdhdb.ub4spare[32]: 0 ; 0x16c: 0x00000000 kfdhdb.ub4spare[33]: 0 ; 0x170: 0x00000000 kfdhdb.ub4spare[34]: 0 ; 0x174: 0x00000000 kfdhdb.ub4spare[35]: 0 ; 0x178: 0x00000000 kfdhdb.ub4spare[36]: 0 ; 0x17c: 0x00000000 kfdhdb.ub4spare[37]: 0 ; 0x180: 0x00000000 kfdhdb.ub4spare[38]: 0 ; 0x184: 0x00000000 kfdhdb.ub4spare[39]: 0 ; 0x188: 0x00000000 kfdhdb.ub4spare[40]: 0 ; 0x18c: 0x00000000 kfdhdb.ub4spare[41]: 0 ; 0x190: 0x00000000 kfdhdb.ub4spare[42]: 0 ; 0x194: 0x00000000 kfdhdb.ub4spare[43]: 0 ; 0x198: 0x00000000 kfdhdb.ub4spare[44]: 0 ; 0x19c: 0x00000000 kfdhdb.ub4spare[45]: 0 ; 0x1a0: 0x00000000 kfdhdb.ub4spare[46]: 0 ; 0x1a4: 0x00000000 kfdhdb.ub4spare[47]: 0 ; 0x1a8: 0x00000000 kfdhdb.ub4spare[48]: 0 ; 0x1ac: 0x00000000 kfdhdb.ub4spare[49]: 0 ; 0x1b0: 0x00000000 kfdhdb.ub4spare[50]: 0 ; 0x1b4: 0x00000000 kfdhdb.ub4spare[51]: 0 ; 0x1b8: 0x00000000 kfdhdb.ub4spare[52]: 0 ; 0x1bc: 0x00000000 kfdhdb.ub4spare[53]: 0 ; 0x1c0: 0x00000000 kfdhdb.ub4spare[54]: 0 ; 0x1c4: 0x00000000 kfdhdb.ub4spare[55]: 0 ; 0x1c8: 0x00000000 kfdhdb.ub4spare[56]: 0 ; 0x1cc: 0x00000000 kfdhdb.ub4spare[57]: 0 ; 0x1d0: 0x00000000 kfdhdb.acdb.aba.seq: 0 ; 0x1d4: 0x00000000 kfdhdb.acdb.aba.blk: 0 ; 0x1d8: 0x00000000 kfdhdb.acdb.ents: 0 ; 0x1dc: 0x0000 kfdhdb.acdb.ub2spare: 0 ; 0x1de: 0x0000
上述kfed命令的输出结果显示这个asm块有两种类型的数据 以kfbh为前缀的块头信息和以kfdhdb为前缀的ASM磁盘头信息。实际上,每个ASM元数据块都会有块头信息和与块类型相匹配的一些相关数据。
disk header中重要的ASM元数据
kfbh.endian–系统字序,0表示大字序,1表示小字序
kfbh.type–ASM块类型,kfbtyp_diskhead表示这是一个ASM磁盘头类型块
kfbh.block.blk–ASM块号,0表示ASM磁盘头块的块编号
disk header中重要的ASM磁盘头数据
kfdhdb.driver.provstr–ASMLIB磁盘是ORCLDISK+磁盘名,非ASMLIB磁盘是ORCLDISK
kfdhdb.dsknum–ASM磁盘编号
kfdhdb.grptyp–磁盘冗余级别,KFDGTP_EXTERNAL代表external级别,KFDGTP_NORMAL代表normal级别,KFDGTP_HIGH代表high级别
kfdhdb.hdrsts–ASM磁盘头状态。v$ASM_DISK.HEADER_STATUS视图内包含的所有可能的状态
kfdhdb.dskname–ASM磁盘名
kfdhdb.grpname–ASM磁盘组名
kfdhdb.fgname –ASM故障组名
kfdhdb.crestmp.hi–磁盘添加到磁盘组的时间指示年,月,日,小时
kfdhdb.crestmp.lo–磁盘添加到磁盘组的时间指示分,秒,毫秒,微秒
kfdhdb.mntstmp.hi–磁盘最近一次被mount的时间指示年,月,日,小时
kfdhdb.mntstmp.lo–磁盘最近一次被mount的时间指示分,秒,毫秒,微秒
kfdhdb.secsize–磁盘的扇区大小(bytes)
kfdhdb.blksize–ASM元数据块的大小(bytes)
kfdhdb.ausize–Allocation unit分配单元大小(byte),默认的AU大小为1MB,我这里的AU为16MB
kfdhdb.dsksize–磁盘大小(以au为单位)。本例中的磁盘大小为AU*dsksize=16M*320=5GB
kfdhdb.fstlocn–指针指向ASM的空闲空间表,1代表本AU中的ASM块1
kfdhdb.altlocn–指针指向ASM的分配表,2代表本AU中的ASM块2
kfdhdb.f1b1locn–指针指向ASM的文件目录,2代表本ASM磁盘的AU2
kfdhdb.dbcompat–最小的数据库兼容版本,0x0a100000=10.1
kfdhdb.grpstmp.hi–指针指向ASM磁盘组创建的时间指示年,月,日,小时
kfdhdb.grpstmp.lo–指针指向ASM磁盘组创建的时间指示分,秒,毫秒,微秒
对于11G还增加了以下内容
kfdhdb.vfstart– Clusterware voting磁盘AU分配单元的开始AU编号。如果为0,表示磁盘不包含 voting磁盘数据。本特性只限于11.2或更高版本
kfdhdb.vfend — Clusterware voting磁盘AU分配单元的结束AU编号。如果为0,表示磁盘不包含 voting磁盘数据。本特性只限于11.2或更高版本
kfdhdb.spfile–ASM spfile参数文件的AU号。本特性限于11.2或更高版本
kfdhdb.spfflg–ASM spfile参数文件标识。如果这个值是1,ASM spfile参数文件则位于本磁盘的kfdhdb.spfile参数的AU。本特性限于11.2或更高版本
[grid@jyrac1 ~]$ kfed read /dev/raw/raw10 aun=0 blkn=0 kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 0 ; 0x004: blk=0 kfbh.block.obj: 2147483651 ; 0x008: disk=3 kfbh.check: 3693686874 ; 0x00c: 0xdc29305a kfbh.fcn.base: 0 ; 0x010: 0x00000000 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8 kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000 kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000 kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000 kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000 kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000 kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000 kfdhdb.compat: 186646528 ; 0x020: 0x0b200000 kfdhdb.dsknum: 3 ; 0x024: 0x0003 kfdhdb.grptyp: 2 ; 0x026: KFDGTP_NORMAL kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER kfdhdb.dskname: DATADG_0000 ; 0x028: length=11 kfdhdb.grpname: DATADG ; 0x048: length=6 kfdhdb.fgname: DATADG_0000 ; 0x068: length=11 kfdhdb.capname: ; 0x088: length=0 kfdhdb.crestmp.hi: 33042831 ; 0x0a8: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0 kfdhdb.crestmp.lo: 2456905728 ; 0x0ac: USEC=0x0 MSEC=0x5a SECS=0x27 MINS=0x24 kfdhdb.mntstmp.hi: 33042897 ; 0x0b0: HOUR=0x11 DAYS=0xe MNTH=0xc YEAR=0x7e0 kfdhdb.mntstmp.lo: 144833536 ; 0x0b4: USEC=0x0 MSEC=0x7f SECS=0xa MINS=0x2 kfdhdb.secsize: 512 ; 0x0b8: 0x0200 kfdhdb.blksize: 4096 ; 0x0ba: 0x1000 kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000 kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80 kfdhdb.dsksize: 5120 ; 0x0c4: 0x00001400 kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002 kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001 kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002 kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000 kfdhdb.redomirrors[1]: 0 ; 0x0da: 0x0000 kfdhdb.redomirrors[2]: 0 ; 0x0dc: 0x0000 kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000 kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000 kfdhdb.grpstmp.hi: 33042831 ; 0x0e4: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0 kfdhdb.grpstmp.lo: 2456264704 ; 0x0e8: USEC=0x0 MSEC=0x1e8 SECS=0x26 MINS=0x24 kfdhdb.vfstart: 0 ; 0x0ec: 0x00000000 kfdhdb.vfend: 0 ; 0x0f0: 0x00000000 kfdhdb.spfile: 0 ; 0x0f4: 0x00000000 kfdhdb.spfflg: 0 ; 0x0f8: 0x00000000 kfdhdb.ub4spare[0]: 0 ; 0x0fc: 0x00000000 kfdhdb.ub4spare[1]: 0 ; 0x100: 0x00000000 kfdhdb.ub4spare[2]: 0 ; 0x104: 0x00000000 kfdhdb.ub4spare[3]: 0 ; 0x108: 0x00000000 kfdhdb.ub4spare[4]: 0 ; 0x10c: 0x00000000 kfdhdb.ub4spare[5]: 0 ; 0x110: 0x00000000 kfdhdb.ub4spare[6]: 0 ; 0x114: 0x00000000 kfdhdb.ub4spare[7]: 0 ; 0x118: 0x00000000 kfdhdb.ub4spare[8]: 0 ; 0x11c: 0x00000000 kfdhdb.ub4spare[9]: 0 ; 0x120: 0x00000000 kfdhdb.ub4spare[10]: 0 ; 0x124: 0x00000000 kfdhdb.ub4spare[11]: 0 ; 0x128: 0x00000000 kfdhdb.ub4spare[12]: 0 ; 0x12c: 0x00000000 kfdhdb.ub4spare[13]: 0 ; 0x130: 0x00000000 kfdhdb.ub4spare[14]: 0 ; 0x134: 0x00000000 kfdhdb.ub4spare[15]: 0 ; 0x138: 0x00000000 kfdhdb.ub4spare[16]: 0 ; 0x13c: 0x00000000 kfdhdb.ub4spare[17]: 0 ; 0x140: 0x00000000 kfdhdb.ub4spare[18]: 0 ; 0x144: 0x00000000 kfdhdb.ub4spare[19]: 0 ; 0x148: 0x00000000 kfdhdb.ub4spare[20]: 0 ; 0x14c: 0x00000000 kfdhdb.ub4spare[21]: 0 ; 0x150: 0x00000000 kfdhdb.ub4spare[22]: 0 ; 0x154: 0x00000000 kfdhdb.ub4spare[23]: 0 ; 0x158: 0x00000000 kfdhdb.ub4spare[24]: 0 ; 0x15c: 0x00000000 kfdhdb.ub4spare[25]: 0 ; 0x160: 0x00000000 kfdhdb.ub4spare[26]: 0 ; 0x164: 0x00000000 kfdhdb.ub4spare[27]: 0 ; 0x168: 0x00000000 kfdhdb.ub4spare[28]: 0 ; 0x16c: 0x00000000 kfdhdb.ub4spare[29]: 0 ; 0x170: 0x00000000 kfdhdb.ub4spare[30]: 0 ; 0x174: 0x00000000 kfdhdb.ub4spare[31]: 0 ; 0x178: 0x00000000 kfdhdb.ub4spare[32]: 0 ; 0x17c: 0x00000000 kfdhdb.ub4spare[33]: 0 ; 0x180: 0x00000000 kfdhdb.ub4spare[34]: 0 ; 0x184: 0x00000000 kfdhdb.ub4spare[35]: 0 ; 0x188: 0x00000000 kfdhdb.ub4spare[36]: 0 ; 0x18c: 0x00000000 kfdhdb.ub4spare[37]: 0 ; 0x190: 0x00000000 kfdhdb.ub4spare[38]: 0 ; 0x194: 0x00000000 kfdhdb.ub4spare[39]: 0 ; 0x198: 0x00000000 kfdhdb.ub4spare[40]: 0 ; 0x19c: 0x00000000 kfdhdb.ub4spare[41]: 0 ; 0x1a0: 0x00000000 kfdhdb.ub4spare[42]: 0 ; 0x1a4: 0x00000000 kfdhdb.ub4spare[43]: 0 ; 0x1a8: 0x00000000 kfdhdb.ub4spare[44]: 0 ; 0x1ac: 0x00000000 kfdhdb.ub4spare[45]: 0 ; 0x1b0: 0x00000000 kfdhdb.ub4spare[46]: 0 ; 0x1b4: 0x00000000 kfdhdb.ub4spare[47]: 0 ; 0x1b8: 0x00000000 kfdhdb.ub4spare[48]: 0 ; 0x1bc: 0x00000000 kfdhdb.ub4spare[49]: 0 ; 0x1c0: 0x00000000 kfdhdb.ub4spare[50]: 0 ; 0x1c4: 0x00000000 kfdhdb.ub4spare[51]: 0 ; 0x1c8: 0x00000000 kfdhdb.ub4spare[52]: 0 ; 0x1cc: 0x00000000 kfdhdb.ub4spare[53]: 0 ; 0x1d0: 0x00000000 kfdhdb.acdb.aba.seq: 0 ; 0x1d4: 0x00000000 kfdhdb.acdb.aba.blk: 0 ; 0x1d8: 0x00000000 kfdhdb.acdb.ents: 0 ; 0x1dc: 0x0000 kfdhdb.acdb.ub2spare: 0 ; 0x1de: 0x0000
ASM disk header的备份
ASM从10.2.0.5版本开始,磁盘头块的信息会自动备份到AU1的倒数第二个ASM元数据块中。知道AU的块大小和ASM元数据块的大小后,就能找到倒数第二个块的块编号。通过kfed工具可以从块头中读取到这些信息,并计算出AU1的倒数第二个块的块编号。
可以执行以下方法来进行计算第二个AU的倒数据第二个块的块编号
ausize=`kfed read /dev/disk | grep ausize | tr -s ' ' | cut -d' ' -f2` blksize=`kfed read /dev/disk| grep blksize | tr -s ' ' | cut -d' ' -f2` let n=$ausize/$blksize-2 echo $n
或
(ausize/blsize)-2
可以执行以下方法来进行计算第二个AU的倒数据第二个块所对应的整体块编号
(ausize/blsize)*2-2
例如在10.2.0.5计算第二个AU的倒数据第二个块的块编号的操作如下:
[oracle@jyrac3 ~]$ ausize=`kfed read /dev/raw/raw3 | grep ausize | tr -s ' ' | cut -d' ' -f2` [oracle@jyrac3 ~]$ blksize=`kfed read /dev/raw/raw3 | grep blksize | tr -s ' ' | cut -d' ' -f2` [oracle@jyrac3 ~]$ let n=$ausize/$blksize-2 [oracle@jyrac3 ~]$ echo $n 4094
或
SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup; GROUP_NUMBER NAME BLOCK_SIZE ALLOCATION_UNIT_SIZE ------------ ------------------------------ ---------- -------------------- 1 DATADG 4096 16777216 2 YBDG 4096 16777216 SQL> select 16777216/4096-2 from dual; 16777216/4096-2 --------------- 4094
例如在10.2.0.5进行计算第二个AU的倒数据第二个块所对应的整体块编号
SQL> select (16777216/4096)*2-2 from dual; (16777216/4096)*2-2 ------------------- 8190
其实计算第二个AU的倒数据第二个块所对应的整体块编号还可以跟踪kfed repair命令来查看它所读取的块号
[oracle@jyrac3 ~]$ strace -o trace_raw3 kfed repair /dev/raw/raw3 ausz=16777216 [oracle@jyrac3 ~]$ cat trace_raw3 ....省略.... open("/dev/raw/raw3", O_RDWR|O_LARGEFILE) = 5 _llseek(5, 33546240, [33546240], SEEK_SET) = 0 read(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 _llseek(5, 0, [0], SEEK_SET) = 0 read(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 _llseek(5, 0, [0], SEEK_SET) = 0 write(5, "\1\202\1\1\0\0\0\0\0\0\0\200\244.\306}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 close(5) = 0 munmap(0x476000, 143360) = 0 munmap(0x2bd000, 143360) = 0 exit_group(0) = ?
从上面的4096可知每次读取4096 byte也就是4K,而从_llseek(5, 33546240, [33546240], SEEK_SET) = 0可以计算出来所在的块号=33546240/4096=8190,8190也就是磁盘头备份信息所对应的整体块号
下面查看10.2.0.5的磁盘头备份信息
[oracle@jyrac3 ~]$ kfed read /dev/raw/raw3 aun=1 blkn=4094 aus=16777216 kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0 kfbh.block.obj: 2147483648 ; 0x008: TYPE=0x8 NUMB=0x0 kfbh.check: 2110140068 ; 0x00c: 0x7dc62ea4 kfbh.fcn.base: 0 ; 0x010: 0x00000000 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8 kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000 kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000 kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000 kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000 kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000 kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000 kfdhdb.compat: 168820736 ; 0x020: 0x0a100000 kfdhdb.dsknum: 0 ; 0x024: 0x0000 kfdhdb.grptyp: 2 ; 0x026: KFDGTP_NORMAL kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER kfdhdb.dskname: DATADG_0000 ; 0x028: length=11 kfdhdb.grpname: DATADG ; 0x048: length=6 kfdhdb.fgname: DATADG_0000 ; 0x068: length=11 kfdhdb.capname: ; 0x088: length=0 kfdhdb.crestmp.hi: 33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0 kfdhdb.crestmp.lo: 431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6 kfdhdb.mntstmp.hi: 33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0 kfdhdb.mntstmp.lo: 2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a kfdhdb.secsize: 512 ; 0x0b8: 0x0200 kfdhdb.blksize: 4096 ; 0x0ba: 0x1000 kfdhdb.ausize: 16777216 ; 0x0bc: 0x01000000 kfdhdb.mfact: 454272 ; 0x0c0: 0x0006ee80 kfdhdb.dsksize: 320 ; 0x0c4: 0x00000140 kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002 kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001 kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002 kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000 kfdhdb.redomirrors[1]: 0 ; 0x0da: 0x0000 kfdhdb.redomirrors[2]: 0 ; 0x0dc: 0x0000 kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000 kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000 kfdhdb.grpstmp.hi: 33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0 kfdhdb.grpstmp.lo: 428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6 kfdhdb.ub4spare[0]: 0 ; 0x0ec: 0x00000000 kfdhdb.ub4spare[1]: 0 ; 0x0f0: 0x00000000 kfdhdb.ub4spare[2]: 0 ; 0x0f4: 0x00000000 kfdhdb.ub4spare[3]: 0 ; 0x0f8: 0x00000000 kfdhdb.ub4spare[4]: 0 ; 0x0fc: 0x00000000 kfdhdb.ub4spare[5]: 0 ; 0x100: 0x00000000 kfdhdb.ub4spare[6]: 0 ; 0x104: 0x00000000 kfdhdb.ub4spare[7]: 0 ; 0x108: 0x00000000 kfdhdb.ub4spare[8]: 0 ; 0x10c: 0x00000000 kfdhdb.ub4spare[9]: 0 ; 0x110: 0x00000000 kfdhdb.ub4spare[10]: 0 ; 0x114: 0x00000000 kfdhdb.ub4spare[11]: 0 ; 0x118: 0x00000000 kfdhdb.ub4spare[12]: 0 ; 0x11c: 0x00000000 kfdhdb.ub4spare[13]: 0 ; 0x120: 0x00000000 kfdhdb.ub4spare[14]: 0 ; 0x124: 0x00000000 kfdhdb.ub4spare[15]: 0 ; 0x128: 0x00000000 kfdhdb.ub4spare[16]: 0 ; 0x12c: 0x00000000 kfdhdb.ub4spare[17]: 0 ; 0x130: 0x00000000 kfdhdb.ub4spare[18]: 0 ; 0x134: 0x00000000 kfdhdb.ub4spare[19]: 0 ; 0x138: 0x00000000 kfdhdb.ub4spare[20]: 0 ; 0x13c: 0x00000000 kfdhdb.ub4spare[21]: 0 ; 0x140: 0x00000000 kfdhdb.ub4spare[22]: 0 ; 0x144: 0x00000000 kfdhdb.ub4spare[23]: 0 ; 0x148: 0x00000000 kfdhdb.ub4spare[24]: 0 ; 0x14c: 0x00000000 kfdhdb.ub4spare[25]: 0 ; 0x150: 0x00000000 kfdhdb.ub4spare[26]: 0 ; 0x154: 0x00000000 kfdhdb.ub4spare[27]: 0 ; 0x158: 0x00000000 kfdhdb.ub4spare[28]: 0 ; 0x15c: 0x00000000 kfdhdb.ub4spare[29]: 0 ; 0x160: 0x00000000 kfdhdb.ub4spare[30]: 0 ; 0x164: 0x00000000 kfdhdb.ub4spare[31]: 0 ; 0x168: 0x00000000 kfdhdb.ub4spare[32]: 0 ; 0x16c: 0x00000000 kfdhdb.ub4spare[33]: 0 ; 0x170: 0x00000000 kfdhdb.ub4spare[34]: 0 ; 0x174: 0x00000000 kfdhdb.ub4spare[35]: 0 ; 0x178: 0x00000000 kfdhdb.ub4spare[36]: 0 ; 0x17c: 0x00000000 kfdhdb.ub4spare[37]: 0 ; 0x180: 0x00000000 kfdhdb.ub4spare[38]: 0 ; 0x184: 0x00000000 kfdhdb.ub4spare[39]: 0 ; 0x188: 0x00000000 kfdhdb.ub4spare[40]: 0 ; 0x18c: 0x00000000 kfdhdb.ub4spare[41]: 0 ; 0x190: 0x00000000 kfdhdb.ub4spare[42]: 0 ; 0x194: 0x00000000 kfdhdb.ub4spare[43]: 0 ; 0x198: 0x00000000 kfdhdb.ub4spare[44]: 0 ; 0x19c: 0x00000000 kfdhdb.ub4spare[45]: 0 ; 0x1a0: 0x00000000 kfdhdb.ub4spare[46]: 0 ; 0x1a4: 0x00000000 kfdhdb.ub4spare[47]: 0 ; 0x1a8: 0x00000000 kfdhdb.ub4spare[48]: 0 ; 0x1ac: 0x00000000 kfdhdb.ub4spare[49]: 0 ; 0x1b0: 0x00000000 kfdhdb.ub4spare[50]: 0 ; 0x1b4: 0x00000000 kfdhdb.ub4spare[51]: 0 ; 0x1b8: 0x00000000 kfdhdb.ub4spare[52]: 0 ; 0x1bc: 0x00000000 kfdhdb.ub4spare[53]: 0 ; 0x1c0: 0x00000000 kfdhdb.ub4spare[54]: 0 ; 0x1c4: 0x00000000 kfdhdb.ub4spare[55]: 0 ; 0x1c8: 0x00000000 kfdhdb.ub4spare[56]: 0 ; 0x1cc: 0x00000000 kfdhdb.ub4spare[57]: 0 ; 0x1d0: 0x00000000 kfdhdb.acdb.aba.seq: 0 ; 0x1d4: 0x00000000 kfdhdb.acdb.aba.blk: 0 ; 0x1d8: 0x00000000 kfdhdb.acdb.ents: 0 ; 0x1dc: 0x0000 kfdhdb.acdb.ub2spare: 0 ; 0x1de: 0x0000
能够看到与AU0的元数据块0相同的内容。当磁盘头被破坏或者丢失时,这个备份将是非常有用的。只需要运行kfed repair [磁盘名]命令即可修复,如果AU大小不是默认的1MB,还需要指定AU大小的具体值。 所上面的命令指定了aus参数
使用第二个AU的倒数据第二个块所对应的整体块编号来查看备份的磁盘头信息
[oracle@jyrac3 ~]$ kfed read /dev/raw/raw3 blkn=8190 kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD kfbh.datfmt: 1 ; 0x003: 0x01 kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0 kfbh.block.obj: 2147483648 ; 0x008: TYPE=0x8 NUMB=0x0 kfbh.check: 2110140068 ; 0x00c: 0x7dc62ea4 kfbh.fcn.base: 0 ; 0x010: 0x00000000 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8 kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000 kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000 kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000 kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000 kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000 kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000 kfdhdb.compat: 168820736 ; 0x020: 0x0a100000 kfdhdb.dsknum: 0 ; 0x024: 0x0000 kfdhdb.grptyp: 2 ; 0x026: KFDGTP_NORMAL kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER kfdhdb.dskname: DATADG_0000 ; 0x028: length=11 kfdhdb.grpname: DATADG ; 0x048: length=6 kfdhdb.fgname: DATADG_0000 ; 0x068: length=11 kfdhdb.capname: ; 0x088: length=0 kfdhdb.crestmp.hi: 33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0 kfdhdb.crestmp.lo: 431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6 kfdhdb.mntstmp.hi: 33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0 kfdhdb.mntstmp.lo: 2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a kfdhdb.secsize: 512 ; 0x0b8: 0x0200 kfdhdb.blksize: 4096 ; 0x0ba: 0x1000 kfdhdb.ausize: 16777216 ; 0x0bc: 0x01000000 kfdhdb.mfact: 454272 ; 0x0c0: 0x0006ee80 kfdhdb.dsksize: 320 ; 0x0c4: 0x00000140 kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002 kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001 kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002 kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 kfdhdb.redomirrors[0]: 0 ; 0x0d8: 0x0000 kfdhdb.redomirrors[1]: 0 ; 0x0da: 0x0000 kfdhdb.redomirrors[2]: 0 ; 0x0dc: 0x0000 kfdhdb.redomirrors[3]: 0 ; 0x0de: 0x0000 kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000 kfdhdb.grpstmp.hi: 33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0 kfdhdb.grpstmp.lo: 428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6 kfdhdb.ub4spare[0]: 0 ; 0x0ec: 0x00000000 kfdhdb.ub4spare[1]: 0 ; 0x0f0: 0x00000000 kfdhdb.ub4spare[2]: 0 ; 0x0f4: 0x00000000 kfdhdb.ub4spare[3]: 0 ; 0x0f8: 0x00000000 kfdhdb.ub4spare[4]: 0 ; 0x0fc: 0x00000000 kfdhdb.ub4spare[5]: 0 ; 0x100: 0x00000000 kfdhdb.ub4spare[6]: 0 ; 0x104: 0x00000000 kfdhdb.ub4spare[7]: 0 ; 0x108: 0x00000000 kfdhdb.ub4spare[8]: 0 ; 0x10c: 0x00000000 kfdhdb.ub4spare[9]: 0 ; 0x110: 0x00000000 kfdhdb.ub4spare[10]: 0 ; 0x114: 0x00000000 kfdhdb.ub4spare[11]: 0 ; 0x118: 0x00000000 kfdhdb.ub4spare[12]: 0 ; 0x11c: 0x00000000 kfdhdb.ub4spare[13]: 0 ; 0x120: 0x00000000 kfdhdb.ub4spare[14]: 0 ; 0x124: 0x00000000 kfdhdb.ub4spare[15]: 0 ; 0x128: 0x00000000 kfdhdb.ub4spare[16]: 0 ; 0x12c: 0x00000000 kfdhdb.ub4spare[17]: 0 ; 0x130: 0x00000000 kfdhdb.ub4spare[18]: 0 ; 0x134: 0x00000000 kfdhdb.ub4spare[19]: 0 ; 0x138: 0x00000000 kfdhdb.ub4spare[20]: 0 ; 0x13c: 0x00000000 kfdhdb.ub4spare[21]: 0 ; 0x140: 0x00000000 kfdhdb.ub4spare[22]: 0 ; 0x144: 0x00000000 kfdhdb.ub4spare[23]: 0 ; 0x148: 0x00000000 kfdhdb.ub4spare[24]: 0 ; 0x14c: 0x00000000 kfdhdb.ub4spare[25]: 0 ; 0x150: 0x00000000 kfdhdb.ub4spare[26]: 0 ; 0x154: 0x00000000 kfdhdb.ub4spare[27]: 0 ; 0x158: 0x00000000 kfdhdb.ub4spare[28]: 0 ; 0x15c: 0x00000000 kfdhdb.ub4spare[29]: 0 ; 0x160: 0x00000000 kfdhdb.ub4spare[30]: 0 ; 0x164: 0x00000000 kfdhdb.ub4spare[31]: 0 ; 0x168: 0x00000000 kfdhdb.ub4spare[32]: 0 ; 0x16c: 0x00000000 kfdhdb.ub4spare[33]: 0 ; 0x170: 0x00000000 kfdhdb.ub4spare[34]: 0 ; 0x174: 0x00000000 kfdhdb.ub4spare[35]: 0 ; 0x178: 0x00000000 kfdhdb.ub4spare[36]: 0 ; 0x17c: 0x00000000 kfdhdb.ub4spare[37]: 0 ; 0x180: 0x00000000 kfdhdb.ub4spare[38]: 0 ; 0x184: 0x00000000 kfdhdb.ub4spare[39]: 0 ; 0x188: 0x00000000 kfdhdb.ub4spare[40]: 0 ; 0x18c: 0x00000000 kfdhdb.ub4spare[41]: 0 ; 0x190: 0x00000000 kfdhdb.ub4spare[42]: 0 ; 0x194: 0x00000000 kfdhdb.ub4spare[43]: 0 ; 0x198: 0x00000000 kfdhdb.ub4spare[44]: 0 ; 0x19c: 0x00000000 kfdhdb.ub4spare[45]: 0 ; 0x1a0: 0x00000000 kfdhdb.ub4spare[46]: 0 ; 0x1a4: 0x00000000 kfdhdb.ub4spare[47]: 0 ; 0x1a8: 0x00000000 kfdhdb.ub4spare[48]: 0 ; 0x1ac: 0x00000000 kfdhdb.ub4spare[49]: 0 ; 0x1b0: 0x00000000 kfdhdb.ub4spare[50]: 0 ; 0x1b4: 0x00000000 kfdhdb.ub4spare[51]: 0 ; 0x1b8: 0x00000000 kfdhdb.ub4spare[52]: 0 ; 0x1bc: 0x00000000 kfdhdb.ub4spare[53]: 0 ; 0x1c0: 0x00000000 kfdhdb.ub4spare[54]: 0 ; 0x1c4: 0x00000000 kfdhdb.ub4spare[55]: 0 ; 0x1c8: 0x00000000 kfdhdb.ub4spare[56]: 0 ; 0x1cc: 0x00000000 kfdhdb.ub4spare[57]: 0 ; 0x1d0: 0x00000000 kfdhdb.acdb.aba.seq: 0 ; 0x1d4: 0x00000000 kfdhdb.acdb.aba.blk: 0 ; 0x1d8: 0x00000000 kfdhdb.acdb.ents: 0 ; 0x1dc: 0x0000 kfdhdb.acdb.ub2spare: 0 ; 0x1de: 0x0000
能够看到与AU0的元数据块0相同的内容。
例如在11g计算第二个AU的倒数据第二个块的块编号的操作如下:
[grid@jyrac1 ~]$ ausize=`kfed read /dev/raw/raw10 | grep ausize | tr -s ' ' | cut -d' ' -f2` [grid@jyrac1 ~]$ blksize=`kfed read /dev/raw/raw10 | grep blksize | tr -s ' ' | cut -d' ' -f2` [grid@jyrac1 ~]$ let n=$ausize/$blksize-2 [grid@jyrac1 ~]$ echo $n 254
或
SQL> set long 400 SQL> set linesize 400 SQL> col name for a30 SQL> col path for a30 SQL> select group_number,disk_number,name,path,redundancy from v$asm_disk; GROUP_NUMBER DISK_NUMBER NAME PATH REDUNDANCY ------------ ----------- ------------------------------ ------------------------------ -------------- 3 0 DATADG_0001 /dev/raw/raw11 UNKNOWN 4 0 DATA_NRML_0000 /dev/raw/raw5 UNKNOWN 3 3 DATADG_0000 /dev/raw/raw10 UNKNOWN 1 1 ARCHDG_0001 /dev/raw/raw9 UNKNOWN 4 3 DATA_NRML_0003 /dev/raw/raw12 UNKNOWN 4 2 DATA_NRML_0002 /dev/raw/raw7 UNKNOWN 2 1 CRSDG_0001 /dev/raw/raw8 UNKNOWN 4 1 DATA_NRML_0001 /dev/raw/raw6 UNKNOWN 1 0 ARCHDG_0000 /dev/raw/raw2 UNKNOWN 3 1 DATADG_0003 /dev/raw/raw4 UNKNOWN 4 4 DATA_NRML_0004 /dev/raw/raw13 UNKNOWN 3 2 DATADG_0002 /dev/raw/raw3 UNKNOWN 2 0 CRSDG_0000 /dev/raw/raw1 UNKNOWN 4 5 DATA_NRML_0005 /dev/raw/raw14 UNKNOWN 14 rows selected. SQL> select group_number,name,block_size,allocation_unit_size from v$asm_diskgroup; GROUP_NUMBER NAME BLOCK_SIZE ALLOCATION_UNIT_SIZE ------------ ------------------------------ ---------- -------------------- 1 ARCHDG 4096 1048576 2 CRSDG 4096 1048576 3 DATADG 4096 1048576 4 DATA_NRML 4096 1048576 SQL> select 1048576/4096-2 from dual; 1048576/4096-2 -------------- 254
例如在11g进行计算第二个AU的倒数据第二个块所对应的整体块编号
SQL> select (1048576/4096)*2-2 from dual; (1048576/4096)*2-2 ------------------ 510
对于默认的磁盘组,AU Size=1M ,每个AU中可以存储256个块,块号为0-255 。第1个AU存储256个块,第2个AU最后1个块号为255,倒数第2个块号是254,也就是整体的第510个块(从第1个AU的第1个块往后算起)。
使用bbed查看asm disk header
首先使用dd命令将disk header导出
[oracle@jyrac3 lib]$ dd if=/dev/raw/raw3 bs=4096 count=1 of=/u01/app/oracle/raw3_asm_header 1+0 records in 1+0 records out 4096 bytes (4.1 kB) copied, 0.0181451 seconds, 226 kB/s
使用bbed进行查看
[oracle@jyrac3 bin]$ ./bbed Password: BBED: Release 2.0.0.0.0 - Limited Production on Tue Dec 20 20:50:58 2016 Copyright (c) 1982, 2007, Oracle. All rights reserved. ************* !!! For Oracle Internal Use only !!! *************** BBED> set filename '/u01/app/oracle/raw3_asm_header' FILENAME /u01/app/oracle/raw3_asm_header
BBED> show all FILE# 0 BLOCK# 1 --这里显示的是file:0,block 1 OFFSET 0 DBA 0x00000000 (0 0,1) FILENAME /u01/app/oracle/raw3_asm_header BIFILE bifile.bbd LISTFILE BLOCKSIZE 512 MODE Browse EDIT Unrecoverable IBASE Dec OBASE Dec WIDTH 80 COUNT 512 LOGFILE log.bbd SPOOL No
BBED> map /v --查看block1里的详细信息 File: /u01/app/oracle/raw3_asm_header (0) Block: 1 Dba:0x00000000 ------------------------------------------------------------ Undo Segment Header struct kcbh, 20 bytes @0 --kcbh 的结构占用了20个bytes,@表示该信息在block里的偏移量,即offset值 ub1 type_kcbh @0 ub1 frmt_kcbh @1 ub1 spare1_kcbh @2 ub1 spare2_kcbh @3 ub4 rdba_kcbh @4 ub4 bas_kcbh @8 ub2 wrp_kcbh @12 ub1 seq_kcbh @14 ub1 flg_kcbh @15 ub2 chkval_kcbh @16 ub2 spare3_kcbh @18 struct ktect, 44 bytes @20 ub4 ktectspare @20 word ktecttsn @24 ub4 ktectobj @28 ub4 ktectnex @32 ub2 ktecttbe @36 ub4 ktectcex @40 ub4 ktectces @44 ub4 ktectcbk @48 struct ktectxid, 8 bytes @52 ub1 ktectlck @60 struct ktetb[1], 8 bytes @64 ub4 ktetbdba @64 ub4 ktetbnbk @68 struct ktuxc, 104 bytes @18776 struct ktuxcscn, 8 bytes @18776 struct ktuxcuba, 8 bytes @18784 sb2 ktuxcflg @18792 ub2 ktuxcseq @18794 sb2 ktuxcnfb @18796 ub4 ktuxcinc @18800 sb2 ktuxcchd @18804 sb2 ktuxcctl @18806 ub2 ktuxcmgc @18808 ub4 ktuxcopt @18816 struct ktuxcfbp[5], 60 bytes @18820 struct ktuxe[255], 10200 bytes @18880 ub4 ktuxexid @18880 ub4 ktuxebrb @18884 struct ktuxescn, 8 bytes @18888 sb4 ktuxesta @18896 ub1 ktuxecfl @18897 sb2 ktuxeuel @18898 ub4 tailchk @508
BBED> p kcbh --查看kcbh 结构里的具体值 struct kcbh, 20 bytes @0 ub1 type_kcbh @0 0x01 ub1 frmt_kcbh @1 0x82 ub1 spare1_kcbh @2 0x01 ub1 spare2_kcbh @3 0x01 ub4 rdba_kcbh @4 0x00000000 ub4 bas_kcbh @8 0x80000000 ub2 wrp_kcbh @12 0x2ea4 ub1 seq_kcbh @14 0xc6 ub1 flg_kcbh @15 0x7d (KCBHFNEW, KCBHFCKV) ub2 chkval_kcbh @16 0x0000 ub2 spare3_kcbh @18 0x0000
BBED> d /v count 4096 --dump 这个block,查看具体内容 File: /u01/app/oracle/raw3_asm_header (0) Block: 1 Offsets: 0 to 511 Dba:0x00000000 ------------------------------------------------------- 01820101 00000000 00000080 a42ec67d l ...............} 00000000 00000000 00000000 00000000 l ................ 4f52434c 4449534b 00000000 00000000 l ORCLDISK........ 00000000 00000000 00000000 00000000 l ................ 0000100a 00000203 44415441 44475f30 l ........DATADG_0 30303000 00000000 00000000 00000000 l 000............. 00000000 00000000 44415441 44470000 l ........DATADG.. 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 44415441 44475f30 l ........DATADG_0 30303000 00000000 00000000 00000000 l 000............. 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 5130f801 00d0b319 l ........Q0...... 6d30f801 00e85ca9 00020010 00000001 l m0....\......... 80ee0600 40010000 02000000 01000000 l ....@........... 02000000 02000000 00000000 00000000 l ................ 0000100a 5130f801 00549019 00000000 l ....Q0...T...... 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ <16 bytes per line> BBED>
这里每行16个字节,即每块4个字节,如:01820101,这块就由01,82,01和01这4个字节组成。
1)第1个byte 01–这里是对应的kfbh.endian 01即使1 表示的是Little Endian 相反,0的话即使表示BIGendian
2)第2个byte 82–这里对应kfbh.hard
3)第3个byte 01–这里对应kfbh.type
4)第4个byte 01–这里对应的是kfbh_datfmt
5)第5~8个byte 00 00 0000—这里对应的是kfbh.block.blk
6)第9~12个byte00 08 0008—这里对应的是kfbh.block.obj
7)第13~16个byte a42ec67d—这里对应的是kfbh.check(0x7dc62ea4) 因为操作系统是Little Endian的原因显示的内容与kfed读取到的是相反的
8)第17~20个byte00000000 —这里对应的是kfbh.fcn.base
9)第21~23个byte 00000000—这里对应的是kfbh.fcn.wrap
10)第24~27个byte 00000000 —这里对应的是kfbh.spare1
11)第28~32个byte 00000000 —这里对应的是kfbh.spare2
12)第33~40个byte 4f52434c 4449534b—这里对应的是kfdhdb.driver.provstr –从上面的dump信息可以看出具体的值
13)第41~64个byte 00 00 00 00 —这里对应的是kfdhdb.driver.reserved[0] ~~kfdhdb.driver.reserved[5]
14)第65~68个byte 0000100a —这里对应的是kfdhdb.compat即使我们的oracle版本号
15)第69~70个byte 0000 —这里对应的是kfdhdb.dsknum 即使disk numer 取值范围 0~65335
16)第71个byte 02 —这里对应的是kfdhdb.grptyp 即磁盘组的冗余方式 02 表示normal冗余
下面对该值的属性做一下补充:
KFDGTP_INVALID((kfdgtp)0)– Illegal value
KFDGTP_EXTERNAL ((kfdgtp)1)– External redundancy
KFDGTP_NORMAL ((kfdgtp)2)– Normal redundancy
KFDGTP_HIGH ((kfdgtp)3)– High redundancy
17)第72个byte 03 —这里对应是kfdhdb.hdrsts即disk group的状态 03表示正常(这里非常重要)
下面对改值的熟悉做一下补充:
KFDHDR_INVALID((kfdhdr)0)–Illegal value
KFDHDR_UNKNOWN((kfdhdr)1) –Disk header block unreadable
KFDHDR_CANDIDATE((kfdhdr)2) –No OSM or OS disk header found
KFDHDR_MEMBER ((kfdhdr)3) –Normal member of the group —03 正常状态
KFDHDR_FORMER ((kfdhdr)4) –Disk dropped cleanly from group
KFDHDR_CONFLICT ((kfdhdr)5) –Header conflicts
KFDHDR_INCOMPAT ((kfdhdr)6) –Written by incompatible software
KFDHDR_PROVISIONED ((kfdhdr)7) –Disk was preparedbeforehand
18)第73~104个byte44415441 44475f30 到00000000 32个byte —这里对应的是kfdhdb.dskname 即磁盘名称 我们这里的DATADG_0000
19) 第105~~136个byte 44415441 44470000 到00000000 32个byte —这里对应的是kfdhdb.grpname 即是磁盘组名称 DATADG
20)第137~ 168个byte 也是44415441 44475f301开始 32个byte —这里对应的是kfdhdb.fgname即failgroup name DATADG_0000
21)第169~200 个byte一共32个byte —这里对应的是kfdhdb.capname 即是Capacitygroup name当然我这里没有使用
22)第201~204个byte 5130f801 一共4个byte —这里对应的是kfdhdb.crestmp.hi 即Creation timestamp high
SQL> select to_number('01f83051','xxxxxxxxxxxxxx') from dual; TO_NUMBER('01F83051','XXXXXXXX ------------------------------ 33042513 kfdhdb.crestmp.hi: 33042513 ; 0x0a8: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0 SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('2','xxxxxxxxxxxxxx') day,to_number('11','xxxxxxxxxxxxxx') hour from dual; YEAR MONTH DAY HOUR ---------- ---------- ---------- ---------- 2016 12 2 17
23)第205~208个byte 00d0b319 一共4个byte —这里对应的是kfdhdb.crestmp.lo 即Creation timestamp low
SQL> select to_number('19b3d000','xxxxxxxxxxxxxx') from dual; TO_NUMBER('19B3D000','XXXXXXXX ------------------------------ 431214592 kfdhdb.crestmp.lo: 431214592 ; 0x0ac: USEC=0x0 MSEC=0xf4 SECS=0x1b MINS=0x6 SQL> select to_number('6','xxxxxxxxxxxxxx') min,to_number('1b','xxxxxxxxxxxxxx') sec,to_number('f4','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from dual; MIN SEC MS US ---------- ---------- ---------- ---------- 6 27 244 0
与alert_+ASM1.log中的磁盘组创建时间相符
SQL> CREATE DISKGROUP datadg Normal REDUNDANCY DISK '/dev/raw/raw3' SIZE 5120M , '/dev/raw/raw4' SIZE 5120M Fri Dec 02 17:06:27 CST 2016
24)第209~212个byte 6d30f801 一共4个byte —这里对应的是kfdhdb.mntstmp.hi
SQL> select to_number('01f8306d','xxxxxxxxxxxxxx') from dual; TO_NUMBER('01F8306D','XXXXXXXX ------------------------------ 33042541 kfdhdb.mntstmp.hi: 33042541 ; 0x0b0: HOUR=0xd DAYS=0x3 MNTH=0xc YEAR=0x7e0 SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('3','xxxxxxxxxxxxxx') day,to_number('d','xxxxxxxxxxxxxx') hour from dual; YEAR MONTH DAY HOUR ---------- ---------- ---------- ---------- 2016 12 3 13
25)第213~216个byte 00e85ca9 一共4个byte —这里对应的是kfdhdb.mntstmp.lo
SQL> select to_number('a95ce800','xxxxxxxxxxxxxx') from dual; TO_NUMBER('A95CE800','XXXXXXXX ------------------------------ 2841438208 kfdhdb.mntstmp.lo: 2841438208 ; 0x0b4: USEC=0x0 MSEC=0x33a SECS=0x15 MINS=0x2a SQL> select to_number('2a','xxxxxxxxxxxxxx') min,to_number('15','xxxxxxxxxxxxxx') sec,to_number('33a','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from dual; MIN SEC MS US ---------- ---------- ---------- ---------- 42 21 826 0
与alert_+ASM1.log中的磁盘组mount时间相符
Sat Dec 03 13:42:21 CST 2016 NOTE: cache mounting group 1/0xB7D9694E (DATADG) succeeded SUCCESS: diskgroup DATADG was mounted
26)第217~218一共2个byte 0002 —这里对应的是kfdhdb.secsize 即physical sector size of the disk
SQL> select to_number('0200','xxxxxxxxxxxxxx') from dual; TO_NUMBER('0200','XXXXXXXXXXXX ------------------------------ 512 kfdhdb.secsize: 512 ; 0x0b8: 0x0200
27)第219~220一共2个byte 0010 —这里对应的是fdhdb.blksize即metadata blocksize asm block大小
SQL> select to_number('1000','xxxxxxxxxxxxxx') from dual; TO_NUMBER('1000','XXXXXXXXXXXX ------------------------------ 4096 kfdhdb.blksize: 4096 ; 0x0ba: 0x1000
28)第221~224一共4个byte 00000001 —这里对应的是kfdhdb.ausize即AU 的大小16777216 即是16m
SQL> select to_number('01000000','xxxxxxxxxxxxxx') from dual; TO_NUMBER('01000000','XXXXXXXX ------------------------------ 16777216 kfdhdb.ausize: 16777216 ; 0x0bc: 0x01000000
29)第225~228一共4个byte 80ee0600—这里对应的是kfdhdb.mfact 即Stride between physical addresses of allocation units
SQL> select to_number('0006ee80','xxxxxxxxxxxxxx') from dual; TO_NUMBER('0006EE80','XXXXXXXX ------------------------------ 454272 kfdhdb.mfact: 454272 ; 0x0c0: 0x0006ee80
30)第229~232一共4个byte 40010000 —这里对应的是kfdhdb.dsksize 即0x00000140 转换为10进制后为320,即320个分配units =磁盘大小=320*16=5120M=5G
SQL> select to_number('00000140','xxxxxxxxxxxxxx') from dual; TO_NUMBER('00000140','XXXXXXXX ------------------------------ 320 kfdhdb.dsksize: 320 ; 0x0c4: 0x00000140
31)第233~236一共4个byte 02000000—这里对应的是kfdhdb.pmcnt 这里该值是2即 Number of physically addressed allocation units
SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual; TO_NUMBER('00000002','XXXXXXXX ------------------------------ 2 kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002
32)第237~240一共4个byte 01000000 —这里对应的是kfdhdb.fstlocn即First FreeSpace table block number used to find freespace。
SQL> select to_number('00000001','xxxxxxxxxxxxxx') from dual; TO_NUMBER('00000001','XXXXXXXX ------------------------------ 1 kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001
33)第241~244一共4个byte 02000000 —这里对应的是kfdhdb.altlocn即First Alocation table block numer used to find allocated space
SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual; TO_NUMBER('00000002','XXXXXXXX ------------------------------ 2 kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002
34)第245~248 一共4个byte 02000000 —这里对应的是kfdhdb.f1b1locn 即File Directory block 1 Allocation Unit number. Beginging for filedirectory
SQL> select to_number('00000002','xxxxxxxxxxxxxx') from dual; TO_NUMBER('00000002','XXXXXXXX ------------------------------ 2 kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002
即是第一个file directory 通常这里是2
35)第249~250一共2个byte 0000 —这里对应的是kfdhdb.redomirrors[0]
36)第251~252一共2个byte 0000 —这里对应的是kfdhdb.redomirrors[1]
37)第253~254一共2个byte 0000 —这里对应的是kfdhdb.redomirrors[2]
38)第255~256一共2个byte 0000 —这里对应的是kfdhdb.redomirrors[3]
39)第257~260一共4个byte 0000100a—这里对应的是kfdhdb.dbcompat 转换以为即为我们的数据库版本
SQL> select to_number('0a100000','xxxxxxxxxxxxxx') from dual; TO_NUMBER('0A100000','XXXXXXXX ------------------------------ 168820736 kfdhdb.dbcompat: 168820736 ; 0x0e0: 0x0a100000
40)第260~264一共4个byte 5130f801 —这里对应的是kfdhdb.grpstmp.hi
SQL> select to_number('01f83051','xxxxxxxxxxxxxx') from dual; TO_NUMBER('01F83051','XXXXXXXX ------------------------------ 33042513 kfdhdb.grpstmp.hi: 33042513 ; 0x0e4: HOUR=0x11 DAYS=0x2 MNTH=0xc YEAR=0x7e0 SQL> select to_number('7e0','xxxxxxxxxxxxxx') year,to_number('c','xxxxxxxxxxxxxx') month,to_number('2','xxxxxxxxxxxxxx') day,to_number('11','xxxxxxxxxxxxxx') hour from dual; YEAR MONTH DAY HOUR ---------- ---------- ---------- ---------- 2016 12 2 17
41)第265~268 一共4个byte 00549019 —这里对应的是kfdhdb.grpstmp.lo
SQL> select to_number('19905400','xxxxxxxxxxxxxx') from dual; TO_NUMBER('19905400','XXXXXXXX ------------------------------ 428889088 kfdhdb.grpstmp.lo: 428889088 ; 0x0e8: USEC=0x0 MSEC=0x15 SECS=0x19 MINS=0x6 SQL> select to_number('6','xxxxxxxxxxxxxx') min,to_number('19','xxxxxxxxxxxxxx') sec,to_number('15','xxxxxxxxxxxxxx') ms,to_number('0','xxxxxxxxxxxxxx') us from dual; MIN SEC MS US ---------- ---------- ---------- ---------- 6 25 21 0