设为首页 收藏本站
查看: 599|回复: 0

[经验分享] Oracle 使用BBED 查看 ASM Disk Header 内容

[复制链接]
YunVN网友  发表于 2016-8-13 07:04:41 |阅读模式
  
  RAC ASM由于其高度的封装性,使得我们很难知道窥探其内部的原理。ASM如果一旦出现问题,通常都很难处理。即便在有很完备的RMAN备份的情况下,恢复起来都可能需要很长的时间。
  而ASM 中最为脆弱的又是ASM disk header。如果disk header逻辑损坏了,即corrupt了,整个disk group将不能够mount,依赖于ASM实例的database也将不能够startup。
  那么asm disk header里到底保存了什么信息? 这个可以使用KFED 命令或者BBED 命令来查看。
  
  Roger同学整理过使用BBED 查看disk header 的文章,所以这个测试就按照Roger 的实验步骤来操作。
  原文链接如下:
  http://ms.itpub.net/viewthread.php?tid=1370753
  
  
一. KFOD查看disk header 的内容
  使用KFED 查看,之前整理了一篇blog,具体参考:
  Oracle KFED 和 KFOD 工具说明
  http://blog.csdn.net/tianlesoftware/article/details/6729950
  
  这里直接截取disk header的内容:
  [oracle@rac2 ~]$kfed read/dev/mapper/datap1
  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=0x8NUMB=0x0
  kfbh.check:1508168608 ; 0x00c:0x59e4d3a0
  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:ORCLDISKDATA ; 0x000: length=12
  -->磁盘卷名
  kfdhdb.driver.reserved[0]:1096040772 ; 0x008: 0x41544144
  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:1 ; 0x026:KFDGTP_EXTERNAL
  --> ThisindicatesRedundancy for Group.Check TYPE in query output.
  kfdhdb.hdrsts:3 ; 0x027:KFDHDR_MEMBER
  --> This indicatesDiskHeader status. Here it indicates it is member of Group.
  kfdhdb.dskname:DATA ; 0x028: length=4
  --> This indicatesDiskName
  kfdhdb.grpname:DATA ; 0x048: length=4
  --> This indicatestheGroup Name for the disk.
  kfdhdb.fgname:DATA ; 0x068: length=4
  --> This indicatestheFailure Group Name.
  kfdhdb.capname:; 0x088: length=0
  kfdhdb.crestmp.hi:32952076 ; 0x0a8: HOUR=0xcDAYS=0x18 MNTH=0x3 YEAR=0x7db
  kfdhdb.crestmp.lo:3374491648 ; 0x0ac: USEC=0x0MSEC=0xaa SECS=0x12 MINS=0x32
  kfdhdb.mntstmp.hi:32955120 ; 0x0b0: HOUR=0x10DAYS=0x17 MNTH=0x6 YEAR=0x7db
  kfdhdb.mntstmp.lo:3440417792 ; 0x0b4: USEC=0x0MSEC=0x27 SECS=0x11 MINS=0x33
  kfdhdb.secsize:512 ; 0x0b8: 0x0200
  kfdhdb.blksize:4096 ; 0x0ba: 0x1000
  kfdhdb.ausize:1048576 ; 0x0bc: 0x00100000
  kfdhdb.mfact:113792 ; 0x0c0: 0x0001bc80
  kfdhdb.dsksize:11993 ; 0x0c4: 0x00002ed9
  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:32952076 ; 0x0e4: HOUR=0xcDAYS=0x18 MNTH=0x3 YEAR=0x7db
  kfdhdb.grpstmp.lo:3374396416 ; 0x0e8: USEC=0x0MSEC=0x4d SECS=0x12 MINS=0x32
  kfdhdb.ub4spare[0]:0 ; 0x0ec: 0x00000000
  kfdhdb.ub4spare[1]:0 ; 0x0f0: 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
  
  
二. 使用BBED 查看diskheader
  BBED 的使用需要先编译,这个参考:
  Oracle BBED 工具 说明
  http://blog.csdn.net/tianlesoftware/article/details/5006580
  
  Oracle bbed 五个 实用示例
  http://blog.csdn.net/tianlesoftware/article/details/6684505
  
2.1 配置bbed
  [oracle@rac2 u01]$ cat bbed.par
  blocksize=8192
  listfile=/u01/filelist.txt
  mode=edit
  [oracle@rac2 u01]$
  
2.2 用DD 命令将diskheader 导出
  SYS@anqing2(rac2)> select path fromv$asm_disk;
  PATH
  --------------------------------------------------------------------------------
  /dev/mapper/datap1
  /dev/mapper/frap1
  
  [oracle@rac2 u01]$ ddif=/dev/mapper/datap1 of=/u01/asm_disk_header bs=4096 count=1
  1+0 records in
  1+0 records out
  4096 bytes (4.1 kB) copied, 0.000297071seconds, 13.8 MB/s
  [oracle@rac2 u01]$ pwd
  /u01
  [oracle@rac2 u01]$ ll asm_disk_header
  -rw-r--r-- 1 oracle oinstall 4096 Sep 1 10:48 asm_disk_header
  [oracle@rac2 u01]$
  
