本章讲述asm的5号文件,5号文件是asm的模板目录,包含了磁盘组中所有的文件模板的信息。
有两种类型的模板:一种是系统自带的,一种是用户创建的,默认的模板(系统自带的)已经包含asm的所有文件类型,创建文件时会根据文件类型自动匹配,用户创建的模板只会在用户特别指定时会使用。
每一个模板包含了如下的一些信息:
· 每个模板的名称(对于默认模板它的名称其实就是文件类型)
· 文件冗余度(默认是磁盘组的冗余度)
· 文件条带(默认是根据文件类型来决定文件的条带)
· 系统标识(是否为系统自带的模板)
可以通过视图v$asm_template来查看完整的模板信息,这里查看下我系统上的模板:
sql> select name "template name", redundancy "redundancy", stripe "striping", system "system"
from v$asm_template
where group_number=1;
template name redundancy striping system
------------------------ ---------------- ---------------- --------
parameterfile mirror coarse y
asmparameterfile mirror coarse y
dumpset mirror coarse y
controlfile high fine y
flashfile mirror coarse y
archivelog mirror coarse y
onlinelog mirror coarse y
datafile mirror coarse y
tempfile mirror coarse y
backupset mirror coarse y
autobackup mirror coarse y
xtransport mirror coarse y
changetracking mirror coarse y
flashback mirror coarse y
dataguardconfig mirror coarse y
ocrfile mirror coarse y
16 rows selected.
有一个模板非常的显眼,那就是控制文件(3重镜像,细粒度条带),这是默认的数据库控制文件的模板,这是为什么每一个控制文件都会被做三重镜像的原因。有趣的是,我们可以使用它创建任何的数据库文件。
这里举一个例子(注意我连接的是数据库的实例):
sql> create tablespace triple_f datafile '+data(controlfile)' size 1m;
tablespace created.
sql> select name from v$datafile where name like '%triple_f%';
name
--------------------------------------------------------------------------------
+data/br/datafile/triple_f.271.771793293
上面创建了一个表空间,asm给我新创建的数据文件分配了编号217,我们接着看下这个文件的冗余度,这一次我连接的是asm的实例:
sql> select group_number, name, type "redundancy"
from v$asm_diskgroup
where name='data';
group_number name redundancy
------------ -------------------------------- ----------------
1 data normal
这是一个normal冗余的磁盘组,但是由于我们使用了控制文件模板来创建数据文件,因此我们通过查询内部视图 x$kffxp来获得我们想要的信息:
sql> select xnum_kffxp "extent", au_kffxp "au", disk_kffxp "disk"
from x$kffxp
where group_kffxp=1 and number_kffxp=271
order by 1,2;
extent au disk
---------- ---------- ----------
0 1126 1
0 1130 3
0 1136 2
1 1131 3
1 1132 0
1 1137 2
...
7 1132 1
7 1135 3
7 1141 2
24 rows selected.
如预期,这个文件被做了三重镜像,因为我们看到每一个虚拟区都由三个物理区组成,但是为什么我的数据文件仅仅只有1mb,但是却有8个虚拟区呢,这是因为控制文件的模板是一个精细条带的模板。
译者注:隐含参数_asm_stripesize代表了精细条带的大小,默认为128k,隐含参数_asm_stripewidth代表了条带的宽度,默认为8。但是有一点很奇怪,精细条带下,数据文件头好像没有独占一个extent,因为上面查询显示了这个1mb的文件一共占用了8个extent,而不是9个extent,按照条带宽度是8的设定,文件内容本身就应该占用了8个extent。
如果我想要文件具有三重镜像但是粗粒度的条带,该怎么做?我们可以手工创建一个我们自己的模板,coarse关键字指定了这是一个粗粒度的条带:
sql> alter diskgroup data 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 '+data(triple_coarse)' size 1m;
sql> select name from v$datafile where name like '%triple_c%';
+data/br/datafile/triple_c.272.771794469
asm的文件号是272,返回到asm实例检查:
where group_kffxp=1 and number_kffxp=272
0 1136 3
0 1137 0
0 1142 2
1 1133 1
1 1137 3
1 1143 2
6 rows selected.
这次的结果显示了只为1mb的文件分配了1个虚拟区,额外的一个是asm的文件头。注意这个文件是三重的镜像和粗粒度的条带。
我也可以创建一个根本不做镜像的模板,我们试试看:
sql> alter diskgroup data add template no_mirroring attributes (unprotected);
接下来我们使用我们上面创建的模板来添加一个数据文件:
sql> create tablespace not_important datafile '+data(no_mirroring)' size 1m;
sql> select name from v$datafile where name like '%not_important%';
+data/br/datafile/not_important.273.771795255
上面新产生的数据文件的编号是273,我们来检查一下:
where group_kffxp=1 and number_kffxp=273
0 1138 0
1 1134 1
我们看到这个文件没有被镜像(虽然它是在一个normal冗余的磁盘组中)。
模板目录包含了磁盘组中文件模板的信息,每一个磁盘组都会有默认的一系列的系统自带的模板,用户也可以额外根据需要创建自己的模板。一个比较好的使用模板的方法是在一个normal冗余的磁盘中创建一个三重镜像的模板,注意如果想要使这个做法生效,我们至少需要这个磁盘组中有3个failgroup。
<b>本文来自云栖社区合作伙伴“dbgeek”</b>