探索ORACLE之ASM概念




一、ASM(自动存储管理)的来由:


ASMOracle 10g R2中为了简化Oracle数据库的管理而推出来的一项新功能,这是Oracle自己提供的卷管理器,主要用于替代操作系统所提供的LVM,它不仅支持单实例,同时对RAC的支持也是非常好。ASM可以自动管理磁盘组并提供有效的数据冗余功能。使用ASM(自动存储管理)后,数据库管理员不再需要对ORACLE中成千上万的数据文件进行管理和分类,从而简化了DBA的工作量,可以使得工作效率大大提高。


二、什么是ASM


ASM它提供了以平台无关的文件系统、逻辑卷管理以及软RAID服务。ASM可以支持条带化和磁盘镜像,从而实现了在数据库被加载的情况下添加或移除磁盘以及自动平衡I/O以删除“热点”。它还支持直接和异步的I/O并使用Oracle9i中引入的Oracle数据管理器API(简化的I/O系统调用接口)。


ASM是做为单独的Oracle实例实施和部署,并且它只需要有参数文件,不需要其它的任何物理文件,就可以启动ASM实例,只有它在运行的时候,才能被其它数据访问。在Linux平台上,只有运行了OCSSD服务(Oracle安装程序默认安装)了才能和访问ASM


简称自动存储管理,是一种用于管理磁盘的工具


能够在多个物理设备之间实现条带化、镜像数据文件、恢复文件等


文件按分配单元AUs(allocation units)平衡分布在磁盘组的所有磁盘中,ASM使用索引技术来跟踪每个AUs的位置


支持联机磁盘的动态增加和减少,当磁盘发生变化后,AUs会自动重新实现动态分布


支持RAC集群技术,每一节点上运行一个ASM实例,各ASM实例间能实现点对点通讯


是一个纯软件级别的实现方式,第三方RAID工作在卷层次上,使用统一条带大小,ASM可以工作在文件层次级别,不同文件可以使用不同的条带大小


三、使用ASM的好处:


1、 将I/O平均分部到所有可用磁盘驱动器上以防止产生热点,并且最大化性能。


2、 配置更简单,并且最大化推动数据库合并的存储资源利用。


3、 内在的支持大文件


4、 在增量增加或删除存储容量后执行自动联系重分配


5、 维护数据的冗余副本以提高可用性。


6、 支持10g11g的数据存储及RAC的共享存储管理


7、 支持第三方的多路径软件


8、 使用OMF方式来管理文件


四、ASM冗余:


ASM使用独特的镜像算法:不镜像磁盘,而是镜像盘区。作为结果,为了在产生故障时提供连续的保护,只需要磁盘组中的空间容量,而不需要预备一个热备(hot spare)磁盘。不建议用户创建不同尺寸的故障组,因为这将会导致在分配辅助盘区时产生问题。ASM将文件的主盘区分配给磁盘组中的一个磁盘时,它会将该盘区的镜像副本分配给磁盘组中的另一个磁盘。给定磁盘上的主盘区将在磁盘组中的某个伙伴磁盘上具有各自的镜像盘区。ASM确保主盘区和其镜像副本不会驻留在相同的故障组中。磁盘组的冗余可以有如下的形式:双向镜像文件(至少需要两个故障组)的普通冗余(默认冗余)和使用三向镜像(至少需要3个故障组)提供较高保护程度的高冗余。  www.2cto.com  一旦创建磁盘组,就不可以改变它的冗余级别。为了改变磁盘组的冗余,必须创建具有适当冗余的另一个磁盘组,然后必须使用RMAN还原或DBMS_FILE_TRANSFER将数据文件移动到这个新创建的磁盘组。


三种不同的冗余方式如下:


1、 外部冗余(external redundancy):表示Oracle不帮你管理镜像,功能由外部存储系统实现,比如通过RAID技术;有效磁盘空间是所有磁盘设备空间的大小之和。


2、 默认冗余(normal redundancy):表示Oracle提供2份镜像来保护数据,有效磁盘空间是所有磁盘设备大小之和的1/2(使用最多)


