Oracle RAC系列之:ASM基本操做维护

ASM(自动存储管理)是一个专门为Oracle数据库服务的数据文件存储机制,经过ASM管理数据文件,DBA不用再担忧I/O性能问题,也不须要知道文件的名称,同时ASM也提供了文件系统到卷管理器的集成,下面依次介绍。
1、 ASM的特色
(1)自动调整I/O负载
ASM能够在全部可用的磁盘中自动调整I/O负载,不但避免了人工调整I/O的难度,并且也优化了性能,同时,利用ASM能够在线增长数据库的大小,而无需关闭数据库。
(2)条带化存储
ASM将文件分为多个分配单元(Allocation Units, AU)进行存储,并在全部磁盘间平均分配每一个文件的AU。
(3)在线自动负载均衡
当共享存储设备有变化时,ASM中的数据会自动均匀分配到现有存储设备中。同时,还能够调节数据的负载均衡速度。
(4)自动管理数据库文件
在ASM存储管理中,Oracle数据文件是ASM自动管理的。ASM建立的任何文件一旦再也不须要,就会被自动删除。可是,ASM无论理二进制文件、跟踪文件、预警日志和口令文件。
(5)数据冗余
ASM经过磁盘组镜像能够实现数据冗余,不须要第三方工具。
(6)支持各类Oracle数据文件
ASM存储支持Oracle数据文件、日志文件、控制文件、归档日志、RMAN备份集等。node

2、ASM的体系结构与后台进程sql

图1显示了ASM的物理构成。数据库

 

         从图1能够看出,在顶层是ASM磁盘组,ASM实例和数据库实例能够直接访问这些磁盘组;而后是ASM文件,每一个ASM文件只能包含在一个磁盘组中,不过,一个磁盘组中能够包含属于多个数据库的多个ASM文件,而且单个数据库可使用来自多个磁盘组的存储空间;第三部分是ASM磁盘,多个ASM磁盘组成了ASM磁盘组,但每一个ASM磁盘只能属于一个磁盘组;接着是AU(分配单元),AU是ASM磁盘组分配的最小连续磁盘空间,ASM磁盘按照AU进行分区,每一个AU的大小为1MB;这个结构的底层是Oracle数据块,因为AU是ASM分配的最小连续磁盘空间,所以,ASM是不容许跨分配单元拆分一个Oracle数据块的。
          要使用ASM,须要在启动数据库实例以前,先启动一个名为“+ASM”的实例,ASM实例不会装载数据库,启动它的目的是为了管理磁盘组和保护其中的数据。同时,ASM实例还能够向数据库实例传递有关文件布局的信息。经过这种方式,数据库实例就能够直接访问磁盘组中存储的文件。图2显示了ASM的通常体系结构。
 oracle

 

         从图2能够看出,ASM实例与数据库实例进行通讯的桥梁是ASMB进程,此进程运行在每一个数据库实例上,是两个实例间信息交换的通道。ASMB进程先利用磁盘组名称经过CSS得到管理该磁盘组的ASM实例链接串,而后创建一个到ASM的持久链接,这样两个实例之间就能够经过这条链接按期交换信息,同时这也是一种心跳监控机制。
         另外,在ASM实例中还存在另一个新的进程,即RBAL,此进程负责规划和协调磁盘组的从新平衡活动。除此以外,ASM实例还有一些与数据库实例中的进程相同的后台进程,例如LGWR、SMON、PMON、DBWR 、CKPT等。
若是一个数据库实例使用ASM做为存储,那么它将多出两个后台进程,即RBAL和ASMB。RBAL 负责打开磁盘组中全部磁盘和数据,而ASMB负责和ASM实例进程通讯。负载均衡

3、管理ASM实例
 在使用ASM做为数据存储时,ASM实例管理显得很是重要,Oracle提供了丰富的管理功能,对ASM实例进行管理须要具有SYSDBA权限,在Oracle 11g中可使用一个新角色 ,即SYSASM,此角色只用于管理ASM实例。
