ASM可以被看成是建立在裸设备或块设备之上、为Oracle数据文件创建的“特别文件系统”,这个文件系统由Oracle的内核来管理和维护,不再需要传统的卷管理软件以及文件系统。建立在ASM之上的文件在操作系统中也不可见,Oracle通过自身来进行存储管理。ASM技术的出现,使得Oracle RAC的部署成本和维护成本大大降低,促进了Oracle集群技术的迅速普及。
从这个意义上说,ASM其实是Oracle的磁盘管理器,在同一台主机上,ASM实例可以为多个数据库实例提供磁盘组。在ASM选择磁盘的过程中,可以选择系统中划分好的裸设备来创建磁盘组(Disk Group)供数据库使用。
ASMLib管理磁盘
在Linux平台上,Oracle提供了ASMLib支持库进行磁盘划分和管理,在OEL6(Oracle Enterprise Linux)之前,安装文件可以从以下页面获得:
http://www.oracle.com/technetwork/topics/linux/asmlib/index-101839.html
在OEL6之后则需要通过ULN(Unbreakable Linux Network)下载,ASMLib简化磁盘管理,但是不是必需的。
针对不同的内核版本,Oracle提供了不同的asmlib发布版本,安装前需要针对你的Linux发布找到相应的ASMLib版本,以下示例使用的是Rehat AS4,内部版本为2.6.9-11:
[root@danaly ~]# cat /etc/redhat-release Red Hat Enterprise Linux AS release 4 (Nahant) [root@danaly ~]# uname -r 2.6.9-11.ELsmp
下载相应的RPM包后执行安装:
[root@danaly os]# ls -l -rw-r--r-- 1 oracle dba 77514 Sep 1 10:46 oracleasm-2.6.9-11.EL-2.0.0-1.i686.rpm -rw-r--r-- 1 oracle dba 75384 Sep 1 10:46 oracleasm-2.6.9-11.ELhugemem-2.0.0-1.i686.rpm -rw-r--r-- 1 oracle dba 78232 Sep 1 10:46 oracleasm-2.6.9-11.ELsmp-2.0.0-1.i686.rpm -rw-r--r-- 1 oracle dba 12785 Sep 1 10:46 oracleasmlib-2.0.0-1.i386.rpm -rw-r--r-- 1 oracle dba 21345 Sep 1 10:46 oracleasm-support-2.0.0-1.i386.rpm [root@danaly os]# rpm -Uvh oracleasm* Preparing... ########################################### [100%] 1:oracleasm-support ########################################### [ 20%] 2:oracleasm-2.6.9-11.ELsm########################################### [ 40%] 3:oracleasm-2.6.9-11.EL ########################################### [ 60%] 4:oracleasm-2.6.9-11.ELhu########################################### [ 80%] 5:oracleasmlib ########################################### [100%]
安装之后需要做以下简单配置,运行oracleasm configure即可,以下指定缺省用户为Oracle,设置DBA组,开机加载:
[root@danaly os]# /etc/init.d/oracleasm configure Configuring the Oracle ASM library driver. This will configure the on-boot properties of the Oracle ASM library driver. The following questions will determine whether the driver is loaded on boot and what permissions it will have. The current values will be shown in brackets ('[]'). Hitting without typing an answer will keep that current value. Ctrl-C will abort. Default user to own the driver interface []: oracle Default group to own the driver interface []: dba Start Oracle ASM library driver on boot (y/n) [n]: y Fix permissions of Oracle ASM disks on boot (y/n) [y]: y Writing Oracle ASM library driver configuration: [ OK ] Creating /dev/oracleasm mount point: [ OK ] Loading module "oracleasm": [ OK ] Mounting ASMlib driver filesystem: [ OK ] Scanning system for ASM disks: [ OK ]
最后启用ASM,就完成了ASMLib需要的常规配置:
[root@danaly cciss]# /etc/init.d/oracleasm enable Writing Oracle ASM library driver configuration: [ OK ] Loading module "oracleasm": [ OK ] Mounting ASMlib driver filesystem: [ OK ] Scanning system for ASM disks: [ OK ]
如果已经划分好了磁盘设备,就可以创建ASM磁盘分区,以下通过现有的四个磁盘分区创建了四个卷组:
[root@danaly cciss]# /etc/init.d/oracleasm createdisk VOL1 /dev/cciss/c0d1p1 Marking disk "/dev/cciss/c0d1p1" as an ASM disk: [ OK ] [root@danaly cciss]# /etc/init.d/oracleasm createdisk VOL2 /dev/cciss/c0d1p2 Marking disk "/dev/cciss/c0d1p2" as an ASM disk: [ OK ] [root@danaly cciss]# /etc/init.d/oracleasm createdisk VOL3 /dev/cciss/c0d1p3 Marking disk "/dev/cciss/c0d1p3" as an ASM disk: [ OK ] [root@danaly cciss]# /etc/init.d/oracleasm createdisk VOL4 /dev/cciss/c0d1p4 Marking disk "/dev/cciss/c0d1p4" as an ASM disk: [ OK ] [root@danaly ~]# /etc/init.d/oracleasm listdisks VOL1 VOL2 VOL3 VOL4
到这里ASM的工作就完成了,这里的磁盘可以被Oracle所使用,使用oracleasm-discover来探测ASM硬盘:
[root@danaly ~]# oracleasm-discover Using ASMLib from /opt/oracle/extapi/32/asm/orcl/1/libasm.so [ASM Library - Generic Linux, version 2.0.0 (KABI_V2)] Discovered disk: ORCL:VOL1 [39070048 blocks (20003864576 bytes), maxio 128] Discovered disk: ORCL:VOL2 [39070080 blocks (20003880960 bytes), maxio 128] Discovered disk: ORCL:VOL3 [39070080 blocks (20003880960 bytes), maxio 128] Discovered disk: ORCL:VOL4 [25043040 blocks (12822036480 bytes), maxio 128]
ASMLib创建的卷设备,会在Dev下创建独立管理的伪设备:
[root@danaly ~]# ls -l /dev/oracleasm/disks/ total 0 brw-rw---- 1 oracle dba 104, 17 Sep 3 10:40 VOL1 brw-rw---- 1 oracle dba 104, 18 Sep 3 10:40 VOL2 brw-rw---- 1 oracle dba 104, 19 Sep 3 10:40 VOL3 brw-rw---- 1 oracle dba 104, 20 Sep 3 10:40 VOL4
以下是安装了ASMLib之后,通过oracleasm最常见的管理用法:
[root@danaly ~]# /etc/init.d/oracleasm Usage: /etc/init.d/oracleasm {start|stop|restart|enable|disable|configure|createdisk|deletedisk|querydisk|listdisks|scandisks|status}
ASM可以管理独立的磁盘,也可以通过磁盘分区来创建ASM设备,以下示例在Linux创建三个新的磁盘分区用于ASM管理:
[root@danaly etc]# fdisk /dev/cciss/c0d0 Command (m for help): n First cylinder (4602-8854, default 4602): Using default value 4602 Last cylinder or +size or +sizeM or +sizeK (4602-8854, default 8854): +20000M Command (m for help): n First cylinder (7035-8854, default 7035): Using default value 7035 Last cylinder or +size or +sizeM or +sizeK (7035-8854, default 8854): +3000M Command (m for help): n First cylinder (7401-8854, default 7401): Using default value 7401 Last cylinder or +size or +sizeM or +sizeK (7401-8854, default 8854): +3000M
新的分区表信息:
Command (m for help): p Disk /dev/cciss/c0d0: 72.8 GB, 72833679360 bytes 255 heads, 63 sectors/track, 8854 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/cciss/c0d0p1 * 1 33 265041 83 Linux /dev/cciss/c0d0p2 34 555 4192965 82 Linux swap /dev/cciss/c0d0p3 556 686 1052257+ 83 Linux /dev/cciss/c0d0p4 687 8854 65609460 5 Extended /dev/cciss/c0d0p5 687 1730 8385898+ 83 Linux /dev/cciss/c0d0p6 1731 2774 8385898+ 83 Linux /dev/cciss/c0d0p7 2775 3818 8385898+ 83 Linux /dev/cciss/c0d0p8 3819 4601 6289416 83 Linux /dev/cciss/c0d0p9 4602 7034 19543041 83 Linux /dev/cciss/c0d0p10 7035 7400 2939863+ 83 Linux /dev/cciss/c0d0p11 7401 7766 2939863+ 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks.
通过如下命令创建ASM磁盘:
[root@danaly data1]# /etc/init.d/oracleasm createdisk VOL5 /dev/cciss/c0d0p10 Marking disk "/dev/cciss/c0d0p10" as an ASM disk: [ OK ] [root@danaly data1]# /etc/init.d/oracleasm createdisk VOL6 /dev/cciss/c0d0p11 Marking disk "/dev/cciss/c0d0p11" as an ASM disk: [ OK ] [root@danaly data1]# /etc/init.d/oracleasm listdisks VOL1 VOL2 VOL3 VOL4 VOL5 VOL6
启动ASM实例,可以识别并使用这些磁盘,创建磁盘组:
[oracle@danaly ~]$ export ORACLE_SID=+ASM [oracle@danaly ~]$ sqlplus "/ as sysdba" SQL*Plus: Release 10.2.0.1.0 - Production on Sun Sep 3 00:28:09 2006 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to an idle instance. SQL> startup ASM instance started ASM diskgroups mounted SQL> select group_number,disk_number,mode_status from v$asm_disk; GROUP_NUMBER DISK_NUMBER MODE_STATUS ------------ ----------- -------------- 0 4 ONLINE 0 5 ONLINE 1 0 ONLINE 1 1 ONLINE 1 2 ONLINE 1 3 ONLINE SQL> select group_number,disk_number,mode_status,name from v$asm_disk; GROUP_NUMBER DISK_NUMBER MODE_STATUS NAME ------------ ----------- -------------- --------------------------------- 0 4 ONLINE 0 5 ONLINE 1 0 ONLINE VOL1 1 1 ONLINE VOL2 1 2 ONLINE VOL3 1 3 ONLINE VOL4 SQL> create diskgroup orag2 external redundancy disk 'ORCL:VOL5'; Diskgroup created. SQL> select group_number,disk_number,mode_status,name from v$asm_disk; GROUP_NUMBER DISK_NUMBER MODE_STATUS NAME ------------ ----------- -------------- ------------------------------------- 0 5 ONLINE 1 0 ONLINE VOL1 1 1 ONLINE VOL2 1 2 ONLINE VOL3 1 3 ONLINE VOL4 2 0 ONLINE VOL5
在新的磁盘组上创建表空间:
SQL> create tablespace eygle datafile '+ORAG2' ; Tablespace created. SQL> select name from v$datafile; NAME --------------------------------------------------------------------------------- +ORADG/danaly/datafile/system.264.600016955 +ORADG/danaly/datafile/undotbs1.265.600016969 +ORADG/danaly/datafile/sysaux.266.600016977 +ORADG/danaly/datafile/users.268.600016987 +ORAG2/danaly/datafile/eygle.256.600137647
向现有磁盘组增加磁盘
SQL> alter diskgroup orag2 add disk 'ORCL:VOL6'; Diskgroup altered.
当然这些工作也可以通过DBCA(Oracle 11g中使用asmca)来进行管理。下图显示的是磁盘组及磁盘信息:
图6-7 创建或编辑磁盘组
在创建磁盘组时冗余选项(Redundancy)有以下3个可选值。
· High:高度冗余,Oracle可以通过ASM实现3路镜像,需要3个Failure Groups。
· Normal:正常冗余,通过ASM实现2路镜像,需要两个Failure Groups。
· External:外部冗余,也就是通过ASM之外的技术实现冗余,Oracle不做镜像处理。
当在整个数据库环境中只存在一个物理存储机柜的时候,通常建议通过外部手段实现磁盘冗余(通过存储划分Raid5、Raid10等),在这里即可选择External。
在使用外部冗余模式下,一个文件会以AU (Allocation Unit)为单位在多个磁盘上均衡分布,下图显示一个4M的文件,在外部冗余磁盘组中4个磁盘上的均衡分布:
当然,并非所有文件都能恰好均衡在所有ASM磁盘上,但是当有大量文件存储后,ASM磁盘存储总是接近均衡的。
回顾一下之前ASM的参数文件,其中有这样两个重要参数:
*.asm_diskgroups='ORADG' *.asm_diskstring='ORCL:VOL*'
其中asm_diskstring参数用于定义实例启动时搜索可用的ASM磁盘的路径,由于前面创建ASM磁盘的名称是以VOL开头,所以此处使用*通配符,前面的“ORCL:”在Linux下不可以省略,否则ASM实例将无法检查到磁盘。
asm_diskstring参数还可以指定一个或多个值,多个值将允许ASM从不同路径来搜索和加载硬盘,以下是一个多路径的参数设置,其中asm_diskgroups参数用于定义ASM实例启动时自动Mount的磁盘组,示例的磁盘卷由Veritas的Volume Manger创建:
SQL> select name,type,value from v$parameter 2 where name='asm_diskstring'; NAME TYPE VALUE -------------------- ----- --------------------------------------- asm_diskstring 2 /dev/vx/rdsk/smsbsdatadg/smsbsdatavol, /dev/vx/rdsk/smsbsflshdg/smsbsflshvol
创建好的磁盘组(Disk Group)在创建数据库时就可以被选择作为文件存储地,如图6-8所示。
图6-8 选择磁盘组作为文件存储地
创建了ASM实例以及磁盘组之后,就可以登录ASM并检查磁盘组信息了:
[oracle@danaly ~]$ export ORACLE_SID=+ASM [oracle@danaly ~]$ sqlplus "/ as sysdba" SQL> select instance_name from v$instance; INSTANCE_NAME -------------------------------- +ASM SQL> select name,TOTAL_MB,FREE_MB from v$asm_diskgroup; NAME TOTAL_MB FREE_MB -------------------- ---------- ---------- ORADG 69459 24844
在ASM之前,裸设备是不能用来存储归档日志等变化文件的,但是ASM则可以存储这些文件,ASM文件使用OMF方式管理,Oracle可以自动进行文件的创建及删除等管理工作,而无需DBA直接介入。在ASM模式下,可以使用默认的Oracle闪回区来作为默认的归档等文件的存储地点。以下就是这样一个数据库实例,其建立两个磁盘组,一个用于数据文件的存储,另外一个则用于闪回区:
SQL> show parameter asm_diskgroups NAME TYPE VALUE ------------------------------------ ---------------------- ------------------------------ asm_diskgroups string DATADG, FLSHDG
ASM存储Voting和OCR
在Oracle 11gR2以前,RAC中的OCR Disk和Voting Disk必须放置在裸设备或者第三方集群文件系统中。而在Oracle 11gR2中,这二者也一同被纳入了ASM的管理范畴,在安装Grid Infrastructure(缩写为GI)时只需选择ASM存储然后创建相应的ASM磁盘组即可,从而进一步地简化了存储管理的复杂度,如图6-9所示:
图6-9:OCR和Voting Disk的ASM存储
图6-10是Oracle 11.2.0.2版本GI安装时,指定一个Disk,创建CRSDG磁盘组,用于存储OCR等:
图6-10:GI安装过程中创建CRS磁盘组
可以用以下命令查看OCR和VOTING Disk的信息:
[oracle@xsh-db1]$ocrcheck Status of Oracle Cluster Registry is as follows : Version : 3 Total space (kbytes) : 262120 Used space (kbytes) : 2252 Available space (kbytes) : 259868 ID : 163721714 Device/File Name : +CRS Device/File integrity check succeeded Device/File not configured Device/File not configured Device/File not configured Device/File not configured Cluster registry integrity check succeeded Logical corruption check succeeded [oracle@xsh-db1]$crsctl query css votedisk ## STATE File Universal Id File Name Disk group -- ----- ----------------- --------- --------- 1. ONLINE 653c16db3bec4ff7bf5d17888c7f64de (/dev/rhdisk2) [CRS] Located 1 voting disk(s).
在ASM的实例管理和磁盘组创建中,Oracle提供了独立的asmca工具,如图6-10,启动ASM配置助手可以进行独立的ASM维护:
图6-10:查看磁盘组信息
图6-11是在Oracle 11.2.0.2中创建独立的ASM磁盘组示意:
图6-11:创建外部冗余的磁盘组
Disk Groups选项页查看和管理所有的磁盘组,如图6-12所示:
图6-12:查看所有磁盘组信息
强制删除磁盘组
虽然我们很少遇到需要删除磁盘组的情况,但是在某些故障情况下,如果某个磁盘不可用,磁盘组无法加载时,删除磁盘组就变得复杂,在Oracle 10g中通常需要用dd命令清理磁盘信息,在Oracle 11g中增加了一个强制选项,当制定Force参数时,可以在ASM磁盘组不可挂载的情况下,强制删除某个磁盘组:
[grid@enmou1 ~]$ sqlplus / as sysasm SQL*Plus: Release 11.2.0.2.0 Production on Tue Mar 22 15:37:39 2011 Copyright (c) 1982, 2010, Oracle. All rights reserved. SQL> drop diskgroup oradg force including contents; Diskgroup dropped.
如果磁盘已经正常Mount,数据库不允许使用force选项:
SQL> drop diskgroup oradg force including contents; drop diskgroup oradg force including contents * ERROR at line 1: ORA-15039: diskgroup not dropped ORA-15230: diskgroup 'ORADG' does not require the FORCE option
ASM常用的视图有V$ASM_DISK、V$ASM_DISKGROUP、V$ASM_FILE、V$ASM_TEMPLATE、V$ASM_OPERATION和V$ASM_CLIENT等,我们可以通过这些视图得到ASM的很多相关信息。