3、 高度冗余(high redundancy):表示Oracle提供3份镜像来保护数据,以提高性能和数据的安全,最少需要三块磁盘(三个failure group);有效磁盘空间是所有磁盘设备大小之和的1/3,虽然冗余级别高了,但是硬件的代价也最高。


五、ASM进程


ASM实例除了传统的DBWR,LGWR,CKPT,SMON,PMON等进程还包含如下四个新后台进程:


RBAL:负责协调磁盘组的重新平衡活动(负责磁盘组均衡)


ARB0-ARBn:在同一时刻可以存在许多此类进程,它们分别名为ARB0ARB1,以此类推,执行实际的重新平衡分配单元移动进程


GMON:用于ASM磁盘组监控


O0nn01-10:这组进程建立到ASM实例的连接,某些长时间操作比如创建数据文件,RDBMS会通过这些进程向ASM发送信息


ASMBASM实例的前台进程连接,周期性的检查两个instance的健康状况。每个数据库实例同时只能与一个ASM实例连接,因此数据库只会有一个ASMB后台进程。如一个节点上有多个数据库实例,它们只能共享一个ASM实例。


RBAL用来进行全局调用,以打开某个磁盘组内的磁盘。ASMB进程与该节点的CSS守护进程进行通信,并接收来自ASM实例的文件区间映射信息。ASMB还负责为ASM实例提供I/O统计数据


 


CSS集群同步服务。要使用ASM,必须确保已经运行了CSS集群同步服务,CSS负责ASM实例和数据库实例之间的同步。 


注意:ASM实例必须要先于数据库实例启动,和数据库实例同步运行,迟于数据库实例关闭。ASM实例和数据库实例的关系可以是11,也可以是1n。如果是1n,最好为ASM安装单独的ASM_HOME


 


六、ASM支持datafilelogfilescontrol filesarchivelogsRMAN backup sets等自动的数据库文件管理


ASM体系结构(主要由ASM实例及ASM磁盘组组成)


ASM的使用需要创建一个ASM实例,用于管理ASM磁盘组


ASM磁盘组由ASM磁盘组成,可以包含一个或多个ASM磁盘


ASM磁盘可以是实际的磁盘,也可以是磁盘的某个分区,或LVM管理的逻辑卷,但必须是未格式化的原始设备


ASM磁盘组的大小为该组内ASM磁盘大小的总和,可使用的容量则根据容错级别而有不同的可用大小


 
七、     ASM实例和数据库实例对应关系
 

ASM实例类似于普通的数据库实例(RDBMS),同样由SGA和一堆后台进程组成,对大多数系统而言,SGA只需64 MB即可

      ASM实例中的LargePool 用于存放Extent Map,可以根据数据库的大小来计算LargePool的大小,通常100GB大小需要1MB存放Extent Map

      普通的RDBMS实例会定位数据文件并打开其数据文件,而在使用ASM存储的数据库中,该工作由ASM实例接管,即ASM实例用于定位和

管理ASM磁盘,磁盘组。

      ASM实例拥有类似于普通RDBMS实例的后台进程,如SMONPMONLGWRDBWRCKPT等,还增添了两个新进程,一类是RBAL,一类是ARBn

RBAL:用于协调和管理磁盘组之间的动态平衡

ARBn:可以为多个,用于完成AU的移动

      ASM实例仅仅是定位管理ASM磁盘,不能加载或打开数据库,因此也无法读取数据字典信息

      ASM实例通常有个参数,只能使用口令文件或操作系统身份验证作为sysdbasysoper来启动或关闭该实例。

      一个ASM实例可以为多个RDBMS提供服务,可以在一台主机上创建多个ASM实例,但通常一台主机上使用一个ASM实例

      如果一个实例服务于多个RDBMS,建议将ASMASM_HOMEDBORACLE_HOME分开,便于日后的升级与维护

      ASM磁盘组的创建与配置在ASM实例启动之后

