ASM分配单元
ASM分配空间以chunks为单位,叫作分配单元(AUs)。一个AU是最细粒度的分配–每个ASM磁盘都以相 同大小的AU进行划分。ASM 1MB条带大小对于Oracle数据库来说已经证明是最佳条带深度并且将会支 持最大I/O请求。这个最佳条带大小,再加上均匀分布磁盘组中的区与RDBMS中的buffer cache,防止热点。
对于VLDBs设置 Large AU Size
对于非常大的数据库(VLDBs)–例如,数据库大小为10TB与更大的来说,改变缺省AU大小是有意义的 。以下是对于VLDB改变缺省大小的优点:
.减小RDBMS实例中管理区映射的大小
.增加文件大小限制
.减小数据库打开的时间,因为VLDB通常有许多大的数据文件
增加AU大小可以提高oracle 10g打开大数据库的时间,也会减小区映射所消耗共享池的大小。使用 1MB AU与固定大小区,对于一个10TB数据库来说区映射的大小大约是90MB,在打开数据库时会被读取并被保存在内存中。使用16M AU,对于10TB数据库来说区映射大小减小为大约5.5MB。在Oracle 10g 中,一个文件整个区映射是在文件打开时从磁盘进行读取的。
Oracle 11g通过按需读取区映射显著的最小化了文件打开延迟问题。在Oracle 10g中,对于每个文件 的打开,完整的区映射需要构建并且从ASM实例发送给RDBMS实例。对于大文件,延长文件打开时间这 是不必要的。在oracle 11g中,在文件打开时只有区映射中的前60个区会被发送。剩下的以批量方式被发送到RDBMS。
在Oracle 11g中设置Large AU Size
对于Oracle 11g ASM系统,下面的create diskgroup命令可以被执行用来设置合适的AU大小:
SQL> CREATE DISKGROUP DATA DISK '/dev/raw/raw15', '/dev/raw/raw16', '/dev/raw/raw17' ATTRIBUTE 'au_size' = '16M', 'compatible.asm' = '11.1' 'compatible.rdbms' = '11.1';
对Oracle 10g设置Large AU Size
在Oracle 10g中,ASM提供了两个隐藏参数(_asm_ausize,_asm_stripesize)来允许你使用16MB的AU大小来创建磁盘组并且对于1MB(代 替128K)有更好的细粒度条带。
SQL> set long 200 SQL> set linesize 200 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='_asm_stripesize'; NAME VALUE DESCRIB ------------------------------ -------------------- ------------------------------ _asm_stripesize 131072 ASM file stripe size 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='_asm_ausize' 7 ; NAME VALUE DESCRIB ------------------------------ -------------------- ------------------------------ _asm_ausize 1048576 allocation unit size
AU参数只在创建磁盘组时才使用,而且在磁盘组创建之后现有磁盘组的AU大小是不会改变的。下面的例子使用16MB AU大小来创建一个磁盘组并且对所有数据库文件允许使用1MB的细粒度条带。
1.关闭ASM实例
oracle@jyrac3 ~]$ export ORACLE_SID=+ASM1 [oracle@jyrac3 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.5.0 - Production on Wed Nov 30 11:12:02 2016 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options SQL> shutdown immediate ASM diskgroups dismounted ASM instance shutdown oracle@jyrac4 ~]$ export ORACLE_SID=+ASM2 [oracle@jyrac4 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.5.0 - Production on Wed Nov 30 11:12:02 2016 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options SQL> shutdown immediate ASM diskgroups dismounted ASM instance shutdown
2.编辑ASM实例的initSID.ora文件增加以下参数:
[oracle@jyrac3 dbs]$ vi init+ASM1.ora ...省略... #ASM AU 16MB _asm_ausize=16777216 #ASM fine grain stripesize 1MB _asm_stripesize=1048576 [oracle@jyrac4 dbs]$ vi init+ASM2.ora ...省略... #ASM AU 16MB _asm_ausize=16777216 #ASM fine grain stripesize 1MB _asm_stripesize=1048576
3.重新ASM实例。为了使用新参数生效ASM实例必须重启。在设置完隐藏参数并重启ASM实例,在这之 后创建的磁盘组将使用新的AU大小与细粒度条带大小。
SQL> col name for a20 SQL> col value for a20 SQL> col describ for a20 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='_asm_ausize'; NAME VALUE DESCRIB -------------------- -------------------- -------------------- _asm_ausize 16777216 allocation unit size SQL> select x.ksppinm NAME,y.ksppstvl value,x.ksppdesc describ from x$ksppi x, x$ksppcv y 2 3 where x.inst_id=USERENV('Instance') 4 and y.inst_id=USERENV('Instance') 5 and x.indx=y.indx 6 and x.ksppinm='_asm_stripesize'; NAME VALUE DESCRIB -------------------- -------------------- -------------------- _asm_stripesize 1048576 ASM file stripe size
4.创建磁盘组data_nrml
SQL> create diskgroup data_nrml normal redundancy failgroup fg1 disk '/dev/raw/raw5' failgroup fg2 disk '/dev/raw/raw6'; Diskgroup created.
5.查询v$asm_diskgroup_stat或v$asm_diskgroup中的allocation_unit_size来验证磁盘组data_nrml 的AU大小是否为16MB.
SQL> select name, allocation_unit_size from v$asm_diskgroup where name='DATA_NRML'; NAME ALLOCATION_UNIT_SIZE -------------------- -------------------- DATA_NRML 16777216
6.通过查询v$asm_template视图来查看磁盘组data_nrml的ASM文件模板,为了完成1MB的条带大小需 要将磁盘组中所要存储的所有文件类型的条带类型设置为FINE
SQL> select * from v$asm_template where group_number=2; GROUP_NUMBER ENTRY_NUMBER REDUNDANCY STRIPE SY NAME ------------ ------------ ------------ ------------ -- -------------------- 2 0 MIRROR COARSE Y PARAMETERFILE 2 1 MIRROR COARSE Y DUMPSET 2 2 HIGH FINE Y CONTROLFILE 2 3 MIRROR COARSE Y ARCHIVELOG 2 4 MIRROR FINE Y ONLINELOG 2 5 MIRROR COARSE Y DATAFILE 2 6 MIRROR COARSE Y TEMPFILE 2 7 MIRROR COARSE Y BACKUPSET 2 8 MIRROR COARSE Y AUTOBACKUP 2 9 MIRROR COARSE Y XTRANSPORT 2 10 MIRROR COARSE Y CHANGETRACKING 2 11 MIRROR FINE Y FLASHBACK 2 12 MIRROR COARSE Y DATAGUARDCONFIG
SQL> declare 2 cursor jl is select * from v$asm_template where group_number=2 and STRIPE='COARSE'; 3 begin 4 for r in jl loop 5 execute immediate 'alter diskgroup data_nrml alter template '||r.name||' attributes (fine)'; 6 end loop; 7 end; 8 / PL/SQL procedure successfully completed.
SQL> select * from v$asm_template where group_number=2; GROUP_NUMBER ENTRY_NUMBER REDUNDANCY STRIPE SY NAME ------------ ------------ ------------ ------------ -- -------------------- 2 0 MIRROR FINE Y PARAMETERFILE 2 1 MIRROR FINE Y DUMPSET 2 2 HIGH FINE Y CONTROLFILE 2 3 MIRROR FINE Y ARCHIVELOG 2 4 MIRROR FINE Y ONLINELOG 2 5 MIRROR FINE Y DATAFILE 2 6 MIRROR FINE Y TEMPFILE 2 7 MIRROR FINE Y BACKUPSET 2 8 MIRROR FINE Y AUTOBACKUP 2 9 MIRROR FINE Y XTRANSPORT 2 10 MIRROR FINE Y CHANGETRACKING 2 11 MIRROR FINE Y FLASHBACK 2 12 MIRROR FINE Y DATAGUARDCONFIG
这种改变的目的是尽管使用大AU设置,仍然保持1MB的文件区分布。如果使用缺省的coarse条带,那 么将使用16MB进行条带。在Oracle 11g中当使用可变区大小就不需要执行这种改变。