虚拟机上实施ASM
 
此文档旨在让初学者以最快的速度完成ASM部署,初步了解ASM的部署流程,以及简单的ASM管理。ASM并不难,Oracle利用这种技术能轻松的实现对存储的管理。在书上和网络上都查找了一些资料,都不是太尽人意。要么说得太复杂,要么就是比较笼统。自己部署时也遇到一些小问题,和大家一起分享。
 
系统环境:
虚拟机:VMware Workstation 9
操作系统:RHEL5.4
数据库:Oracle10g
 
详细步骤:
 
一、在虚拟机上添加虚拟磁盘
 
在虚拟机上安装好操作系统与Oracle数据库之后,就可以开始准备部署ASM了,当然也可以在创建Oracle数据库的时候一同创建ASM实例。为了简化理解,我们安装好Oracle数据库之后再创建ASM实例。
在虚拟机上添加虚拟磁盘非常简单,如下图所示,添加3500M的虚拟磁盘。

二、创建磁盘分区
 
在虚拟机中新添加的磁盘是看不到的,如果想要看到新添加的磁盘有两种方法,第一种是重启虚拟机。第二种就是发送命令让系统扫描主机外设,这种方法不用重启虚拟机。我们选择第二种:
命令: echo "- - -" > /sys/class/scsi_host/host0/scan
执行完这条命令后,查看是否发现了新加载的磁盘。
[root@ora10 ~]# fdisk -l
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          25      200781   83  Linux
/dev/sda2              26        1172     9213277+  83  Linux
/dev/sda3            1173        1433     2096482+  82  Linux swap / Solaris
/dev/sda4            1434        2610     9454252+   5  Extended
/dev/sda5            1434        2610     9454221   8e  Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/sdc: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         512      524272   83  Linux
Disk /dev/sdd: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1         512      524272   83  Linux
Disk /dev/sde: 536 MB, 536870912 bytes
64 heads, 32 sectors/track, 512 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1         512      524272   83  Linux
从上面可以看出/dev/sdc  /dev/sdd  /dev/sdd三块新添加磁盘都已经被加载。加载完磁盘之后需要创建磁盘分区,这个也很简单。
依次执行完以下命令:
命令:fdisk /dev/sdc
命令:n   #新建分区
命令:p   #创建主分区
命令:1  #第一个分区
命令:直接回车 #默认将整个磁盘划到一个分区
命令:w  #保存
命令:q    #退出
对每一块新添加的磁盘都依次执行以上命令,最后我们通过fdisk -l磁盘列表就可以查看到/dev/sdc1  /dev/sdd1  /dev/sde1这三个磁盘分区了。
 
三、安装ASM相关支持包
 
ASM相关的支持包共有三个,可以去Oracle官网下载,下载的时候一定要注意操作系统的内核,下载与之对应的内核支持包。
命令:uname -r   #查看系统内核版本
命令:rpm -aq |grep oracleasm   #查看已经安装的oracleasm
[root@ora10 ~]# rpm -aq|grep oracleasm
oracleasmlib-2.0.4-1.el5
oracleasm-support-2.1.8-1.el5
oracleasm-2.6.18-164.el5-2.0.5-1.el5
以上是本机已经安装的 oracleasm相关包,具体怎么安装就不说了。
 
四、配置并创建ASM磁盘
 
Oracleasm相关的包安装好之后,可以查看下文件安装的目录,这里最重要的配置文件目录位于 /etc/init.d/oracleasm 
来看下这个脚本可以做些什么。
[root@ora10 init.d]# oracleasm -h
Usage: oracleasm [--exec-path=<exec_path>] <command> [ <args> ]
       oracleasm --exec-path
       oracleasm -h
       oracleasm -V
The basic oracleasm commands are:
    configure        Configure the Oracle Linux ASMLib driver
    init             Load and initialize the ASMLib driver
    exit             Stop the ASMLib driver
    scandisks        Scan the system for Oracle ASMLib disks
    status           Display the status of the Oracle ASMLib driver
    listdisks        List known Oracle ASMLib disks
    querydisk        Determine if a disk belongs to Oracle ASMlib
    createdisk       Allocate a device for Oracle ASMLib use
    deletedisk       Return a device to the operating system
    renamedisk       Change the label of an Oracle ASMlib disk
    update-driver    Download the latest ASMLib driver
