【作者简介】
本人医疗行业DBA,精通oracle底层;会文件、触发器加密的勒索恢复、asm磁盘组不能mount及各种灾难恢复,后面将利用空闲时间将自己工作中遇到的问题及整理的资料分享给更多愿意学习和提升自己的dba。作者微信号:Oray_123
【正文】
1、介绍
* 什么是模版?就是v$asm_template,在磁盘组上创建文件时可以使用模板来设置文件的属性。这些属性包括:redundancy,strip. 这些属性可以显示的指定,也可以使用系统模板。具体会根据文件类型来选择不同的模板,从而设置不同的属性。在我们创建disk group的时候,Oracle ASM 会针对这个diskgroup创建一组默认的模板。这些模板分别对应不同的文件类型,如:data file, control file, redo log file等ORACLE ASM 支持的文件类型。* asm底层 5号文件是ASM的模板目录。* 模版有两类:系统自带、用户创建;* 模版是根据磁盘组来设置的,每个磁盘组都有自己的模版;* 每个模版都有如下的一些信息:文件模版名称、文件冗余度、条带、是否系统创建标识
2、使用系统创建的模版
系统自带的模版是根据asm文件创建时候是什么类型来进行自动分配的,换句话说就是比如我们创建一个表空间,这个表空间对应的数据文件就是一个DATAFILE,那么ASM就会有一个叫DATAFILE的模版进行对应,这样我们每次创建该类文件时候就会用到这个模版文件;同理如果归档日志通过归档进程创建,那么就会用到ARCHIVELOG模版...set line 200col diskgroup_name for a15col disk_name for a10col path for a40select a.group_number,a.name diskgroup_name,a.type,a.allocation_unit_size/1024/1024 unit_mb,a.voting_files,b.name disk_name,b.path,b.os_mb/1024 as os_gb,b.total_mb/1024 as total_gb,b.free_mb/1024 as free_gb3 from v$asm_diskgroup a,v$asm_disk b where a.group_number=b.group_number;GROUP_NUMBER DISKGROUP_NAME TYPE UNIT_MB VO DISK_NAME PATH OS_GB TOTAL_GB FREE_GB------------ --------------- -------------------- ---------- -- ---------- ---------------------------------------- ---------- ---------- ----------1 EDATA EXTERN 4 N EDATA_0000 dev/oracleasm/disks/ASMDATA3 29.2958984 29.2929688 25.2031252 NDATA NORMAL 4 N NDATA_0001 dev/oracleasm/disks/ASMDATA2 9.76464844 9.76171875 8.752 NDATA NORMAL 4 N NDATA_0000 dev/oracleasm/disks/ASMDATA1 9.76464844 9.76171875 8.753 OCR NORMAL 4 Y OCR_0001 dev/oracleasm/disks/ASMOCR2 1.95214844 1.94921875 1.613281253 OCR NORMAL 4 Y OCR_0000 dev/oracleasm/disks/ASMOCR1 1.95214844 1.94921875 1.605468753 OCR NORMAL 4 Y OCR_0002 dev/oracleasm/disks/ASMOCR3 1.95214844 1.94921875 1.6171875SQL> SELECT name "Template Name", redundancy "Redundancy", stripe "Striping", system "System"FROM v$asm_templateWHERE group_number=2;Template Name Redundancy Striping System------------------------ ---------------- ---------------- --------PARAMETERFILE MIRROR COARSE YASMPARAMETERFILE MIRROR COARSE YDUMPSET MIRROR COARSE YCONTROLFILE HIGH FINE YFLASHFILE MIRROR COARSE YARCHIVELOG MIRROR COARSE YONLINELOG MIRROR COARSE YDATAFILE MIRROR COARSE YTEMPFILE MIRROR COARSE YBACKUPSET MIRROR COARSE YAUTOBACKUP MIRROR COARSE YXTRANSPORT MIRROR COARSE YCHANGETRACKING MIRROR COARSE YFLASHBACK MIRROR COARSE YDATAGUARDCONFIG MIRROR COARSE YOCRFILE MIRROR COARSE Y16 rows selected.有一个模板非常的显眼,那就是控制文件(3重镜像,细粒度条带),这是默认的数据库控制文件的模板,这是为什么每一个控制文件都会被做三重镜像的原因。有趣的是,我们可以使用它创建任何的数据库文件。这里举一个例子(注意我连接的是数据库的实例):SQL> create tablespace TRIPLE_F datafile '+NDATA(CONTROLFILE)' size 1m;Tablespace created.SQL> SELECT name FROM v$datafile WHERE name like '%triple_f%';NAME--------------------------------------------------------------------------------+NDATA/ORCL/DATAFILE/triple_f.261.1141575639上面创建了一个表空间,ASM给我新创建的数据文件分配了编号261,我们接着看下这个文件的冗余度,这一次我连接的是ASM的实例:SQL> SELECT group_number, name, type "Redundancy" FROM v$asm_diskgroup WHERE name='NDATA';GROUP_NUMBER NAME Redundancy------------ -------------------------------- ----------------2 NDATA NORMAL这是一个normal冗余的磁盘组,但是由于我们使用了控制文件模板来创建数据文件,因此我们通过查询内部视图 x$kffxp来获得我们想要的信息:SQL> SELECT xnum_kffxp "Extent", au_kffxp "AU", disk_kffxp "Disk"FROM x$kffxpWHERE (group_kffxp=2 and number_kffxp=261)and disk_kffxp <> 65534ORDER BY 1,2;Extent AU Disk---------- ---------- ----------0 259 10 259 01 260 01 260 12 261 12 261 0...7 266 07 266 116 rows selected.如预期,这个文件被做了2重镜像,因为我们看到每一个虚拟区都由2个物理区组成,但是为什么我的数据文件仅仅只有1MB,但是却有8个虚拟区呢,这是因为控制文件的模板是一个精细条带的模板。译者注:隐含参数_asm_stripesize代表了精细条带的大小,默认为128K,隐含参数_asm_stripewidth代表了条带的宽度,默认为8。但是有一点很奇怪,精细条带下,数据文件头好像没有独占一个extent,因为上面查询显示了这个1MB的文件一共占用了8个extent,而不是9个extent,按照条带宽度是8的设定,文件内容本身就应该占用了8个extent。
3、用户创建的模版
如果我想要文件具有三重镜像但是粗粒度的条带,该怎么做?我们可以手工创建一个我们自己的模板,COARSE关键字指定了这是一个粗粒度的条带:SQL> alter diskgroup NDATA add template TRIPLE_COARSE attributes (HIGH COARSE);Diskgroup altered.Let's now use this template. Back to the database instance...SQL> create tablespace TRIPLE_C datafile '+NDATA(TRIPLE_COARSE)' size 1m;Tablespace created.SQL> SELECT name FROM v$datafile WHERE name like '%triple_c%';NAME--------------------------------------------------------------------------------+NDATA/ORCL/DATAFILE/triple_c.262.1141576085ASM的文件号是262,返回到ASM实例检查:SQL> SELECT xnum_kffxp "Extent", au_kffxp "AU", disk_kffxp "Disk"FROM x$kffxpWHERE (group_kffxp=2 and number_kffxp=262)and disk_kffxp <> 65534ORDER BY 1,2;Extent AU Disk---------- ---------- ----------0 267 10 267 0这次的结果显示了只为1MB的文件分配了1个虚拟区,额外的一个是ASM的文件头。注意这个文件是2重的镜像和粗粒度的条带。我也可以创建一个根本不做镜像的模板,我们试试看:SQL> alter diskgroup NDATA add template NO_MIRRORING attributes (UNPROTECTED);Diskgroup altered.接下来我们使用我们上面创建的模板来添加一个数据文件:SQL> create tablespace NOT_IMPORTANT datafile '+NDATA(NO_MIRRORING)' size 1m;Tablespace created.SQL> SELECT name FROM v$datafile WHERE name like '%not_important%';NAME--------------------------------------------------------------------------------+NDATA/ORCL/DATAFILE/not_important.263.1141576263上面新产生的数据文件的编号是273,我们来检查一下:SQL> SELECT xnum_kffxp "Extent", au_kffxp "AU", disk_kffxp "Disk"FROM x$kffxpWHERE (group_kffxp=2 and number_kffxp=263)and disk_kffxp <> 65534ORDER BY 1,2;Extent AU Disk---------- ---------- ----------0 268 1我们看到这个文件没有被镜像(虽然它是在一个normal冗余的磁盘组中)。
4、kfed解析模版目录
set line 200 pages 1000col "disk name" for a20col path for a30col type for a20col au for 99999SELECT x.number_kffxp file#,x.xnum_kffxp "Extent",case lxn_kffxpwhen 0 then 'Primary Copy'when 1 then 'Mirrored Copy'when 2 then '2nd Mirrored Copy or metadata'else 'Unknown' end type,x.au_kffxp "AU",x.disk_kffxp "Disk #",d.name "Disk name",d.path,d.GROUP_NUMBER,d.DISK_NUMBERFROM x$kffxp x, v$asm_disk_stat dWHERE x.group_kffxp=d.group_numberand x.disk_kffxp=d.disk_numberand x.group_kffxp=2and x.number_kffxp=5ORDER BY 1, 2;FILE# Extent TYPE AU Disk # Disk name PATH GROUP_NUMBER DISK_NUMBER---------- ---------- -------------------- ------ ---------- -------------------- ------------------------------ ------------ -----------5 0 Mirrored Copy 29 0 NDATA_0000 dev/oracleasm/disks/ASMDATA1 2 05 0 Primary Copy 29 1 NDATA_0001 dev/oracleasm/disks/ASMDATA2 2 1--找5号文件的分布信息[grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA1 aun=0 blkn=0|egrep -i "aus|f1b1locn"kfdhdb.ausize: 4194304 ; 0x0bc: 0x00400000kfdhdb.f1b1locn: 10 ; 0x0d4: 0x0000000a[grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA1 aun=10 blkn=5 aus=4M|egrep "block|disk|au"|egrep -v "65535|4294967295"kfbh.block.blk: 5 ; 0x004: blk=5kfbh.block.obj: 1 ; 0x008: file=1kfffde[0].xptr.au: 29 ; 0x4a0: 0x0000001dkfffde[0].xptr.disk: 1 ; 0x4a4: 0x0001kfffde[1].xptr.au: 29 ; 0x4a8: 0x0000001dkfffde[1].xptr.disk: 0 ; 0x4ac: 0x0000从上面信息可以看到模版分配信息在disk 1的第29 au中,disk 0 的29 au中;和x$kffxp查询的结果完全一致;[grid@his1 ~]$ kfed read dev/oracleasm/disks/ASMDATA1 aun=29 aus=4M blkn=0|morekfbh.endian: 1 ; 0x000: 0x01kfbh.hard: 130 ; 0x001: 0x82kfbh.type: 10 ; 0x002: KFBTYP_TMPLTDIRkfbh.datfmt: 1 ; 0x003: 0x01kfbh.block.blk: 0 ; 0x004: blk=0kfbh.block.obj: 5 ; 0x008: file=5kfbh.check: 17465861 ; 0x00c: 0x010a8205kfbh.fcn.base: 0 ; 0x010: 0x00000000kfbh.fcn.wrap: 0 ; 0x014: 0x00000000kfbh.spare1: 0 ; 0x018: 0x00000000kfbh.spare2: 0 ; 0x01c: 0x00000000kffdnd.bnode.incarn: 1 ; 0x000: A=1 NUMM=0x0kffdnd.bnode.frlist.number: 4294967295 ; 0x004: 0xffffffffkffdnd.bnode.frlist.incarn: 0 ; 0x008: A=0 NUMM=0x0 --kffdnd这部分信息其实用来定位和描述block在目录树中的具体位置的。kffdnd.overfl.number: 4294967295 ; 0x00c: 0xffffffffkffdnd.overfl.incarn: 0 ; 0x010: A=0 NUMM=0x0kffdnd.parent.number: 0 ; 0x014: 0x00000000kffdnd.parent.incarn: 1 ; 0x018: A=1 NUMM=0x0kffdnd.fstblk.number: 0 ; 0x01c: 0x00000000kffdnd.fstblk.incarn: 1 ; 0x020: A=1 NUMM=0x0kftmde[0].entry.incarn: 0 ; 0x024: A=0 NUMM=0x0 --kftmde,这部分结构主要是包括template模板的详细信息,如条带大小,宽度等信息.kftmde[0].entry.hash: 0 ; 0x028: 0x00000000 --hash值,无太大实际意义kftmde[0].entry.refer.number: 0 ; 0x02c: 0x00000000 --指向下一层的block号kftmde[0].entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0kftmde[0].templ.name: ; 0x034: length=0 --template模版名称kftmde[0].templ.flags: 0 ; 0x054: S=0 S=0 S=0 H=0 --标志信息kftmde[0].templ.redun: 0 ; 0x058: SCHE=0x0 NUMB=0x0 --冗余级别,17表示unprot,18表示MIRROR,19表示high.kftmde[0].templ.strpwdth: 0 ; 0x059: 0x00 --条带宽度kftmde[0].templ.strpsz: 0 ; 0x05a: 0x00 --条带大小kftmde[0].templ.priZn: 0 ; 0x05b: 0x00kftmde[0].templ.secZn: 0 ; 0x05c: 0x00kftmde[0].templ.ub1spare: 0 ; 0x05d: 0x00 --下面这部分信息没有实际意义kftmde[0].templ.ub2spare: 0 ; 0x05e: 0x0000kftmde[0].templ.dXsiz[0]: 0 ; 0x060: 0x00000000kftmde[0].templ.dXsiz[1]: 0 ; 0x064: 0x00000000kftmde[0].templ.dXsiz[2]: 0 ; 0x068: 0x00000000kftmde[0].templ.iXsiz[0]: 0 ; 0x06c: 0x00000000kftmde[0].templ.iXsiz[1]: 0 ; 0x070: 0x00000000kftmde[0].templ.iXsiz[2]: 0 ; 0x074: 0x00000000kftmde[0].templ.entry: 0 ; 0x078: 0x00000000kftmde[0].templ.idx: 0 ; 0x07c: 0x00000000kftmde[0].templ.spare[0]: 0 ; 0x080: 0x00000000kftmde[0].templ.spare[1]: 0 ; 0x084: 0x00000000kftmde[0].templ.spare[2]: 0 ; 0x088: 0x00000000kftmde[0].templ.spare[3]: 0 ; 0x08c: 0x00000000kftmde[0].templ.spare[4]: 0 ; 0x090: 0x00000000kftmde[0].templ.spare[5]: 0 ; 0x094: 0x00000000kftmde[0].templ.spare[6]: 0 ; 0x098: 0x00000000kftmde[0].templ.spare[7]: 0 ; 0x09c: 0x00000000kftmde[0].templ.spare[8]: 0 ; 0x0a0: 0x00000000kftmde[0].templ.spare[9]: 0 ; 0x0a4: 0x00000000kftmde[0].templ.spare[10]: 0 ; 0x0a8: 0x00000000kftmde[1]..kftmde[2]..到这里,基本上asm template directory的结构大概描述完了,比较简单,而且这部分内容通常也不需要去关注,大家了解下即可。上面提到了asm 条带,我这里就补充一点关于asm条带方面的内容。在10g中,关于asm条带宽度和大小主要是由如下两个参数在空中:SQL> select * from V$version where rownum < 3;BANNER----------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdPL/SQL Release 10.2.0.1.0 - ProductionSQL> show parameter asm_stripNAME TYPE VALUE------------------------------------ ----------- ------------------------------_asm_stripesize integer 131072 --默认是128k_asm_stripewidth integer 8 --8个条带大小你会发现stripsize * stripwidth 恰好是1m,这也正是我们的AU size大小,而1m通常也是大多数操作系统所能达到的单次最大io量。asm 的条带分为两种COARSE和FINE,也被称为粗条带和细条带。粗条带,默认就等于你的AU size,比如我这里au size为1m,那么粗条带大小就是1m,这种情况下的条带,通常实用于连续性的大IO操作,例如全表扫描。细条带,默认是128k,8个条带组成一个AU,这种条带类型通常适用于对于读写延迟比较敏感的文件,比如redo logfile,controlfile。从我前面10gR2的查询结果可以看出,其中也就redo和controlfile以及flashback是fine类型的,其他的均为粗条带,下面我进行一个简单的分类:---默认是粗条带模板 ---默认是细条带模板PARAMETERFILE CONTROLFILEDUMPSET ONLINELOGARCHIVELOG FLASHBACKDATAFILETEMPFILEBACKUPSETAUTOBACKUPXTRANSPORTCHANGETRACKINGDATAGUARDCONFIG关于asm的条带大小,其实跟我们平常说讲的存储条带是一样的,比如aix中对lv进行条带。oracle官方文档的推荐值是要求你设置条带大小最少为2*DB_FILE_MULTIBLOCK_READ_COUNT. 然而,通常来讲,我们都推荐设置为128k甚至更高的值。
文章转载自数据库技术加油站,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