1.建立ASM实例
建立ASM实例有两种方法,第一种是利用dbca建立,这种方法只需运行Database Configuration Assistant(DBCA),而后根据提示便可建立一个ASM实例,此种方式在前面已有讲述,这里再也不多说。第二中方法是用命令行方式建立ASM实例,下面进行简单介绍。
(1)建立ASM磁盘
可使用RAID划分的LUN、分区和裸设备等来建立ASM磁盘,可是在使用LUN、分区或裸设备时,要注意将属主和属组改成Oracle用户及其对应的组,这个在前面节已经讲述过,另一种简单的方法就是使用Oracle提供的ASMLib来完成ASM磁盘的建立,下面将讲述这种方法。
在建立ASM实例以前,首先应该确保节点上已经安装了ASMlib包,同时确认ASMLib是否已经自动加载:
[root@node1 ~]# lsmod | grep oracleasm
oracleasm              46356  1
而后,经过ASMlib提供的oracleasm将已经划分好的磁盘分区转化为ASM磁盘,例如:
[root@node1 ~]#/etc/init.d/oracleasm createdisk ASMDISK1 /dev/sdc5
Marking disk "/dev/sdc5" as an ASM disk [  OK  ]
[root@node1 ~]#/etc/init.d/oracleasm createdisk ASMDISK2 /dev/sdc6
Marking disk "/dev/sdc6" as an ASM disk [  OK  ]
[root@node1 ~]#/etc/init.d/oracleasm createdisk ASMDISK3 /dev/sdc7
Marking disk "/dev/sdc7" as an ASM disk [  OK  ]
[root@node1 ~]#/etc/init.d/oracleasm createdisk ASMDISK4 /dev/sdc8
Marking disk "/dev/sdc8" as an ASM disk [  OK  ]
[root@node1 ~]#/etc/init.d/oracleasm createdisk ASMdisk5 /dev/sdc9
Marking disk "/dev/sdc9" as an ASM disk [  OK  ]
建立完ASM磁盘后,能够查看系统的/dev/oracleasm/disks/目录下是否已经生成磁盘设备,能够采用的命令如以下:
[root@node1 ~]# ll /dev/oracleasm/disks/ASMDISK*
brw-rw---- 1 oracle oinstall 8, 21 Sep 10 23:40 /dev/oracleasm/disks/ASMDISK1
brw-rw---- 1 oracle oinstall 8, 22 Sep 10 23:40 /dev/oracleasm/disks/ASMDISK2
brw-rw---- 1 oracle oinstall 8, 23 Sep 10 23:36 /dev/oracleasm/disks/ASMDISK3
brw-rw---- 1 oracle oinstall 8, 24 Sep 10 23:40 /dev/oracleasm/disks/ASMDISK4
brw-rw---- 1 oracle oinstall 8, 25 Sep 10 23:40 /dev/oracleasm/disks/ASMDISK5
也能够经过以下方式查看:
[root@node1 ~]#service oracleasm listdisks
ASMDISK1
ASMDISK2
ASMDISK3
ASMDISK4
ASMDISK5
若是要删除 ASM磁盘可经过如下命令:
[root@node1 ~]#/etc/init.d/oracleasm deletedisk ASMDISK5
Removing ASM disk "ASMdisk5" [  OK  ]
在RAC环境中,要注意另一个节点是否可以发现对应的ASM磁盘,执行以下命令,让另一个节点来获取这种变化。
[root@node2 ~]#/etc/init.d/oracleasm scandisks
到此位置,ASM磁盘已经建立完毕了。
(2)初始化参数
启动ASM实例只须要以下几个参数便可,利用这些参数能够实现ASM实例的内存的自动分配和自动管理。
下面介绍ASM实例初始化参数:
instance_type=asm
cluster_database=true
DB_UNIQUE_NAME=+ASM
ASM_POWER_LIMIT=1
large_pool_size=60M
asm_diskgroups='FLASH_DISK','ARCH_DISK','DATA_DISK'
asm_diskstring='/dev/oracleasm/disks/*'
每一个参数的含义以下:
 instance_type,指定实例的类型,对于ASM实例,应设置为ASM
 cluster_database,指定是不是数据库集群,true表示是ASM集群
 DB_UNIQUE_NAME,指定ASM实例的名称,默认是+ASM
 ASM_POWER_LIMIT,该参数用来控制ASM中数据的负载均衡速度
 large_pool_size,设置大池的大小,因为ASM文件的分配单元映射是从large_pool分配的,所以large_pool_size至少要8MB,建议越大越好
 asm_diskgroups,指定实例启动时可用的ASM磁盘组,ASM实例将在启动时自动挂载这些磁盘组
 asm_diskstring,用于限制ASM实例可用于建立磁盘组的磁盘设备。若是该值为NULL,则ASM实例可见的全部磁盘均可以成为建立磁盘组的可选磁盘
