ASM Setting Larger AU Sizes

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中当使用可变区大小就不需要执行这种改变。

发表评论

电子邮件地址不会被公开。