英文再差应该也可以理解,通过这个脚本可以创建、删除、列表、重命名、验证、卸载、重加载 ASM磁盘。操作非常简单。
首先要配置一下。
命令:/etc/init.d/oracleasm configure
配置项中的owneroraclegroup dba ,引导加载asm驱动项选择y就行了,其它保持默认。
接下来要创建asm磁盘了。
命令: /etc/init.d/oracleasm createdisk SDC   /dev/sdc1
      /etc/init.d/oracleasm createdisk SDD  ‘ /dev/sdd1
      /etc/init.d/oracleasm createdisk SDE  /dev/sde1
查看下我们创建好的asm磁盘
命令:/etc/init.d/oracleasm listdisks
[root@ora10 init.d]# oracleasm listdisks
SDC
SDD
SDE
当然你也可以删除 asm磁盘
命令:/etc/init.d/oracleasm deletedisk SDC
验证asm磁盘是否有效
命令:/etc/init.d/oracleasm querydisk SDC
 
五、添加CSS服务
 
这里要添加CSS服务,这个服务具体什么用,就不详细说,可以去问下百度哥,或者是谷歌妹。
命令: [oracle@ora10 bin]$ cd $ORACLE_HOME/dbs/bin
       [oracle@ora10 bin]$ ./localconfig add
 
六、创建ASM实例 
 
创建ASM实例可以直接编写asm初始化参数文件,口令文件的方式,这里我们采用最简单直观的方式,通过图形化界面。
oracle用户登陆服务器执行dbca,打开创建数据库助手窗口。在第三步选择配置ASM
到四步选择“Create New
 