(3)建立密码文件
[oracle@node1 ~]$su - oracle
[oracle@node1 ~]$ cd $ORACLE_HOME/dbs
[oracle@node1 ~]$orapwd file=orapw+ASM password=oracle
(4)建立目录结构
[oracle@node 1~]$su – oracle
[oracle@node1 ~]$cd $ORACLE_HOME/dbs
[oracle@node1 ~]$mkdir –p $ORALCE_BASE/admin/+ASM/udump
[oracle@node1 ~]$ mkdir –p $ORALCE_BASE/admin/+ASM/bdump
[oracle@node1 ~]$mkdir –p $ORALCE_BASE/admin/+ASM/adump
[oracle@node1~]$ mkdir –p $ORALCE_BASE/admin/+ASM/cdump
2.启动ASM实例
 不管在RAC环境中仍是单实例环境,ASM实例都须要用到CSS进程,在RAC环境中,启动CRS后CSS已经运行,而在单实例环境下,须要以root用户运行脚本,初始化CSS服务,不然,在启动ASM实例时会报以下错误:
ORA-29701: unable to connect to Cluster Manager
执行初始化脚本的过程以下:
[root@node1 ~]#$ORACLE_HOME/bin/localconfig add
/etc/oracle does not exist. Creating it now.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Configuration for local CSS has been initializedsocket

Cleaning up Network socket directories
Setting up Network socket directories
 Adding to inittab
Startup will be queued to init within 30 seconds.
Checking the status of new Oracle init process...
Expecting the CRS daemons to be up within 600 seconds.
 Cluster Synchronization Services is active on these nodes.
        node1
Cluster Synchronization Services is active on all the nodes.
Oracle CSS service is installed and running under init(1M)
而后启动ASM实例:
[oracle@node1 ~]$export ORACLE_SID=+ASM
[oracle@node1 ~]$sqlplus / as sysdba
SQL> startup
ASM instance started
Total System Global Area    134217728 bytes
Fixed Size                   1218124 bytes
Variable Size               107833780 bytes
ASM Cache                   25165824 bytes
ORA-15110: no diskgroups mounted
由于首次启动ASM实例并无建立ASM磁盘组,因此显示 15110错误是正常的。
3.管理ASM磁盘组
 ASM磁盘组是做为逻辑单元进行统一管理的一组磁盘,在ASM实例中,能够建立和添加新的磁盘组,能够修改现有的磁盘组,在其中添加一个磁盘或者删除一个磁盘,也能够删除现有的磁盘组。