2.3 将导出的disk header 添加到bbed 的filelist里
  [oracle@rac2 u01]$ cat filelist.txt
  1 /u01/asm_disk_header
  
2.4 开始进行bbed
  [oracle@rac2 lib]$ bbedparfile=/u01/bbed.par
  Password:
  
  BBED: Release 2.0.0.0.0 - LimitedProduction on Thu Sep 1 10:53:50 2011
  
  Copyright (c) 1982, 2007, Oracle. All rights reserved.
  
  ************* !!! For Oracle Internal Useonly !!! ***************
  
  BBED> show all
  FILE# 1
  BLOCK# 1
   --这里显示的是file:1,block 1
  OFFSET 0
  DBA 0x00400001(4194305 1,1)
  FILENAME/u01/asm_disk_header
  BIFILE bifile.bbd
  LISTFILE /u01/filelist.txt
  BLOCKSIZE 512
  MODE Edit
  EDIT Unrecoverable
  IBASE Dec
  OBASE Dec
  WIDTH 80
  COUNT 512
  LOGFILE log.bbd
  SPOOL No
  
  BBED> map /v dba 1,1
  --查看block1里的详细信息
  File: /u01/asm_disk_header (1)
  Block: 1Dba:0x00400001
  ------------------------------------------------------------
  UndoSegment 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
  
  ub4tailchk@508
  
  
  查看kcbh 结构里的具体值
  BBED> print 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 0xd3a0
  ub1 seq_kcbh@14 0xe4
  ub1 flg_kcbh @150x59 (KCBHFNEW)
  ub2 chkval_kcbh@16 0x0000
  ub2 spare3_kcbh@18 0x0000
  
  @同样表示偏移量,最后一列就是具体的值.
  
  dump 这个block,查看具体内容:
  BBED> dump /v dba 1,1 offset 0 count4096
  File: /u01/asm_disk_header (1)
  Block: 1Offsets: 0 to 511Dba:0x00400001
  -------------------------------------------------------
  01820101 00000000 00000080 a0d3e459 l............ÓäY
  00000000 00000000 00000000 00000000 l................
  4f52434c4449534b 44415441 00000000 l ORCLDISKDATA....
  00000000 00000000 00000000 00000000 l................
  0000100a 00000103 44415441 00000000 l........DATA....
  00000000 00000000 00000000 00000000 l................
  00000000 00000000 44415441 00000000 l........DATA....
  00000000 00000000 00000000 00000000 l................
  00000000 00000000 44415441 00000000 l........DATA....
  00000000 00000000 00000000 00000000 l................
  00000000 00000000 00000000 00000000 l................
  00000000 00000000 00000000 00000000 l................
  00000000 00000000 0ccff601 00a822c9 l.........Ïö..¨"É
  f0daf601 009c10cd 00020010 00001000 lðÚö....Í........
  80bc0100 d92e0000 02000000 01000000 l.¼..Ù...........
  02000000 02000000 00000000 00000000 l................
  0000100a 0ccff601 003421c9 00000000 l.....Ïö..4!É....
  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>
  
  对这里的字节进行一个说明:
  Block: 1 Offsets: 0 to511 Dba:0x00400001
  -------------------------------------------------------
  01820101 00000000 00000080 a0d3e459 l............ÓäY
  这里每行16个自己,即每块4个字节,如:01820101,这块就由01,82,01和01 这4个byte 组成。
  
2.5 对上面的dump信息进行解释
  这部分直接引用Roger同学的成果了。 感谢Roger 的辛勤劳动。
  
1)第1个byte 01--这里是对应的endian_kfbh 01即使1 表示的是Little Endian 相反,0的话即使表示BIGendian
2)第2个byte 82--这里对应kfbh.hard
3)第3个byte 01--这里对应kfbh.type
4)第4个byte 01--这里对应的是datfmt_kfbh
5)第5~8个byte 00 00 0000---这里对应的是kfbh.block.blk
6)第9~12个byte00 00 0008---这里对应的是kfbh.block.obj
7)第13~16个byte 561d8578---这里对应的是kfbh.check  
  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 01   ---这里对应的是kfdhdb.grptyp 即磁盘组的冗余方式 01 表示EXTERNAL冗余
  下面对该值的属性做一下补充:
   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 到00000000 32个byte  ---这里对应的是kfdhdb.dskname 即磁盘名称 我们这里的DATA01_0000