使用ASM磁盘的RDBMS实例与普通的RDBMS实例相同,但多出了两个后台进程,RBALASMB

      ASMB借助某个服务器进程如oracle+ASM1建立普通RDBMS实例到ASM实例的会话,并传递磁盘文件的相关信息

      RBAL打开通过ASM实例定位的ASM磁盘

      注意:ASM 实例并不代替RDBMS实例来读取或写入数据文件,数据是直接在ASM磁盘和RDBMS实例传递,ASM实例仅用于定位数据文件

         所在的asm磁盘,盘区以及所需的相关信息。假定新增加数据文件,则RDBMS告知ASM实例要创建数据文件,ASM实例则分配盘区

         (extent),并创建盘区映射地址返回给RDBMS实例,RDBMS则将数据直接写入到磁盘组。


 




八、创建ASM实例(下面基于VMware+RHEL 5.4 + Oracle 10g R2演示)



     1.安装ASM

       使用ASM实例,需要到Oracle官方网站下载所需的ASM包。下载路径:ASMLib

       注意下载支持该内核的包,分为两部分,一是Library and Tools,二是Drivers for kernel

       如本人的Linux的内核为:

           [root@oradb ~]# uname-rm

            2.6.18-164.el5 i686

       则下载对应的包为:

           Library and Tools

               oracleasmlib-2.0.4-1.el5.x86_64.rpm

               oracleasm-support-2.1.3-1.el5.i386.rpm

           Drivers for kernel 2.6.18-164.el5

               oracleasm-2.6.18-164.el5xen-2.0.5-1.el5.i686.rpm

               oracleasm-2.6.18-164.el5debug-2.0.5-1.el5.i686.rpm

               oracleasm-2.6.18-164.el5PAE-2.0.5-1.el5.i686.rpm

               oracleasm-2.6.18-164.el5-debuginfo-2.0.5-1.el5.i686.rpm

               oracleasm-2.6.18-164.el5-2.0.5-1.el5.i686.rpm

       使用下面类似的方式来安装这些包,关于RPM的使用请参考:RPM使用简介

           [root@oradb asm]# rpm-Uvh oracleasm-support-2.1.3-1.el5.i386.rpm

       验证安装的包

           [root@oradb asm]# rpm-qa | grep asm

           oracleasm-support-2.1.3-1.el5

           oracleasm-2.6.18-164.el5-debuginfo-2.0.5-1.el5

           oracleasm-2.6.18-164.el5-2.0.5-1.el5           

   

   2.启用css服务(Cluster Synchronization Services)

       用于同步ASM实例与RDBMS实例

           使用root帐户进行配置,配置程序位于$ORACLE_HOME/bin

           [root@oradb ~]#/u01/oracle/10g/bin/localconfigadd

           /etc/oracle doesnot exist. Creating it now.

           Successfully accumulated necessary OCR keys.

           Creating OCR keysfor user 'root', privgrp'root'..

           Operation successful.

           Configurationfor local CSS has been initialized

 

           Addingto inittab

           Startup will be queuedto init within 90 seconds.

           Checking the statusof new Oracle init process...

           Expecting the CRS daemonsto be up within 600 seconds.

           CSSis active on these nodes.

                   oradb

           CSSis active onall nodes.

           Oracle CSSservice is installedand running under init(1M)

           

   3.创建ASM参数文件(使用VIVIM)

       [oracle@oradb dbs]$ cat/u01/oracle/10g/dbs/init+ASM.ora

       *.asm_diskstring=''                                     #为空表示可以搜索任意的ASM磁盘

       *.background_dump_dest='/u01/oracle/admin/+ASM/bdump'   #后台进程存放位置

       *.core_dump_dest='/u01/oracle/admin/+ASM/cdump'         #核心进程存放位置

       *.user_dump_dest='/u01/oracle/admin/+ASM/udump'         #用户进程存放位置

       *.instance_type='ASM'                                   #实例类型,普通实例默认则为RDBMS

       *.instance_name='+ASM'                                  #实例名字

       *.large_pool_size=12M                                   #为实例分配large_pool的大小

       *.remote_login_passwordfile='SHARED'                   #登陆认证方式

       *.asm_power_limit=1                                     #控制均衡操作的资源,缺省为

               

   4.创建ASM后台进程目录,参照参数文件中的配置来创建  

       [oracle@oradb ~]$ echo $ORACLE_BASE

       /u01/oracle/10g

       [oracle@oradb ~]$ mkdir-p $ORACLE_BASE/admin/+ASM/bdump

       [oracle@oradb ~]$ mkdir-p $ORACLE_BASE/admin/+ASM/udump

       [oracle@oradb ~]$ mkdir-p $ORACLE_BASE/admin/+ASM/cdump   

       

   5.创建密码文件及spfile参数文件

       [oracle@oradb ~]$ orapwdfile=$ORACLE_HOME/dbs/orapw+ASM password=redhat entries=8

       [oracle@oradb ~]$ export ORACLE_SID=+ASM

       SQL> conn/as sysdba

       Connectedto an idle instance.

       SQL> startup    

       ASM instance started

       ORA-15110:no diskgroups mounted       

       SQL>create spfilefrom pfile;

 

       SQL>select* from v$asm_diskgroup;

 

       no rows selected

   

   7.创建ASM磁盘及配置ASMlib驱动

       Vmware分配几个空闲的磁盘用于创建ASM磁盘,建议使用不同的磁盘控制器

       下面使用个磁盘来组建ASM磁盘组,分别为sdd,sde,sdf,sdg

       分别对个磁盘进行分区,列出sdd的分区样例,其余如法炮制

           [root@oradb ~]# fdisk /dev/sdd

 

           Command (m for help): n

           Command action

             e   extended

             p   primary partition (1-4)

           p

           Partition number (1-4): 1

           First cylinder (1-261, default 1):

           Using default value 1

           Last cylinder or +size or +sizeM or +sizeK (1-261, default 261):

           Using default value 261

 

           Command (m for help): w

           The partition table has been altered!

 

           Calling ioctl() to re-read partition table.

           Syncing disks.     

       

       创建ASM磁盘(三种方法)

         a.配置裸设备映射,修改/etc/udev/rules.d/60-raw.rules文件

           使用root帐户修改/etc/udev/rules.d/60-raw.rules按如下方式添加磁盘

           [root@oradb ~]# cat/etc/udev/rules.d/60-raw.rules      --查看添加的内容

           ACTION=="add", KERNEL=="sdd1", RUN+="/bin/raw /dev/raw/raw1 %N"

           ACTION=="add", ENV{MAJOR}=="8", ENV{MINOR}=="1", RUN+="/bin/raw /dev/raw/raw1 %M %m"

 

           ACTION=="add", KERNEL=="sde1", RUN+="/bin/raw /dev/raw/raw2 %N"

           ACTION=="add", ENV{MAJOR}=="8", ENV{MINOR}=="17", RUN+="/bin/raw /dev/raw/raw2 %M %m"  

           

           [root@oradb ~]# start_udev   #重启udev服务

           Starting udev: [ OK ]

           

           [root@oradb ~]# ll/dev/raw  

           total 0

           crw------- 1 root root 162, 1 Nov 10 18:50 raw1

           crw------- 1 root root 162, 2 Nov 10 18:50 raw2

       

           [root@oradb ~]# chown oracle:dba/dev/raw/raw[1-2] --修改属主,否则创建磁盘组时提示权限不够

 

        b.也可以采用下面的方式来增加磁盘,即直接修改/etc/sysconfig/rawdevices (root帐户)

           [root@oradb ~]# vim/etc/sysconfig/rawdevices

           [root@oradb ~]# cat/etc/sysconfig/rawdevices --查看增加的内容为raw3,raw4

           /dev/raw/raw3/dev/sdf1

           /dev/raw/raw4/dev/sdg1

           

           [root@oradb ~]# chown oracle:dba/dev/raw/raw[3-4] --修改属主,否则创建磁盘组时提示权限不够

           [root@oradb ~]# ll/dev/raw/

           total 0

           crw------- 1 oracle dba 162, 1 Nov 10 20:12 raw1

           crw------- 1 oracle dba 162, 2 Nov 10 20:12 raw2

           crw------- 1 oracle dba 162, 3 Nov 10 20:12 raw3

           crw------- 1 oracle dba 162, 4 Nov 10 20:12 raw4

           

           重启裸设备服务

           [root@oradb ~]#/sbin/service rawdevices restart

           Assigning devices:

                     /dev/raw/raw3 -->  /dev/sdf1

           /dev/raw/raw3: boundto major 8, minor 81

                     /dev/raw/raw4 -->  /dev/sdg1

           /dev/raw/raw4: boundto major 8, minor 97

           done

 

           SQL>select instance_name,statusfrom v$instance;

 

           INSTANCE_NAME   STATUS

           ---------------- ------------

           +ASM            STARTED

           

           SQL>create diskgroup DG1 normal redundancydisk'/dev/raw/raw1','/dev/raw/raw2'; --创建磁盘组DG1

 

           SQL>select* from v$fixed_tablewhere name like '%ASM%';--查看和asm相关的视图

           

           SQL>selectname,allocation_unit_size,state,type,

            2  free_mb,required_mirror_free_mb req_mi_fr_mb,usable_file_mb

            3  from v$asm_diskgroup;

 

           NAME           ALLOCATION_UNIT_SIZE STATE      TYPE     FREE_MB REQ_MI_FR_MB USABLE_FILE_MB

           --------------- -------------------- ----------- ------ ---------- ------------ --------------

           DG1                         1048576 MOUNTED    NORMAL        296           0           148

 

           SQL>create diskgroup DG2 normal redundancydisk'/dev/raw/raw3','/dev/raw/raw4';  --创建磁盘组DG2

 

           SQL>selectname,state,free_mb,required_mirror_free_mb,usable_file_mb  --查看磁盘组的状态及信息

            2  from v$asm_diskgroup;

 

           NAME           STATE         FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB

           --------------- ----------- ---------- ----------------------- --------------

           DG1            MOUNTED            296                      0           148

           DG2            MOUNTED            296                       0           148

           

           SQL>select disk_number,total_mb,free_mbfrom v$asm_disk;

 

           DISK_NUMBER  TOTAL_MB    FREE_MB

           ----------- ---------- ----------

                    1        199       148

                    0        199       148

                    1        199       148

                    0        199       148  

           

           重新启动Linux主机后

           SQL> startup   --重新启动ASM实例,收到了磁盘组insufficient信息

           ASM instance started

           ORA-15032:notall alterations performed

           ORA-15063: ASM discovered an insufficient numberof disks for diskgroup "DG2"

           ORA-15063: ASM discovered an insufficient numberof disks for diskgroup "DG1"          

                       

           SQL> ho ls-hlt/dev/raw       # LINUX主机重新启动之后属主性质已发生变化

           total 0

           crw------- 1 root root 162, 4 Nov 10 20:28 raw4

           crw------- 1 root root 162, 3 Nov 10 20:28 raw3

           crw------- 1 root root 162, 2 Nov 10 20:28 raw2

           crw------- 1 root root 162, 1 Nov 10 20:28 raw1    

 

           原因:原始设备在引导时会重新映射。默认情况下,在引导时原始设备的拥有者将更改为root用户

           将下面的内容增加到/etc/rc.local文件(root帐户),重新启动主机,使得属主变为oracle,则不再出现类似的提示

               chown oracle:dba/dev/raw/raw1

               chown oracle:dba/dev/raw/raw2

               chown oracle:dba/dev/raw/raw3

               chown oracle:dba/dev/raw/raw4

               chmod 660/dev/raw/raw1

               chmod 660/dev/raw/raw2

               chmod 660/dev/raw/raw3

               chmod 660/dev/raw/raw4        

           

           SQL>drop diskgroup dg1;  --将刚才创建的两个磁盘组删除

           

           SQL>drop diskgroup dg2;

           

              使用root帐户清除/etc/udev/rules.d/60-raw.rules /etc/sysconfig/rawdevices 以及/etc/rc.local刚刚增加的记录

               便于下面使用asmlib来创建asm磁盘

           

        c.使用root帐户配置ASMLib驱动及创建ASM磁盘,Oracle建议使用ASMLIB驱动来配置ASM磁盘

               [root@oradb ~]#/etc/init.d/oracleasm configure

               Configuring the Oracle ASM library driver.

 

               This will configure theon-boot propertiesof the Oracle ASM library

               driver. The following questions will determine whether the driveris

               loadedon boot and whatpermissions it will have. Thecurrent values

               will be shownin brackets ('[]'). Hitting<ENTER> without typing an

               answer will keep thatcurrent value. Ctrl-C will abort.

 

               Defaultuserto own the driver interface []: oracle

               Defaultgroupto own the driver interface []: dba

               Start Oracle ASM library driveron boot (y/n) [n]: y

               Scanfor Oracle ASM disks on boot(y/n) [y]: y

               Writing Oracle ASM library driver configuration: done

               Initializing the Oracle ASMLib driver: [ OK ]

               Scanning the systemfor Oracle ASMLib disks: [ OK ]      

               

               --注意下面创建磁盘前本人重新对磁盘分过区

               [root@oradb ~]# ls/dev/oracleasm/disks

               [root@oradb ~]#/etc/init.d/oracleasm createdisk VOL1/dev/sdd1

               Markingdisk "VOL1" as an ASMdisk: [ OK ]

               [root@oradb ~]#/etc/init.d/oracleasm createdisk VOL2/dev/sdd2

               Markingdisk "VOL2" as an ASMdisk: [ OK ]

               [root@oradb ~]#/etc/init.d/oracleasm createdisk VOL3/dev/sde1

               Markingdisk "VOL3" as an ASMdisk: [ OK ]

               [root@oradb ~]#/etc/init.d/oracleasm createdisk VOL4/dev/sde2

               Markingdisk "VOL4" as an ASMdisk: [ OK ]

               [root@oradb ~]#/etc/init.d/oracleasm listdisks

               VOL1

               VOL2

               VOL3

               VOL4

               [root@oradb ~]# su- oracle

               [oracle@oradb ~]$ export ORACLE_SID=+ASM

               [oracle@oradb ~]$ sqlplus/nolog

               SQL> conn/as sysdba

           

               SQL> startup

               ASM instance started

 

               ORA-15110:no diskgroups mounted

 

               SQL>create diskgroup DG1 normal redundancy

                2  failgroup FG1 disk '/dev/oracleasm/disks/VOL1' name VOL1

                3  failgroup FG2 disk '/dev/oracleasm/disks/VOL2' name VOL2;

               create diskgroup DG1 normal redundancy

               *

               ERROR at line 1:

               ORA-15018: diskgroup cannot be created   --下面提示磁盘路径未在discovery set中设置

               ORA-15031:disk specification '/dev/oracleasm/disks/VOL2' matchesno disks 

               ORA-15014: location'/dev/oracleasm/disks/VOL2'is not in the discoveryset

               ORA-15031:disk specification '/dev/oracleasm/disks/VOL1' matchesno disks

               ORA-15014: location'/dev/oracleasm/disks/VOL1'is not in the discoveryset

 

               SQL> show parameter asm_diskstring

 

               NAME                                TYPE       VALUE

               ------------------------------------ ----------- ------------------------------

               asm_diskstring                      string

               

               SQL>alter systemset asm_diskstring='/dev/oracleasm/disks/VOL*';

 

               SQL>create diskgroup DG1 normal redundancy    --设置asm_diskstring后重新创建磁盘DG1成功

                2  failgroup FG1 disk '/dev/oracleasm/disks/VOL1' name VOL1

                3  failgroup FG2 disk '/dev/oracleasm/disks/VOL2' name VOL2;

                   

               SQL>selectname,state,free_mb,required_mirror_free_mb,usable_file_mb

                2  from v$asm_diskgroup;

 

               NAME           STATE         FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB

               --------------- ----------- ---------- ----------------------- --------------

               DG1            MOUNTED          2964                      0          1482          

           

   8.创建ASM数据库

       使用dbca工具根据提示来创建使用ASM存储的数据库

       创建使用ASM存储的数据库完毕之后,对于ASM数据库启动应首先保证ASM实例先被启动,因为RDBMSASM实例服务的一个客户端

       接下来再来启动RDBMS

       

       --首先启动asm实例

           export ORACLE_SID=+ASM

           sqlplus/ as sysdba

           startup

           exit

           

       --接下来启动rdbms数据库

           export ORACLE_SID=orcl

           sqlplus/ as sysdba

           startup

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值