Template Directory包含关于磁盘组所有文件模板的信息。有两种类型的模板:一种是系统自带的,一种是用户创建的,默认的模板(系统自带的)已经包含ASM的所有文件类型,创建磁盘组时对于每种支持的文件类型将使用缺省的系统模板进行填充。用户创建的模板只会在用户特别指定时会使用。如果用户创建自己的模板将会增加新的条目,模板目录通过模板号进行索引。
每种模板条目包含以下内容:
.每个模板的名称(对于默认模板它的名称其实就是文件类型)
.文件冗余度(默认是磁盘组的冗余度)
.文件条带(默认是根据文件类型来决定文件的条带)
.系统标识(是否为系统自带的模板)
Template Directory在每个磁盘组中的文件号为5(F5)。缺省模板的模板名与文件类型相关。文件冗余默认为磁盘组冗余。文件条带默认是文件类型特定。系统标识(system flag)被设置为系统模板。用户创建的模板不会设置系统标识(system flag)。
通过查询视图V$ASM_TEMPLATE可查看完整的模板信息
10G:
sql> col system for a20 sql> col primary_region for a20 sql> col mirror_region for a20 sql> select * from v$asm_template where group_number=1; GROUP_NUMBER ENTRY_NUMBER REDUNDANCY STRIPE SYSTEM NAME ------------ ------------ ------------ ------------ -------------------- ------------------------------ 1 0 MIRROR COARSE Y PARAMETERFILE 1 1 MIRROR COARSE Y DUMPSET 1 2 HIGH FINE Y CONTROLFILE 1 3 MIRROR COARSE Y ARCHIVELOG 1 4 MIRROR FINE Y ONLINELOG 1 5 MIRROR COARSE Y DATAFILE 1 6 MIRROR COARSE Y TEMPFILE 1 7 MIRROR COARSE Y BACKUPSET 1 8 MIRROR COARSE Y AUTOBACKUP 1 9 MIRROR COARSE Y XTRANSPORT 1 10 MIRROR COARSE Y CHANGETRACKING 1 11 MIRROR FINE Y FLASHBACK 1 12 MIRROR COARSE Y DATAGUARDCONFIG 13 rows selected.
11G:
sql> col system for a20 sql> col primary_region for a20 sql> col mirror_region for a20 sql> select * from v$asm_template where group_number=3; GROUP_NUMBER ENTRY_NUMBER REDUNDANCY STRIPE SYSTEM NAME PRIMARY_REGION MIRROR_REGION ------------ ------------ ------------ ------------ -------------------- ------------------------------ -------------------- -------------------- 3 60 MIRROR COARSE Y PARAMETERFILE COLD COLD 3 61 MIRROR COARSE Y ASMPARAMETERFILE COLD COLD 3 63 MIRROR COARSE Y DUMPSET COLD COLD 3 64 HIGH FINE Y CONTROLFILE COLD COLD 3 65 MIRROR COARSE Y FLASHFILE COLD COLD 3 66 MIRROR COARSE Y ARCHIVELOG COLD COLD 3 67 MIRROR COARSE Y ONLINELOG COLD COLD 3 68 MIRROR COARSE Y DATAFILE COLD COLD 3 69 MIRROR COARSE Y TEMPFILE COLD COLD 3 170 MIRROR COARSE Y BACKUPSET COLD COLD 3 171 MIRROR COARSE Y XTRANSPORT BACKUPSET COLD COLD 3 172 MIRROR COARSE Y AUTOBACKUP COLD COLD 3 173 MIRROR COARSE Y XTRANSPORT COLD COLD 3 174 MIRROR COARSE Y CHANGETRACKING COLD COLD 3 175 MIRROR COARSE Y FLASHBACK COLD COLD 3 176 MIRROR COARSE Y DATAGUARDCONFIG COLD COLD 3 177 MIRROR COARSE Y OCRFILE COLD COLD 17 rows selected.
redundancy字段所显示的mirror为存在镜像副本,high为存在三份镜像副本,unprot为不支持镜像。其中name为controlfile的控制文件redundancy为high,stripe为fine,即为控制文件存在三份镜像,并使用细粒度条带。这是默认的数据库控制文件的模板,这是为什么每一个控制文件都会被做三重镜像的原因。有意思的是,我们可以使用它创建任何的数据库文件。例如下面将使用控制文件模板来创建一个表空间的数据文件。
连接数据库的实例
SQL> create tablespace cs datafile '+DATADG(CONTROLFILE)' size 10m; Tablespace created. SQL> select name from v$datafile where name like '%cs%'; NAME -------------------------------------------------------------------------------- +DATADG/jyrac/datafile/cs.271.931879611
上面创建了一个表空间,ASM给我新创建的数据文件分配了编号271。
查看该数据文件的冗余度
连接ASM实例
SQL> select group_number, name, type "redundancy" from v$asm_diskgroup where name='DATADG'; GROUP_NUMBER NAME redundancy ------------ ------------------------------ ------------------------------ 3 DATADG NORMAL
这是一个normal冗余的磁盘组,但是由于使用了控制文件模板来创建数据文件,因此通过查询内部视图 x$kffxp来获得想要的信息
SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name" 2 from x$kffxp x, v$asm_disk_stat d 3 where x.group_kffxp=d.group_number 4 and x.disk_kffxp=d.disk_number 5 and x.group_kffxp=3 6 and x.number_kffxp=271 7 order by 1,2,3; virtual extent physical extent au disk # disk name -------------- --------------- ---------- ---------- ------------------------------------------------------------ 0 0 1654 0 DATADG_0001 0 1 1647 2 DATADG_0002 0 2 1647 1 DATADG_0003 1 3 1648 2 DATADG_0002 1 4 1648 1 DATADG_0003 1 5 1655 3 DATADG_0000 2 6 1649 1 DATADG_0003 2 7 1655 0 DATADG_0001 2 8 1656 3 DATADG_0000 3 9 1657 3 DATADG_0000 3 10 1650 1 DATADG_0003 3 11 1656 0 DATADG_0001 4 12 1657 0 DATADG_0001 4 13 1658 3 DATADG_0000 4 14 1649 2 DATADG_0002 5 15 1650 2 DATADG_0002 5 16 1658 0 DATADG_0001 5 17 1651 1 DATADG_0003 6 18 1652 1 DATADG_0003 6 19 1651 2 DATADG_0002 6 20 1659 0 DATADG_0001 7 21 1659 3 DATADG_0000 7 22 1652 2 DATADG_0002 7 23 1653 1 DATADG_0003 24 rows selected.
这个文件被做了三重镜像,因为每一个虚拟区都由三个物理区组成,但是为什么我的数据文件仅仅只有1MB,但是却有8个虚拟区呢,这是因为控制文件的模板是一个细粒度条带的模板。隐含参数_asm_stripesize代表了细粒度条带的大小,默认为128K,隐含参数_asm_stripewidth代表了条带的宽度,默认为8。但是有一点很奇怪,细粒度条带下,数据文件头好像没有独占一个extent,因为上面查询显示了这个1MB的文件一共占用了8个extent,而不是9个extent,按照条带宽度是8的设定,文件内容本身就应该占用了8个extent。
10g:
SQL> col name for a30 SQL> col value for a50 SQL> col describ for a50 SQL> select x.ksppinm NAME,y.ksppstvl value,x.ksppdesc describ 2 from x$ksppi x, x$ksppcv y 3 where x.inst_id=USERENV('Instance') 4 and y.inst_id=USERENV('Instance') 5 and x.indx=y.indx 6 and x.ksppinm like '%asm_strip%'; NAME VALUE DESCRIB ------------------------------ -------------------------------------------------- -------------------------------------------------- _asm_stripewidth 8 ASM file stripe width _asm_stripesize 131072 ASM file stripe size
11g:
SQL> col value for a50 SQL> col describ for a50 SQL> select x.ksppinm NAME,y.ksppstvl value,x.ksppdesc describ 2 from x$ksppi x, x$ksppcv y 3 where x.inst_id=USERENV('Instance') 4 and y.inst_id=USERENV('Instance') 5 and x.indx=y.indx 6 and x.ksppinm like '%asm_strip%'; NAME VALUE DESCRIB ------------------------------ -------------------------------------------------- -------------------------------------------------- _asm_stripewidth 8 ASM file stripe width _asm_stripesize 131072 ASM file stripe size
而stripsize * stripwidth 恰好是1m,这也正是我们的AU size大小,而1m通常也是大多数操作系统所能达到的单次最大io量。asm 的条带分为两种COARSE和FINE,也被称为粗粒度条带和细粒度条带。粗粒度条带,默认就等于你的AU size,比如我这里au size为1m,那么粗粒度条带大小就是1m,这种情况下的条带,通常实用于连续性的大IO操作,例如全表扫描。细粒度条带,默认是128k,8个条带组成一个AU,这种条带类型通常适用于对于读写延迟比较敏感的文件,比如redo logfile,controlfile。从前面10g的查询结果可以看出,其中也就redo和controlfile以及flashback是fine类型的,其他的均为粗条带,而在11g中变为只有controlfile为fine类型。
用户模板
如果想要文件具有三重镜像但是粗粒度的条带,该怎么做?可以手工创建一个我们自己的模板,COARSE关键字指定了这是一个粗粒度的条带:
连接ASM实例
SQL> alter diskgroup datadg add template cs_stripe_coarse attributes (HIGH COARSE); Diskgroup altered. SQL> select * from v$asm_template where group_number=3; GROUP_NUMBER ENTRY_NUMBER REDUNDANCY STRIPE SYSTEM NAME PRIMARY_REGION MIRROR_REGION ------------ ------------ ------------ ------------ -------------------- ------------------------------ -------------------- -------------------- 3 60 MIRROR COARSE Y PARAMETERFILE COLD COLD 3 61 MIRROR COARSE Y ASMPARAMETERFILE COLD COLD 3 63 MIRROR COARSE Y DUMPSET COLD COLD 3 64 HIGH FINE Y CONTROLFILE COLD COLD 3 65 MIRROR COARSE Y FLASHFILE COLD COLD 3 66 MIRROR COARSE Y ARCHIVELOG COLD COLD 3 67 MIRROR COARSE Y ONLINELOG COLD COLD 3 68 MIRROR COARSE Y DATAFILE COLD COLD 3 69 MIRROR COARSE Y TEMPFILE COLD COLD 3 170 MIRROR COARSE Y BACKUPSET COLD COLD 3 171 MIRROR COARSE Y XTRANSPORT BACKUPSET COLD COLD 3 172 MIRROR COARSE Y AUTOBACKUP COLD COLD 3 173 MIRROR COARSE Y XTRANSPORT COLD COLD 3 174 MIRROR COARSE Y CHANGETRACKING COLD COLD 3 175 MIRROR COARSE Y FLASHBACK COLD COLD 3 176 MIRROR COARSE Y DATAGUARDCONFIG COLD COLD 3 177 MIRROR COARSE Y OCRFILE COLD COLD 3 280 HIGH COARSE N CS_STRIPE_COARSE COLD COLD 18 rows selected.
从上面name=CS_STRIPE_COARSE,stripe=COARSE可以看到创建的模板为粗粒度条带,连接数据库实例
SQL> create tablespace cs_stripe_coarse datafile '+DATADG(CS_STRIPE_COARSE)' size 1m; Tablespace created. SQL> select name from v$datafile where name like 'cs_stripe_coarse%'; no rows selected SQL> select name from v$datafile where name like '%cs_stripe_coarse%'; NAME -------------------------------------------------------------------------------- +DATADG/jyrac/datafile/cs_stripe_coarse.272.931882089
创建的数据文件的文件号为272,连接ASM实例
SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name" 2 from x$kffxp x, v$asm_disk_stat d 3 where x.group_kffxp=d.group_number 4 and x.disk_kffxp=d.disk_number 5 and x.group_kffxp=3 6 and x.number_kffxp=272 7 order by 1,2,3; virtual extent physical extent au disk # disk name -------------- --------------- ---------- ---------- ------------------------------------------------------------ 0 0 1664 0 DATADG_0001 0 1 1664 3 DATADG_0000 0 2 1659 1 DATADG_0003 1 3 1660 2 DATADG_0002 1 4 1665 0 DATADG_0001 1 5 1665 3 DATADG_0000 6 rows selected.
上面的结果显示了只为1MB的文件分配了2个虚拟区, 一个是ASM的文件头,一个用于文件。注意这个文件是三重的镜像和粗粒度的条带。也可以创建一个根本不做镜像的模板,例如:
连接ASM实例
SQL> alter diskgroup datadg add template no_mirroring attributes (UNPROTECTED); Diskgroup altered. SQL> select * from v$asm_template where group_number=3; GROUP_NUMBER ENTRY_NUMBER REDUNDANCY STRIPE SYSTEM NAME PRIMARY_REGION MIRROR_REGION ------------ ------------ ------------ ------------ -------------------- ------------------------------ -------------------- -------------------- 3 60 MIRROR COARSE Y PARAMETERFILE COLD COLD 3 61 MIRROR COARSE Y ASMPARAMETERFILE COLD COLD 3 63 MIRROR COARSE Y DUMPSET COLD COLD 3 64 HIGH FINE Y CONTROLFILE COLD COLD 3 65 MIRROR COARSE Y FLASHFILE COLD COLD 3 66 MIRROR COARSE Y ARCHIVELOG COLD COLD 3 67 MIRROR COARSE Y ONLINELOG COLD COLD 3 68 MIRROR COARSE Y DATAFILE COLD COLD 3 69 MIRROR COARSE Y TEMPFILE COLD COLD 3 170 MIRROR COARSE Y BACKUPSET COLD COLD 3 171 MIRROR COARSE Y XTRANSPORT BACKUPSET COLD COLD 3 172 MIRROR COARSE Y AUTOBACKUP COLD COLD 3 173 MIRROR COARSE Y XTRANSPORT COLD COLD 3 174 MIRROR COARSE Y CHANGETRACKING COLD COLD 3 175 MIRROR COARSE Y FLASHBACK COLD COLD 3 176 MIRROR COARSE Y DATAGUARDCONFIG COLD COLD 3 177 MIRROR COARSE Y OCRFILE COLD COLD 3 280 HIGH COARSE N CS_STRIPE_COARSE COLD COLD 3 281 UNPROT COARSE N NO_MIRRORING COLD COLD 19 rows selected.
从上面name=CS_STRIPE_COARSE,redundancy=unprot可以看到创建的模板不支持镜像,连接数据库实例
SQL> create tablespace not_important datafile '+DATADG(NO_MIRRORING)' size 1m; Tablespace created. SQL> select name from v$datafile where name like '%not_important%'; NAME -------------------------------------------------------------------------------- +DATADG/jyrac/datafile/not_important.273.931882831
创建的数据文件的文件号为273,连接ASM实例
SQL> select x.xnum_kffxp "virtual extent",pxn_kffxp "physical extent",x.au_kffxp "au",x.disk_kffxp "disk #",d.name "disk name" 2 from x$kffxp x, v$asm_disk_stat d 3 where x.group_kffxp=d.group_number 4 and x.disk_kffxp=d.disk_number 5 and x.group_kffxp=3 6 and x.number_kffxp=273 7 order by 1,2,3; virtual extent physical extent au disk # disk name -------------- --------------- ---------- ---------- ------------------------------------------------------------ 0 0 1661 2 DATADG_0002 1 1 1660 1 DATADG_0003
上面的结果显示一个虚拟extent只有一个物理extent,所以这个文件没有被镜像(虽然它是在一个normal冗余的磁盘组中)。
小结:
模板目录包含了磁盘组中文件模板的信息,每一个磁盘组都会有默认的一系列的系统自带的模板,用户也可以额外根据需要创建自己的模板。一个比较好的使用模板的方法是在一个normal冗余的磁盘中创建一个三重镜像的模板,注意如果想要使这个做法生效,我们至少需要这个磁盘组中有3个故障磁盘组(failgroup)。