19) 第105~~136个byte 44415441 到00000000 32个byte  ---这里对应的是kfdhdb.grpname 即是磁盘组名称 DATA01
20)第137~ 168个byte 也是44415441开始 32个byte  ---这里对应的是kfdhdb.fgname即failgroup name
21)第169~184 个byte一共16个byte     ---这里对应的是kfdhdb.capname 即是Capacitygroup name当然我这里没有使用
22)第185~188个byte 一共4个byte ---这里对应的是kfdhdb.crestmp.hi 即Creation timestamp high
23)第189~192个byte 一共4个byte ---这里对应的是kfdhdb.crestmp.lo 即Creation timestamp low
24)第193~196个byte 一共4个byte ---这里对应的是kfdhdb.mntstmp.hi
25)第197~200个byte 一共4个byte ---这里对应的是kfdhdb.mntstmp.lo
26)第201~202一共2个byte  ---这里对应的是kfdhdb.secsize 即physical sector size of the disk
27)第203~204一共2个byte  ---这里对应的是fdhdb.blksize即metadata blocksize asm block大小
28)第205~208一共4个byte  ---这里对应的是kfdhdb.ausize即AU 的大小1048576 即是1m
29)第209~212一共4个byte  ---这里对应的是kfdhdb.mfact 即Stride between physical addresses of allocation units
30)第213~216一共4个byte  ---这里对应的是kfdhdb.dsksize 即0x00001400 转换为10进制后为5120即5120个分配units =磁盘组大小
补充:
    kfdhdb.ausize * dsksize_kfdhdb = disksize
      即是 1m x 5120 =5120m (注意这个大小是整个磁盘组的大小)
31)第217~220一共4个byte  ---这里对应的是kfdhdb.pmcnt 这里该值是2即 Number of physically addressed allocation units
32)第221~224一共4个byte  ---这里对应的是kfdhdb.fstlocn即First FreeSpace table block number used to find freespace。
33)第225~228一共4个byte  ---这里对应的是kfdhdb.altlocn即First Alocation table block numer used to find allocated space
34)第229~232一共4个byte  ---这里对应的是kfdhdb.f1b1locn 即File Directory block 1 Allocation Unit number. Beginging for filedirectory
          即是第一个file directory 通常这里是2
35)第241~244一共4个byte  ---这里对应的是kfdhdb.dbcompat 转换以为即为我们的数据库版本
36)第245~248一共4个byte  ---这里对应的是kfdhdb.grpstmp.hi
     我们这里的值是 HOUR=0x15 DAYS=0x8 MNTH=0xbYEAR=0x7da
           0x7da -->2010
           0xb -->11
           0x8 -->8
           0x15-->21  
  即2010/11/08 21 这里只是精确到小时
37)第249~252一共4个byte  ---这里对应的是kfdhdb.grpstmp.lo
     我们这里的值是 USEC=0x0 MSEC=0x2c6SECS=0x17 MINS=0x29
           MINS=0x29-->41分钟
           SECS=0x17-->23秒
           MSEC=0x2c6 -->710 微秒即0.7s
           USEC=0x0 -->0
  
   这里关键是要弄清楚这些值是怎么计算出来的。 在这里补充一下计算方法,感兴趣的也可以自己去算一下。
  
  在前面我们粘贴KFED 显示disk header的结果内容:
  [oracle@rac2 ~]$kfed read/dev/mapper/datap1
  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=0x8NUMB=0x0
  kfbh.check:1508168608 ; 0x00c:0x59e4d3a0
  kfbh.fcn.base:0 ; 0x010: 0x00000000
  kfbh.fcn.wrap:0 ; 0x014: 0x00000000
  kfbh.spare1:0 ; 0x018: 0x00000000
  kfbh.spare2:0; 0x01c: 0x00000000
  
  这里面每行都有一个16进制的值和内容。 16进制就是对应的开始bytes。
  如:
  kfbh.spare1:0 ; 0x018: 0x00000000
  kfbh.spare2:0; 0x01c: 0x00000000
  
   0x018对应的10进制是24,0x01c 对应的10进制是28. 所以24-27bytes 就是kfbh.spare1的内容。
  了解这些内容,我们可以使用BBED 来修改,或者使用KFED 修改disk header, 然后在merge 回去。 这样也能处理disk header 的故障。 关于disk header 故障处理会另篇说明。
  
  
  
  
  
  
  
  -------------------------------------------------------------------------------------------------------
  Blog: http://blog.csdn.net/tianlesoftware
  Weibo: http://weibo.com/tianlesoftware
  Email: dvd.dba@gmail.com
  DBA1 群:62697716(满); DBA2 群:62697977(满)DBA3 群:62697850(满)
  DBA 超级群:63306533(满); DBA4 群:83829929(满) DBA5群: 142216823(满)
  DBA6 群:158654907(满) DBA7 群:69087192(满)DBA8 群:172855474
  DBA 超级群2:151508914 DBA9群:102954821 聊天 群:40132017(满)
  --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257016-1-1.html 上篇帖子: Oracle 10g 备份与恢复之(expdp与impdp) 下篇帖子: Oracle Transportable TableSpace(TTS) 传输表空间 说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表