1.ASM存储结构
ASM磁盘-->ASM disk group -->asm file -->extent--->asm unit---->asm block
分配单元是最小的io单位,类似于数据库的块,默认是1MB,最大可设置到64MB。
ASM在进行条带化时,一般也是以分配单元为单位进行分割的。每个分配单元在物理上有
一组连续的磁盘块构成。
2.ASM和oracle新的后台进程
(1). PST - Partner StatusTable. Maintains info on disk-to-diskgroupmembership.
(2). COD - ContinuingOperation Directory. The COD structuremaintains the state of active ASMoperations or changes, such as disk ordatafile drop/add. The COD log record iseither committed or rolled back basedon the success of the operation. (source Oraclewhitepaper)
(3). ACD - Active ChangeDirectory. The ACD is analogous to a redolog, where changes to the metadata arelogged. The ACD log record is used todetermine point of recovery in the case ofASM operation failures or instancefailures. (source Oracle whitepaper)
(4). OSM Oracle StorageManager, legacy name, synonymous of ASM
(5). CSS ClusterSynchronization Services. Part of Oracleclusterware, mandatory with ASM even insingle instance. CSS is used toheartbeat the health of the ASM instances.
(6). RBAL - Oraclebackgroud process. In an ASM instance coordinatedrebalancing operations. In aDB instance, opens and mount diskgroups from thelocal ASM instance.
(7). ARBx - Oraclebackgroud processes. In an ASM instance, a slavefor rebalancing operations
(8). PSPx - Oraclebackgroud processes. In an ASM instance, ProcessSpawners
(9). GMON - Oraclebackgroud processes. In an ASM instance,diskgroup monitor.
(10). ASMB - Oraclebackgroudprocess. In an DB instance, keeps a (bequeath) persistent DB connectionto thelocal ASM instance. Provides hearthbeat and ASM statistics. During adiskgrouprebalancing operation ASM communicates to the DB AU changes via thisconnection.
(11). O00x - Oraclebackgroudprocesses. Slaves used to connected from the DB to the ASM instancefor 'shortoperations'.
2.1.asm 实例的后台进程介绍
RBAL:重平衡进程,当有磁盘加入或退出时,对asm文件的扩展重新分布,以达到平衡磁盘访问的效果
ARBx:平衡子进程,具体实施平衡的一组子进程
2.2.在数据库实例中,存在以下几种新的后台进程
ASMB: 从css处获取ASM实例连接串,然后创建到ASM实例的连接,和ASM进行交互,比如更新统计信息,获取文件
扩展分配表等
RBAL: 全局性地打开ASM磁盘组中的所有磁盘,供后面的操作使用
O0nn:一组连接到ASM 实例的子进程,构成连接池,加快和ASM实例的交互
需要注意的是,ASM 只是向数据库提供了ASM文件的空间分配和文件管理服务,并不接管文件
的读写功能,因此,具体的文件读写还是由数据库进程执行的。比如,数据库脏块的写操作由dbwr进程完成,
日志记录的写操作由lgwr进程完成,归档日志的写操作由archive或服务器进程完成
3.ASM的结构
ASM的metdata是由一系列内部文件组成的,其中file 0就是ASM diskheader。
ASM通过一系列元数据进行管理,这些元数据类似于数据库的数据字典.元数据从形式上分为物理元数据
和虚拟元数据。所谓物理元数据,是指记录在磁盘固定文职的数据,主要包括磁盘头,分配表,空闲空间表
和伙伴状态表。而虚拟元数据是指以文件的形式存在的元数据,其位置不固定,主要包括文件目录,磁盘目录,
活动变化目录,继续操作目录,模版目录,别名目录,属性目录,过期目录,注册表等。
元数控的每个块4096b,每个块都有相应的结构,这些结构随版本的升级会略有扩展。
3.1磁盘头的数据结构有2部分组成,第一部分是块头,共32b,块头结构kfbh如下
SQL> select group_kfdat group#,FNUM_KFDAT file#, sum(1) AU_used from x$kfdat where v_kfdat='V' group by group_kfdat,FNUM_KFDAT,v_kfdat;
GROUP# FILE# AU_USED
---------- ---------- ----------
1 0 2
1 1 2
1 2 1
1 3 42
1 4 8
1 5 1
1 6 1
1 7 1
1 8 1
1 9 1
以上SQL 显示,在每个disk groups 上,都有file# 从0-6 的信息,并且显示了该File 占用的AU 大小。这里的信息就是我们需要关注的信息。 关于这7个File#的说明如下:
(1). File#0, AU=0: disk header (disk name, etc), Allocation Table (AT)andFree Space Table (FST)
(2). File#0, AU=1: PartnerStatus Table (PST)
(3). File#1: File Directory(files and their extent pointers)
(4). File#2: Disk Directory
(5). File#3: Active ChangeDirectory (ACD) The ACD is analogous to a redolog, where changes to themetadata are logged. Size=42MB * number of instances
(6). File#4: Continuing OperationDirectory (COD). The COD is analogousto an undo tablespace. It maintains thestate of active ASM operations such asdisk or datafile drop/add. The COD logrecord is either committed or rolledback based on the success of the operation.
(7). File#5: Template directory
(8). File#6: Alias directory
(9). 11g, File#9: AttributeDirectory
(10). 11g, File#12:Staleness(陈旧) registry, created when needed to track offline disks
[root@dbrac1 disks]# /u01/app/11.2.0/grid/bin/kfed read VOL2
--块头
kfbh.endian: 1 ; 0x000: 0x01 --平台软件的字节顺序(大小端)
kfbh.hard: 130 ; 0x001: 0x82 --用于标识的magic数
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD --元数据类型,主要包括1种磁盘头,4种文件目录,6种磁盘目录,11种别名和12种间接扩展
kfbh.datfmt: 1 ; 0x003: 0x01 --元数据数据块数据格式
kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0 --当前块的位置信息,包括所属对象以及块号
kfbh.block.obj: 2147483650 ; 0x008: TYPE=0x8 NUMB=0x2 --
kfbh.check: 3528899831 ; 0x00c: 0xd256bcf7 --用于块一致性检查的校验和
kfbh.fcn.base: 0 ; 0x010: 0x00000000 --最后一次改变的scn base
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 --最后一次改变的scn wrap
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
--磁盘头
kfdhdb.driver.provstr: ORCLDISKVOL2 ; 0x000: length=12 --驱动程序保留信息
kfdhdb.driver.reserved[0]: 843861846 ; 0x008: 0x324c4f56
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 --打开本磁盘组所需的ASM最小版本
kfdhdb.dsknum: 2 ; 0x024: 0x0002 --磁盘号
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: VOL2 ; 0x028: length=4 --This indicatesDisk Name 磁盘名
kfdhdb.grpname: DATA1 ; 0x048: length=5 --This indicates theGroupName for the disk. 磁盘组名
kfdhdb.fgname: VOL2 ; 0x068: length=4 --This indicatestheFailure Group Name. 失败组名
kfdhdb.capname: ; 0x088: length=0
kfdhdb.crestmp.hi: 32989937 ; 0x0a8: HOUR=0x11 DAYS=0x17 MNTH=0x8 YEAR=0x7dd --创建时间戳
kfdhdb.crestmp.lo: 2915066880 ; 0x0ac: USEC=0x0 MSEC=0x19 SECS=0x1c MINS=0x2b
kfdhdb.mntstmp.hi: 32998703 ; 0x0b0: HOUR=0xf DAYS=0x9 MNTH=0x1 YEAR=0x7de --mount时间戳
kfdhdb.mntstmp.lo: 965316608 ; 0x0b4: USEC=0x0 MSEC=0x264 SECS=0x18 MINS=0xe
kfdhdb.secsize: 512 ; 0x0b8: 0x0200 --磁盘扇区大小
kfdhdb.blksize: 4096 ; 0x0ba: 0x1000 --元数据库大小
kfdhdb.ausize: 1048576 ; 0x0bc: 0x00100000 --分配单元大小
kfdhdb.mfact: 113792 ; 0x0c0: 0x0001bc80
kfdhdb.dsksize: 1137 ; 0x0c4: 0x00000471 --磁盘大小,以分配单元为单位
kfdhdb.pmcnt: 2 ; 0x0c8: 0x00000002 --物理元数据所占用的分配单元数
kfdhdb.fstlocn: 1 ; 0x0cc: 0x00000001 --空闲空间表的第一个块号
kfdhdb.altlocn: 2 ; 0x0d0: 0x00000002 --分配表的第一个块号
kfdhdb.f1b1locn: 0 ; 0x0d4: 0x00000000 --文件目录指针,文件目录是一个特殊的虚拟元数据文件,它包含了所有ASM文件的I-NODE
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: 32989936 ; 0x0e4: HOUR=0x10 DAYS=0x17 MNTH=0x8 YEAR=0x7dd --磁盘组创建时间戳
kfdhdb.grpstmp.lo: 2697060352 ; 0x0e8: USEC=0x0 MSEC=0x78 SECS=0xc MINS=0x28
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
3.2ASM file directory文件结构
文件目录包含了所有ASM文件的i-node信息,其中主要的是文件大小和扩展分配表,其文件号是1.文件目录在结构上是按块组织的,每个块的数据结构
由三部分组成:
第一部分是块头kfbh,结构和磁盘头的块头一样,第二部分结构kfffdb,主要包含了文件分配信息。
根据kfdhdb.f1b1locn: 2 ; 0x0d4: 0x00000002 --文件目录指针,文件目录是一个特殊的虚拟元数据文件,它包含了所有ASM文件的I-NODE
[root@11gr2asm ~]# /11gr2/grid/bin/kfed read /dev/sdb1 aunum=2 blknum=1 >>/tmp/1
[root@11gr2asm ~]# /11gr2/grid/bin/kfed read /dev/sdb1 aunum=2 blknum=1 >>/tmp/1
[root@11gr2asm ~]# cat /tmp/2
kfffdb.node.incarn: 1 ; 0x000: A=1 NUMM=0x0 --块的分配信息,包括块的分支号和指向freelist中下一个块的指针,分支号是一个内部序列号,每次块被重用都会增加,其作用类是于版本号
kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff
kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0
kfffdb.hibytes: 0 ; 0x00c: 0x00000000 --文件字节数高位
kfffdb.lobytes: 2097152 ; 0x010: 0x00200000 --文件字节数低位
kfffdb.xtntcnt: 2 ; 0x014: 0x00000002 --直接扩展数
kfffdb.xtnteof: 2 ; 0x018: 0x00000002 --文件EOF之前的扩展数
kfffdb.blkSize: 4096 ; 0x01c: 0x00001000 --每个块的字节数,不同的文件类型块大小可能不同,比如,元数据为4096b,数据库日志文件为512b,而数据文件一般是8k
kfffdb.flags: 1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0 --文件标志
kfffdb.fileType: 15 ; 0x021: 0x0f --文件类型 15:元数据文件; 13:参数文件; 12:数据文件;6:临时文件;3:日志文件;1:控制文件
kfffdb.dXrs: 17 ; 0x022: SCHE=0x1 NUMB=0x1 --直接扩展冗余模式,如果采用了正常冗余,每个扩展还会增加一个镜像,而如果采用高度冗余,每个扩展会增加2个镜像
kfffdb.iXrs: 17 ; 0x023: SCHE=0x1 NUMB=0x1 --间接扩展冗余模式
kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffff --每种扩展大小包含的直接扩展数,扩展大小分为1个分配单元,4个分配单元,16个分配单元三种
kfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000
kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000
kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffff --每种扩展大小包含的间接扩展数
kfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000
kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000
kfffdb.xtntblk: 2 ; 0x03c: 0x0002 --本快包含的直接和间接扩展指针数
kfffdb.break: 60 ; 0x03e: 0x003c --直接和间接扩展指针的边界插槽,一般是60,表示前60个是直接扩展指针
kfffdb.priZn: 0 ; 0x040: KFDZN_COLD --主扩展所处磁盘区
kfffdb.secZn: 0 ; 0x041: KFDZN_COLD --镜像扩展所处磁盘区
kfffdb.ub2spare: 0 ; 0x042: 0x0000
kfffdb.alias[0]: 4294967295 ; 0x044: 0xffffffff --文件指针别名
kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff
kfffdb.strpwdth: 0 ; 0x04c: 0x00 --条带宽度,即条带跨越几个扩展,可以简单理解为在几个磁盘间做条带。
kfffdb.strpsz: 0 ; 0x04d: 0x00 --条带大小(2^N)比如20表示1m的条带。条带宽度和条带大小决定了条带划分模式
kfffdb.usmsz: 0 ; 0x04e: 0x0000 --文件附加的用户元数据大小
kfffdb.crets.hi: 32976075 ; 0x050: HOUR=0xb DAYS=0x6 MNTH=0xb YEAR=0x7dc --文件创建时间
kfffdb.crets.lo: 1819780096 ; 0x054: USEC=0x0 MSEC=0x1e9 SECS=0x7 MINS=0x1b
kfffdb.modts.hi: 32976075 ; 0x058: HOUR=0xb DAYS=0x6 MNTH=0xb YEAR=0x7dc --文件修改时间
kfffdb.modts.lo: 1819780096 ; 0x05c: USEC=0x0 MSEC=0x1e9 SECS=0x7 MINS=0x1b
kfffdb.dasz[0]: 0 ; 0x060: 0x00
kfffdb.dasz[1]: 0 ; 0x061: 0x00
kfffdb.dasz[2]: 0 ; 0x062: 0x00
kfffdb.dasz[3]: 0 ; 0x063: 0x00
kfffdb.permissn: 0 ; 0x064: 0x00
kfffdb.ub1spar1: 0 ; 0x065: 0x00
kfffdb.ub2spar2: 0 ; 0x066: 0x0000
kfffdb.user.entnum: 0 ; 0x068: 0x0000
kfffdb.user.entinc: 0 ; 0x06a: 0x0000
kfffdb.group.entnum: 0 ; 0x06c: 0x0000
kfffdb.group.entinc: 0 ; 0x06e: 0x0000
kfffdb.spare[0]: 0 ; 0x070: 0x00000000
kfffdb.spare[1]: 0 ; 0x074: 0x00000000
kfffdb.spare[2]: 0 ; 0x078: 0x00000000
kfffdb.spare[3]: 0 ; 0x07c: 0x00000000
kfffdb.spare[4]: 0 ; 0x080: 0x00000000
kfffdb.spare[5]: 0 ; 0x084: 0x00000000
kfffdb.spare[6]: 0 ; 0x088: 0x00000000
kfffdb.spare[7]: 0 ; 0x08c: 0x00000000
kfffdb.spare[8]: 0 ; 0x090: 0x00000000
kfffdb.spare[9]: 0 ; 0x094: 0x00000000
kfffdb.spare[10]: 0 ; 0x098: 0x00000000
kfffdb.spare[11]: 0 ; 0x09c: 0x00000000
kfffdb.usm: ; 0x0a0: length=0 --文件附加的用户元数据
kfffdb.node.incarn: 1 ; 0x000: A=1 NUMM=0x0
kfffdb.node.frlist.number: 4294967295 ; 0x004: 0xffffffff
kfffdb.node.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0
kfffdb.hibytes: 0 ; 0x00c: 0x00000000
kfffdb.lobytes: 2097152 ; 0x010: 0x00200000
kfffdb.xtntcnt: 2 ; 0x014: 0x00000002
kfffdb.xtnteof: 2 ; 0x018: 0x00000002
kfffdb.blkSize: 4096 ; 0x01c: 0x00001000
kfffdb.flags: 1 ; 0x020: O=1 S=0 S=0 D=0 C=0 I=0 R=0 A=0
kfffdb.fileType: 15 ; 0x021: 0x0f
kfffdb.dXrs: 17 ; 0x022: SCHE=0x1 NUMB=0x1
kfffdb.iXrs: 17 ; 0x023: SCHE=0x1 NUMB=0x1
kfffdb.dXsiz[0]: 4294967295 ; 0x024: 0xffffffff
kfffdb.dXsiz[1]: 0 ; 0x028: 0x00000000
kfffdb.dXsiz[2]: 0 ; 0x02c: 0x00000000
kfffdb.iXsiz[0]: 4294967295 ; 0x030: 0xffffffff
kfffdb.iXsiz[1]: 0 ; 0x034: 0x00000000
kfffdb.iXsiz[2]: 0 ; 0x038: 0x00000000
kfffdb.xtntblk: 2 ; 0x03c: 0x0002
kfffdb.break: 60 ; 0x03e: 0x003c
kfffdb.priZn: 0 ; 0x040: KFDZN_COLD
kfffdb.secZn: 0 ; 0x041: KFDZN_COLD
kfffdb.ub2spare: 0 ; 0x042: 0x0000
kfffdb.alias[0]: 4294967295 ; 0x044: 0xffffffff
kfffdb.alias[1]: 4294967295 ; 0x048: 0xffffffff
kfffdb.strpwdth: 0 ; 0x04c: 0x00
kfffdb.strpsz: 0 ; 0x04d: 0x00
kfffdb.usmsz: 0 ; 0x04e: 0x0000
kfffdb.crets.hi: 32976075 ; 0x050: HOUR=0xb DAYS=0x6 MNTH=0xb YEAR=0x7dc
kfffdb.crets.lo: 1819780096 ; 0x054: USEC=0x0 MSEC=0x1e9 SECS=0x7 MINS=0x1b
kfffdb.modts.hi: 32976075 ; 0x058: HOUR=0xb DAYS=0x6 MNTH=0xb YEAR=0x7dc
kfffdb.modts.lo: 1819780096 ; 0x05c: USEC=0x0 MSEC=0x1e9 SECS=0x7 MINS=0x1b
kfffdb.dasz[0]: 0 ; 0x060: 0x00
kfffdb.dasz[1]: 0 ; 0x061: 0x00
kfffdb.dasz[2]: 0 ; 0x062: 0x00
kfffdb.dasz[3]: 0 ; 0x063: 0x00
kfffdb.permissn: 0 ; 0x064: 0x00
kfffdb.ub1spar1: 0 ; 0x065: 0x00
kfffdb.ub2spar2: 0 ; 0x066: 0x0000
kfffdb.user.entnum: 0 ; 0x068: 0x0000
kfffdb.user.entinc: 0 ; 0x06a: 0x0000
kfffdb.group.entnum: 0 ; 0x06c: 0x0000
kfffdb.group.entinc: 0 ; 0x06e: 0x0000
kfffdb.spare[0]: 0 ; 0x070: 0x00000000
kfffdb.spare[1]: 0 ; 0x074: 0x00000000
kfffdb.spare[2]: 0 ; 0x078: 0x00000000
kfffdb.spare[3]: 0 ; 0x07c: 0x00000000
kfffdb.spare[4]: 0 ; 0x080: 0x00000000
kfffdb.spare[5]: 0 ; 0x084: 0x00000000
kfffdb.spare[6]: 0 ; 0x088: 0x00000000
kfffdb.spare[7]: 0 ; 0x08c: 0x00000000
kfffdb.spare[8]: 0 ; 0x090: 0x00000000
kfffdb.spare[9]: 0 ; 0x094: 0x00000000
kfffdb.spare[10]: 0 ; 0x098: 0x00000000
kfffdb.spare[11]: 0 ; 0x09c: 0x00000000
kfffdb.usm: ; 0x0a0: length=0
文件目录块的第三部分是一个数组结构kfxp[360],最多可以包含360个扩展指针;扩展分配表中,扩展分为直接扩展和间接扩展
每一个扩展块也有三部分组成。第一部分是块头kfbh,第二部分结构kffixb包含了文件分配信息
3.3 ASM ALIAS DIRECTORY文件结构
别名目录记录磁盘组中的别名信息,别名可以对应具体的文件,也可以是某个中间路径,其作用类似于文件系统的目录,并且也采用了层次性的形式来表示,其文件6.
别名目录在结构上是按块组织的,每个块的数据结构由三部分组成,第一部分是块头kfbh,其结构和磁盘头的块头一样;第二部分是kffdnd,主要用来定位,他描述了块在目录树
中的位置;第三部分结构是一个数组,包含了在目录树中处于同一层的别别名信息,每个目录项(别名)的结构为kfade
3.4 ASM DISK DIRECTORY文件结构
磁盘目录记录磁盘组中所有磁盘的信息,其文件号是2.磁盘目录在结构上是按块组织的,和别名目录的组织形式相同,数据结构也由三部分组成,第一部分是块头kfbh,其机构和
别名目录的块头是一样的,第二部分的结构和别名目录的kffdnd结构也是一样的;第三部分是一个数组,数组的每一项都包含了一个磁盘的信息 kfdde
3.5 X$KFFXP
ASM文件管理模式到这里就差不多了。我们使用Kfed,直接读取磁盘,描述了查找、定位文件AU分布的方式。如果只是想看看某个文件的AU分布,
当然不用每次都使用Kfed,我们可以在ASM实例中,查询视图。
这个视图很容易理解,我把它的主要列介绍一下:
GROUP_KFFXP :磁盘组编号
NUMBER_KFFXP :文件编号
PXN_KFFXP :物理区号
XNUM_KFFXP :逻辑区号
LXN_KFFXP :0=primary, 1=first mirror, 2=second mirror
DISK_KFFXP :磁盘编号
AU_KFFXP :AU号
通常,一个AU就是一个区。逻辑区和物理区的区别是,如果冗余模式是Nomarl,有两个FailGroup,那么文件的每一个AU,可以称为一个逻辑区。它在两个FailGroup中分别各自对应一个AU,
每个AU称为物理区。
vage 写的asm 深入很详细
http://www.mythdata.com/post/11.html
4. DD 备份需要多少个bytes?
我们通过KFED命令可以查看到最后一个bytes的信息:
kfdhdb.acdb.ub2spare: 0 ; 0x1de: 0x0000
这里的0x1de 转成十进制是478.即这个disk header 占用了478个bytes。 但是我们用dd 备份disk header需要备份4096个bytes,即4k。 为什么是4k?
这是受隐含参数控制的:_asm_blksize=4096。 即一个block的大小。
set linesize 100
col name for a25
col value for a15
col describ for a40
select x.ksppinm name,y.ksppstvl value,x.ksppdesc describ
from sys.x$ksppi x,sys.x$ksppcv y
where x.inst_id=userenv('instance')
and y.inst_id=userenv('instance')
and x.indx=y.indx
and x.ksppinm like '%&par%'
/
Enter value for par: _asm_blksize
old 6: and x.ksppinm like '%&par%'
new 6: and x.ksppinm like '%_asm_blksize%'
NAME VALUE DESCRIB
------------------------- --------------- ----------------------------------------
_asm_blksize 4096 metadata block size
在disk header 中某些状态位和效验位是会发生变化,但是基本信息是固定的。 使用这些固定信息就可以进行恢复。
还有一个重要的一点:dd 备份最好停机做,kfed 可以在线做。
2.2 如何清理ASMDisk
有时候一个ASM Disk由于故障,导致我们删也删不掉,加也加不进去,通常现象是磁盘的headerstatus状态不正确但是diskheader中仍然保留了部分磁盘组的信息。此时我们就需要clear这个磁盘的diskheader,然后再将它重新加入磁盘组中。
清理操作的命令如下:
ddif= of= bs=4096 count=1
dd if=/dev/zeroof= bs=4096 count=1
强调一点:慎用该命令。
[root@11gr2asm oracleasm]# /11gr2/grid/bin/kfed read /dev/sdb1 >>/11gr2/asm_sdb1.bak
[root@11gr2asm oracleasm]# dd if=/dev/zero of=/dev/sdb1 bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 4.6e-05 seconds, 89.0 MB/s
[root@11gr2asm oracleasm]# /11gr2/grid/bin/kfed read /dev/sdb1
kfbh.endian: 0 ; 0x000: 0x00
kfbh.hard: 0 ; 0x001: 0x00
kfbh.type: 0 ; 0x002: KFBTYP_INVALID
kfbh.datfmt: 0 ; 0x003: 0x00
kfbh.block.blk: 0 ; 0x004: blk=0
kfbh.block.obj: 0 ; 0x008: file=0
kfbh.check: 0 ; 0x00c: 0x00000000
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
2B56DA66B400 00000000 00000000 00000000 00000000 [................]
Repeat 255 times
KFED-00322: file not found; arguments: [kfbtTraverseBlock] [Invalid OSM block type] [] [0]
3.2 清空asmdisk header
要清空头4k disk header的原因,是由于一些垃圾位信息的存在,导致check校验值计算有误,清空完头后再merge的话,校验计算就正确了。如果不清空,
那么前4k不仅仅只包含merge的header信息,还有其他被corrupt的信息,所以用merge进去会导致校验值错误,就算修改check的16进制代码,还是不能加载diskgroup,
v$asm_disk显示header_status为provision(错误的check值会显示imcompatible),需要清空前4k再merge这样check才会正确。
[root@11gr2asm oracleasm]# su - grid
[grid@11gr2asm ~]$ sqlplus "/as sysasm"
SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 14 16:15:15 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Automatic Storage Management option
SQL> shutdown immediate
ASM diskgroups dismounted
ASM instance shutdown
SQL> startup
ORA-00099: warning: no parameter file specified for ASM instance
ASM instance started
Total System Global Area 283930624 bytes
Fixed Size 2227664 bytes
Variable Size 256537136 bytes
ASM Cache 25165824 bytes
ORA-15110: no diskgroups mounted
[root@11gr2asm oracleasm]# /11gr2/grid/bin/kfed merge /dev/sdb1 text=/11gr2/asm_sdb1.bak
SQL> alter diskgroup DATA mount;
Diskgroup altered.
5.重建ASM Disk Header
Oracle的asm这块很脆弱,如果我们没有对disk header进行,或者使用kfed merge 也失败,那么就只有最好一招:重建disk header。
这里要注意,不是所有情况下都可以重建成功的。如果重建失败,那么就只有最后一个解决方法,
重建diskgroup,然后通过备份进行全库恢复。
6.而且在11gR2里,asmcmd 的md_backup 和 md_restore命令也可以进行备份
ASMCMD [+] > md_backup /tmp/full_md.bak
Disk group metadata to be backed up: DATA
Current alias directory path: ORCL/TEMPFILE
Current alias directory path: ORCL/ONLINELOG
Current alias directory path: ORCL/DATAFILE
Current alias directory path: ORCL/PARAMETERFILE
Current alias directory path: PRIMARY/ONLINELOG
Current alias directory path: ORCL
Current alias directory path: PRIMARY
Current alias directory path: ASM/ASMPARAMETERFILE
Current alias directory path: ORCL/CONTROLFILE
Current alias directory path: ASM
Current alias directory path: PRIMARY/DATAFILE
Current alias directory path: PRIMARY/TEMPFILE
通过-S参数可以仅生成恢复脚本,不执行恢复动作
ASMCMD [+] > md_restore -S data.sql /tmp/full_md.bak
Current Diskgroup metadata being restored: DATA
ASMCMD [+] > ls
DATA/
ASMCMD [+] > exit
[grid@11gr2asm ~]$ ls
data.sql oradiag_grid
[grid@11gr2asm ~]$ cat data.sql
create diskgroup DATA EXTERNAL redundancy disk 'ORCL:DATA' name DATA size 16378M attribute 'compatible.asm' = '11.2.0.0.0', 'compatible.rdbms' = '10.1.0.0.0';
alter diskgroup /*ASMCMD AMBR*/DATA set attribute '_._DIRVERSION' = '11.2.0.0.0';
alter diskgroup /*ASMCMD AMBR*/DATA set attribute 'COMPATIBLE.ADVM' = '11.2.0.0.0';
alter diskgroup /*ASMCMD AMBR*/DATA alter template ONLINELOG attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template XTRANSPORT attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template CONTROLFILE attributes (UNPROTECTED FINE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template DATAFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template BACKUPSET attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template DUMPSET attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template CHANGETRACKING attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template DATAGUARDCONFIG attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template ASMPARAMETERFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template TEMPFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template OCRFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template FLASHFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template PARAMETERFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template FLASHBACK attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template AUTOBACKUP attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DATA alter template ARCHIVELOG attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/ASM';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/ORCL';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/PRIMARY';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/ASM/ASMPARAMETERFILE';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/ORCL/DATAFILE';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/ORCL/CONTROLFILE';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/PRIMARY/TEMPFILE';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/ORCL/TEMPFILE';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/ORCL/PARAMETERFILE';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/PRIMARY/ONLINELOG';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/PRIMARY/DATAFILE';
alter diskgroup /*ASMCMD AMBR */ DATA add directory '+DATA/ORCL/ONLINELOG';
也可以制定备份特定的磁盘组信息:
ASMCMD> md_backup /tmp/oradgbackup20110323 -G ORADG
以下是在DROP了ORADG之后,执行恢复的全过程,恢复完成以后,磁盘组被创建,模板信息被还原:
ASMCMD> md_restore --full -G oradg /tmp/oradgbackup20110323
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24577884/viewspace-1070502/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24577884/viewspace-1070502/