(1)添加磁盘组
SQL> create diskgroup FLASH_DISK external redundancy disk '/dev/oracleasm/disks/ASMDISK1' name flashdisk;
Diskgroup created.
SQL> create diskgroup ARCH_DISK external redundancy disk '/dev/oracleasm/disks/ASMDISK2' name archdisk1;
Diskgroup created.
SQL> create diskgroup DATA_DISK normal redundancy disk '/dev/oracleasm/disks/ASMDISK4' name datadisk1, '/dev/oracleasm/disks/ASMDISK5' name datadisk2;
Diskgroup created.
(2)查看磁盘组状态
SQL> select name,state from v$asm_diskgroup;
NAME                           STATE
-------------------       --------------
FLASH_DISK                   MOUNTED
ARCH_DISK                   MOUNTED
DATA_DISK               MOUNTED
(3)卸载FLASH_DISK磁盘组
SQL> alter diskgroup FLASH_DISK dismount;
Diskgroup altered.
SQL> select name,state from v$asm_diskgroup;
NAME               STATE
---------------------------  -----------
FLASH_DISK         DISMOUNTED
ARCH_DISK          MOUNTED
DATA_DISK          MOUNTED
(4)挂载FLASH_DISK磁盘组
SQL> alter diskgroup  FLASH_DISK mount;
Diskgroup altered.
SQL> select name,state from v$asm_diskgroup;
NAME                STATE
------------------------------  -----------
FLASH_DISK      MOUNTED
ARCH_DISK        MOUNTED
DATA_DISK     MOUNTED
(5)查看磁盘名与裸设备对应关系
SQL>  select name,path from v$asm_disk_stat;
NAME                             PATH
-------------------         --------------------------------------
                               /dev/oracleasm/disks/ASMDISK3
DATADISK2                      /dev/oracleasm/disks/ASMDISK5
DATADISK1                      /dev/oracleasm/disks/ASMDISK4
ARCHDISK1                      /dev/oracleasm/disks/ASMDISK2
FLASHDISK                      /dev/oracleasm/disks/ASMDISK1
(6)查看每一个磁盘组的可用大小
SQL> select name,allocation_unit_size,total_mb from v$asm_diskgroup;
NAME      ALLOCATION_UNIT_SIZE      TOTAL_MB
------------------ --------------------------------    ----------
FLASH_DISK  1048576          3815
ARCH_DISK  1048576          3815
DATA_DISK   1048576           954
(7)向磁盘组中增长一个磁盘
SQL> ALTER DISKGROUP ARCH_DISK ADD DISK '/dev/oracleasm/disks/ASMDISK3' name ARCHDISK2;
Diskgroup altered.
查看每一个磁盘组的可用大小
SQL> select name,allocation_unit_size,total_mb from v$asm_diskgroup;
NAME       ALLOCATION_UNIT_SIZE   TOTAL_MB
------------------- -------------------------------   ----------
FLASH_DISK  1048576         3815
ARCH_DISK  1048576         4292
DATA_DISK  1048576          954
SQL> select name,path from v$asm_disk_stat;
NAME                            PATH
-------------------       ----------------------------------------
DATADISK2                       /dev/oracleasm/disks/ASMDISK5
DATADISK1                       /dev/oracleasm/disks/ASMDISK4
ARCHDISK2                       /dev/oracleasm/disks/ASMDISK3
ARCHDISK1                       /dev/oracleasm/disks/ASMDISK2
FLASHDISK                       /dev/oracleasm/disks/ASMDISK1
能够看出,磁盘组ARCH_DISK的大小发生变化了,代表添加磁盘成功。
(8)从磁盘组中删除一个磁盘:
SQL> ALTER DISKGROUP ARCH_DISK DROP DISK ARCHDISK2;
Diskgroup altered.
(9)删除一个磁盘组:
SQL> drop diskgroup  FLASH_DISK;
Diskgroup dropped.
当有数据库使用ASM的磁盘组时,是没法卸载和删除这个磁盘组的。ASM实例若是宕掉,那么使用ASM的数据库实例也会宕掉。在RAC环境中,在删除一个磁盘组以前,其余节点的ASM实例必须将这个要删除的磁盘组卸载。
4.关闭ASM实例
关闭ASM实例的命令和关闭数据库实例的命令相同,但只有在没有任何数据库实例链接到该ASM实例的状况下,才能正常关闭ASM实例,若是至少有一个数据库实例与之链接,会提示如下错误:
ORA-15097: cannot SHUTDOWN ASM instance with connected RDBMS instance
此时,若是对该ASM实例强制执行SHUTDOWN ABORT命令,那么ASM实例将被关闭,任何与之链接的数据库实例最终也将自动关闭,同时报如下错误:
ORA-15064: communication failure with ASM instance
ASM实例被强制关闭后,在下次启动时,会要求进行恢复。
5.  ASMCMD命令
Oracle在10g版本中提供了ASMCMD命令,经过这个命令能够管理存储在ASM磁盘中的数据。下面简单介绍ASMCMD命令的使用方法。
在使用ASMCMD命令时必须启动ASM实例,而后指定ORACLE_HOME和ORACLE_SID,例如:
[oracle@node-rac1 ~]$ export ORACLE_SID=+ASM1
[oracle@node-rac1 ~]$ asmcmd
ASMCMD>
还可使用“asmcmd -p”,加上“-p”参数能够显示当前路径。
下面是ASMCMD提供的一些可用命令,其中oracle 11g新增的命令有cp、md_backup、md_restore。
ASMCMD> ?
        commands:
        --------
        helpide

        cd
        cp
        du
        find
        ls
        lsct
        lsdg
        mkalias
        mkdir
        pwd
        rm
        rmalias工具

        md_backup
        md_restore布局

        lsdsk
        remap