有可能发现不了磁盘,需要修改一下磁盘下现路径“Change Disk Discovery Path”,磁盘发现路径有2种方式,一种是通过字符串实别,如本例“ORCL:*”,另一种是通过全路径实别,可以输入asm磁盘设备所在完全路径,默认路径为“/dev/oracleasm/disks/*”。这两种方式皆可。但这两种方式略有差别,采用全路径识别的方式,ASM会自动为asm磁盘命名,而自符串识别方式,会使用创建时所用的asm磁盘名,个人觉得还是用字符串的方式方便管理一些。
 

输入磁盘组名,选择冗余模式,这里选择“Normal”也就是镜像,Normal冗余组至少要有2块磁盘。然后选择asm磁盘。
 

七、管理ASM磁盘组
 
经过上面的一番辛苦,最令人兴奋的时刻终于到了。赶紧去看看我们的成果吧。
切换到+ASM,测试下实例能否正常启动吧。
export ORACLE_SID=+ASM
sqlplus / as sysdba
SQL> startup
ASM instance started
Total System Global Area  130023424 bytes
Fixed Size                  2082208 bytes
Variable Size             102775392 bytes
ASM Cache                  25165824 bytes
ASM diskgroups mounted
ASM管理最重要的2个动态性能视图“v$asm_diskgroup”和“v$asm_disk”,查看下磁盘组及asm磁盘的相关信息。
SQL> set line 120
SQL> col name for a10
SQL> select group_number,name,total_mb,free_mb,state from v$asm_diskgroup;
GROUP_NUMBER NAME         TOTAL_MB    FREE_MB      STATE
------------ ---------- ---------- ---------- ---------------------- ------------------------------------
           1 DGROUP01         1022             920           MOUNTED
从查询结果可以得知我们刚才创建的组名为“ DGROUP01 ”,编号为 1,目前处于挂载状态,以及总空间与空闲空间。
SQL> col path for a45
     SQL> col path for a10
SQL> select group_number,disk_number,name,path,total_mb,free_mb from v$asm_disk;
GROUP_NUMBER   DISK_NUM  BER NAME   PATH     TOTAL_MB    FREE_MB
------------ ----------- ---------- ---------- ---------- ---------- ---------------------------------------------
           0           2                     ORCL:SDE       511          0
           1           0       SDC            ORCL:SDC       511        460
           1           1       SDD            ORCL:SDD       511        460
从查询结果可以得知“ DGROUP01 ”组有 2块磁盘,分别是“SDC”和“SDD”,及未分配的磁盘“SDE”,自磁盘的总容量与空闲容量。
接下来我们来删除,创建磁盘组,挂载,卸载磁盘组,向组里加磁盘,删除组里的磁盘,及在磁盘组上创建表空间等操作,真正的实现ASM磁盘管理。
1、 删除磁盘组
命令:drop diskgroup dgroup01 including contents
SQL> drop diskgroup dgroup01 including contents;
Diskgroup dropped.
SQL> select group_number,name,total_mb,free_mb,state from v$asm_diskgroup;
no rows selected
2、 创建磁盘组
  命令:create diskgroup dgroup02 normal redundancy disk  ORCL:SDC  disk  ORCL:SDD
SQL> create diskgroup dgroup02 normal redundancy disk 'ORCL:SDC' disk 'ORCL:SDD';
Diskgroup created.
SQL> select group_number,name,total_mb,free_mb,state from v$asm_diskgroup;
GROUP_NUMBER   NAME         TOTAL_MB    FREE_MB     STATE
------------ ---------- ---------- ---------- ---------------------- --------------------------------------
           1       DGROUP02       1022              920 MOUNTED
3、 卸载磁盘组
命令:alter diskgroup dgroup02 dismount;
SQL> alter diskgroup dgroup02 dismount;
Diskgroup altered.
SQL> select group_number,name,total_mb,free_mb,state from v$asm_diskgroup;
GROUP_NUMBER NAME         TOTAL_MB    FREE_MB       STATE
------------ ---------- ---------- ---------- ---------------------- ------------------------------------
           0 DGROUP02            0            0             DISMOUNTED
4、 挂载磁盘组
命令:alter diskgroup dgroup02 mount;
SQL> alter diskgroup dgroup02 mount;
Diskgroup altered.
SQL> select group_number,name,total_mb,free_mb,state from v$asm_diskgroup;
GROUP_NUMBER NAME         TOTAL_MB    FREE_MB       STATE
------------ ---------- ---------- ---------- ----------------------   -------------------------------------
           1 DGROUP02              1022        920            MOUNTED
5、 添加磁盘到磁盘组
命令:alter diskgroup dgroup02 add disk  ORCL:SDE
SQL> select group_number,disk_number,name,path,total_mb,free_mb from v$asm_disk;
GROUP_NUMBER DISK_NUMBER   NAME  PATH   TOTAL_MB    FREE_MB
------------ ----------- ---------- ---------- ---------- ---------- ---------------------------------------
           1           0 SDC        ORCL:SDC          511        460
           1           1 SDD        ORCL:SDD          511        460
            1           2 SDE        ORCL:SDE            511         460
这里需要注意的是往磁盘组里添加磁盘时添加的 PATH字段的字符串。
6、 从磁盘组中删除磁盘
命令:alter diskgroup dgroup02 drop disk  SDC ;
SQL> select group_number,disk_number,name,path,total_mb,free_mb from v$asm_disk;
GROUP_NUMBER DISK_NUMBER NAME   PATH  TOTAL_MB    FREE_MB
------------ ----------- ---------- ---------- ---------- ---------- ---------------------------------------
            0           0            ORCL:SDC          511          0
           1           1 SDD        ORCL:SDD         511        460
           1           2 SDE        ORCL:SDE          511        460
ASM添加磁盘组后会自动做数据平衡,将数据分布到新添加的磁盘当中去,反之从磁
盘组中删除磁盘后会将删除磁盘上的数据分配到组中其它磁盘上去。
7、 创建表空间
命令:
SQL> create tablespace asmtest
  2  datafile '+DGROUP02/asmtest01.dbf'
  3  size 10m
  4  autoextend on
  5  /
Tablespace created.
可以在表空间上创建表,插入数据,做下读写测试。整个ASM部署流程就讲完了。
 
补充知识:
 
如果因为条件限制不能使用Oracle服务器控制台,也可以配置,关键是编辑参数文件和口令文件。这里将init+ASM文件内容贴出来,这是个文件文件,可以直接用VI编辑工具处理。
*.asm_diskgroups='DGROUP01'
+ASM.asm_diskgroups='DGROUP02'#Manual Mount
*.asm_diskstring='ORCL:*'
*.background_dump_dest='/opt/app/oracle/admin/+ASM/bdump'
*.core_dump_dest='/opt/app/oracle/admin/+ASM/cdump'
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='SHARED'
*.user_dump_dest='/opt/app/oracle/admin/+ASM/udump'
创建口令文件
orapwd file= $ORACLE_HOME/dbs/orapw+ASM  password=*****
创建日志文件目录
mkdir -p  /opt/app/oracle/admin/+ASM/bdump
mkdir -p  /opt/app/oracle/admin/+ASM/ udump
mkdir -p  /opt/app/oracle/admin/+ASM/ cdump
然后就可测试下+ASM实例是否能正常启动了。