(1)切换目录
ASMCMD> cd +DATA_DISK/RACDB
(2)列出目录信息
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfileracdb.ora
(3)查看磁盘空间信息
执行ASMCMD的 “du DATAFILE”命令查看磁盘空间信息,如图3所示性能

 

(4)显示ASM和数据库实例链接状况
执行ASMCMD的“lsct”命令显示ASM和数据库实例链接状况,如图4所示

 

(5)建立一个目录
ASMCMD> mkdir test
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfileracdb.ora
test/
(6)复制磁盘文件
将ASM磁盘文件spfileracdb.or复制到test目录下:
ASMCMD> cp spfileracdb.ora test
source +DATA_DISK/RACDB/spfileracdb.ora
target +DATA_DISK/RACDB/test/spfileracdb.ora
copying file(s)...
file, +DATA_DISK/racdb/test/spfileracdb.ora, copy committed.
ASMCMD> cd test
ASMCMD> ls
spfileracdb.ora
将ASM磁盘文件UNDOTBS1.258.728340289文件复制到操做系统某目录下:
ASMCMD> cp UNDOTBS1.258.728340289 UNDOTBS1.dbf           
source +DATA_DISK/RACDB/DATAFILE/UNDOTBS1.258.728340289
target UNDOTBS1.dbf
copying file(s)...
copying file(s)...
copying file(s)...
copying file(s)...
copying file(s)...
copying file(s)...
file, /u01/oracle/product/11.0.6/rac_db/dbs/UNDOTBS1.dbf, copy committed.
(7)备份ASM的metadata
ASMCMD> md_backup -b /u01/oracle/datadisk.bak -g data_disk
Disk group to be backed up: DATA_DISK
这样就把ASM的metadata备份到了文件系统上,经过查看datadisk.bak文件能够得知metadata的组织信息。
(8)为ASM磁盘文件设置别名
执行如图5所示的命令为ASM磁盘文件设置别名。

(9)在磁盘组查找文件 ASMCMD> find +DATA_DISK sys* +DATA_DISK/RACDB/DATAFILE/SYSAUX.257.728340287 +DATA_DISK/RACDB/DATAFILE/SYSAUX.dbf +DATA_DISK/RACDB/DATAFILE/SYSTEM.256.728340285 +DATA_DISK/RACDB/DATAFILE/SYSTEM.dbf (10)在磁盘组删除文件 ASMCMD> rm -rf test