概述
在真正的海量数据库环境中DBA可能会花费很多的时间来作磁盘管理比如一个表空间将占满整个磁盘DBA就需要再添加一块磁盘到操作系统中然后再在新的磁盘上创建新的数据文件如果是单个磁盘这倒不是很繁琐问题是如果原先我们使用的是RAID或者说是LVM那么现在大量的数据仍然是分布在以前的那些磁盘上如果我们想让这些数据均匀地分布在以前的磁盘和新增加的磁盘上我们可能就要耗费一天甚至几天的时间来作原先数据的导出导入那么如果有一种方法能实现我们就把一块磁盘加到系统里然后告诉Oracle我们要用这块盘了剩下的工作全部由Oracle来完成该是多好的一件事情!幸运的是Oracleg已经提供了这个功能这就是ASM(Automatic Storage Management)我们称为自动存储管理Oracleg的ASM不但帮助DBA从繁琐的磁盘空间管理中解脱出来而且更值得关注的是ASM同时提供了条带和镜像的功能而这些功能原先需要通过单独地配置RAID来实现
本文通过vmware安装RHEL + Oracleg来体验ASM数据库的强大功能为什么要使用vmware?因为在vmware中我们可以随意地添加或者删除虚拟磁盘(Virtual Disk)这样可以更方便地测试ASM数据库我想不是谁都可以顺手抓出五六块硬盘来作这样的测试的J
硬件配置
IBM R GC
迅驰GG内存G硬盘
软件配置
WindowsXP Pro SPVMware GSX Server RHELOracleg for Linux
安装VMware
这一步就不多说了我安装的是VMware GSX Server没有测试过VMware Workstation所以不保证可以实现本文中的步骤
在VMware中安装RHEL
<![if !supportLists]>. <![endif]>安装RHEL
这个过程也不多说了跟实际环境中安装RHEL一样值得注意的是由于通过Vmware所以可能在安装时无法正常启动Xwindow那么在字符界面下安装就可以了安装完毕重新启动系统Xwindow会自动启动的记住安装所有的开发包即可这将会尽量避免以后可能出现的link错误我的测试环境中给了RHEL总共M的内存
<![if !supportLists]>. <![endif]>添加块虚拟磁盘
按照如下操作在虚拟机的属性中选择添加硬件然后添加一个Virtual Disk
下一步由于我们创建的虚拟磁盘只是用来放置Oracle的数据文件而且我们将使用ASM中的failgroup的条带功能所以设置最大size是G就足够了
下一步指定虚拟磁盘文件的名称和存放位置默认存放在虚拟机的相同目录下这里我们指定文件名为physical
点击Advanced按钮设置虚拟磁盘的物理挂载点通常我们选择和虚拟机已有的系统盘在不同的SCSI端口上比如我们虚拟机的系统盘是SCSI:那么就设置这个磁盘为SCSI:即将添加的另外三块磁盘依次为SCSI:SCSI:和SCSI:
由于Virtual Disk的特点在新创建这个磁盘文件的时候并不会用到最大的size所以即使整个分区的空闲容量没有G(我们要创建个最大size是G的虚拟磁盘)也不会有问题虚拟磁盘文件的大小是随着需要而持续增加的最大增加到指定的max size当然这种特性也就导致了使用Virtual Disk比使用Plain Disk(创建时即占用max size大小的磁盘空间)的I/O效率要低所以如果有足够的磁盘空间那么建议使用Plain Disk创建Plain Disk的方法是在上面的第二步时在Allocate all disk space now的复选框前面打勾这样将会创建一个以pln和dat为扩展名的虚拟磁盘文件Plain Disk的好处还在于可以模拟RAC环境中的共享磁盘这是Virtual Disk无法作到的模拟RAC不在本文叙述的范围内
<![if !supportLists]>. <![endif]>更新内核
>uname a
RHEL默认安装的linux内核版本是为了能够正确的地安装oracleasm lib我们需要将内核升级到EL否则将无法正常启用oracleasm
原因是我们安装的oracleasmlib是已经编译好的rpm包而我们当前操作系统的内核必须和编译时候的系统内核版本一样否则即使看上去安装正常但是在启动oracleasm时候会在/var/log/messages文件中发现类似如下的报错信息
kernelmodule version mismatch
^I/lib/modules/ELABI/oracleasm/oracleasmo was compiled for kernel version EL ^Iwhile this kernel is version EL
从这个报错信息中我们也可以知道应该安装的内核版本为了更确切地知道下载的oracleasm包需要哪个版本的内核我们也可以先下载oracleasm安装启动然后查看这个报错信息之后再升级内核到相应的版本
注意本文中提到的EL内核是本文编写时oracleasm编译使用的内核随着oracle不断地推出asmlib的新版本需要的内核版本可能也在不断变化
下载新内核
kernelELi: pm
安装新内核
# rpm –ivh –nodeps kernelELirpm
安装完毕以后修改/boot/grub/nfrpm安装完毕以后应该已经自动在nf文件中添加了新版kernel启动的段落我们需要将default=修改为default=这样保证每次启动都用新的内核启动当测试没有问题之后我们也可以直接删除nf文件中的title Red Hat Enterprise Linux AS (EL)部分防止因错误操作而使用了原有的系统内核启动系统
# cat /boot/grub/nf
# nf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition This means that
# all kernel and initrd paths are relative to / eg
# root (hd)
# kernel /boot/vmlinuzversion ro root=/dev/sda
# initrd /boot/initrdversionimg
#boot=/dev/sda
default=
timeout=
splashimage=(hd)/boot/grub/splashxpmgz
title Red Hat Enterprise Linux AS (EL)
root (hd)
kernel /boot/vmlinuzEL ro root=LABEL=/
initrd /boot/initrdELimg
title Red Hat Enterprise Linux AS (EL)
root (hd)
kernel /boot/vmlinuzEL ro root=LABEL=/
initrd /boot/initrdELimg
修改完毕以后重新启动系统保证使用了新内核
# uname –a
Linux LinuxNode EL # Thu Apr :: EDT i i i GNU/Linux
安装Oracle ASMLib
下载ASMLib需要的三个文件
asmlib:/oracleasmlibirpm
asmsupport:/oracleasmsupportirpm
asmkernel:/oracleasmELirpm
如果是多处理器的版本那么可以下载下面这个文件替换上面的第三个文件
asmsmpkernel:/oracleasmELsmpirpm
安装
$su –
# rpm Uvh oracleasmsupportirpm \
oracleasmlibirpm \
oracleasmELirpm
配置ASMLib
# /etc/initd/oracleasm configure
Configuring the Oracle ASM library driver
This will configure the onboot 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 CtrlC 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 ]
以上操作将加载oracleasmo驱动并且mount上ASM文件系统同时我们可以通过以下命令来手工的卸载和加载ASMLib
# /etc/initd/oracleasm disable
Writing Oracle ASM library driver configuration [ OK ]
Unmounting ASMlib driver filesystem [ OK ]
Unloading module oracleasm [ OK ]
# /etc/initd/oracleasm enable
Writing Oracle ASM library driver configuration [ OK ]
Loading module oracleasm [ OK ]
Mounting ASMlib driver filesystem [ OK ]
Scanning system for ASM disks [ OK ]
如果当前操作系统的内核和编译ASMLib的内核不同那么上面的操作将会出错请检查/var/log/messages文件确认需要更新的系统内核版本
添加init文件使系统启动时自动加载ASMLib
$ su –
# cd /etc/rcd
# ln s /initd/oracleasm Soracleasm
# ln s /initd/oracleasm Koracleasm
注意如果系统启动是自动进入图形界面也就是系统的init level是那么上面生成链接的命令应该在/etc/rcd目录中操作
重新启动系统确认ASMLib已经可以自动加载
#lsmod | grep oracleasm
oracleasm
#dmesg | grep oracleasm
ASM: oracleasmfs mounted with options:
创建ASM磁盘
# /etc/initd/oracleasm createdisk VOL /dev/sdb
Marking disk /dev/sdb as an ASM disk [ OK ]
# /etc/initd/oracleasm createdisk VOL /dev/sdc
Marking disk /dev/sdc as an ASM disk [ OK ]
# /etc/initd/oracleasm createdisk VOL /dev/sdd
Marking disk /dev/sdd as an ASM disk [ OK ]
#/etc/initd/oracleasm createdisk VOL /dev/sde
Marking disk /dev/sde as an ASM disk [ OK ]
# /etc/initd/oracleasm listdisks
VOL
VOL
VOL
VOL
如果要删除ASM磁盘通过以下命令
# /etc/initd/oracleasm deletedisk VOL
Removing ASM disk VOL [ OK ]
注意如果是在RAC环境中的某一个节点中添加了ASM磁盘那么需要在其它的节点上运行scandisk来获取这种变化
# /etc/initd/oracleasm scandisks
Scanning system for ASM disks [ OK ]
详细的安装文档可以通过以下连接查看
现在我们已经完成了创建ASM实例的物理基础下面开始安装数据库
安装Oracle
g在RHEL上安装Oracleg已经是非常简单的操作了只要系统内核参数设置正确几乎不会碰到任何问题
从以下连接可以得到在RHEL上安装Oracleg的详细步骤本文不再赘述
在安装Oracleg的时候我们选择不创建数据库只安装软件的方式在软件安装结束以后再通过dbca来创建ASM实例和数据库
创建ASM实例
<![if !supportLists]>. <![endif]>创建初始化文件
$ su – oracle
$ cd $ORACLE_HOME/dbs
$ vi init+ASMora
创建asm实例的初始化脚本脚本内容如下所示
# ******Below is init script for asm instance******
*asm_diskstring=ORCL:VOL*
*background_dump_dest=/oracle/admin/+ASM/bdump
re_dump_dest=/oracle/admin/+ASM/cdump
*instance_type=asm
*large_pool_size=M
*remote_login_passwordfile=SHARED
*user_dump_dest=/oracle/admin/+ASM/udump
# ******Above is init script for asm instance******
说明
<![if !supportLists]>. <![endif]>dump目录指向$ORACLE_BASE/本文中ASM实例的SID是+ASM最好不要修改这个实例名否则在下一步用dbca创建数据库的时候dbca将找不到可用的磁盘组我想这应该是dbca的一个bug手工创建ASM类型的数据库就应该没有这个限制了
<![if !supportLists]>. <![endif]>asm_diskstring用于实例启动的时候检查可用的ASM磁盘由于我们前面创建ASM磁盘的名称是VOL到VOL所以我们此处使用*通配符前面的ORCL:不可以省略否则ASM实例将无法检查到磁盘
<![if !supportLists]>. <![endif]>创建密码文件
$ su – oracle
$ cd $ORACLE_HOME/dbs
$ orapwd file=orapw+ASM password=dba
<![if !supportLists]>. <![endif]>创建目录结构
$ su – oracle
$ cd $ORACLE_HOME/dbs
$ mkdir –p $ORALCE_BASE/admin/+ASM/udump
$ mkdir –p $ORALCE_BASE/admin/+ASM/bdump
$ mkdir –p $ORALCE_BASE/admin/+ASM/cdump
<![if !supportLists]>. <![endif]>启动实例
$ export ORACLE_SID=+ASM
$ sqlplus / as sysdba
SQL> startup
ASM instance started
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
ORA: no diskgroups mounted
因为我们是首次启动asm实例还没有创建diskgroup所以显示错误是正常的
如果启动实例的时候碰到如下报错
ORA: unable to connect to Cluster Manager
那么请检查/etc/inittab文件看看是否有下面这行
h::respawn:/etc/initd/initcssd run >/dev/null >&
如果没有请添加,如果被注释了请取消注释。Tw.WinGwiT.Com
<!--[if !supportLists]-->5. <!--[endif]-->创建spfile,重新启动
SQL> create spfile from pfile;
SQL> shutdown immediate;
SQL> startup;
<!--[if !supportLists]-->6. <!--[endif]-->创建diskgroup
SQL> create diskgroup dgroup1 normal redundancy
2 failgroup fgroup1 disk 'ORCL:VOL1','ORCL:VOL2'
3 failgroup fgroup2 disk 'ORCL:VOL3','ORCL:VOL4';
Diskgroup created.
SQL> col name for a10
SQL> select name,state from v$asm_diskgroup;
NAME STATE
---------- ----------------------
DGROUP1 MOUNTED
如果上述命令返回的state是DISMOUNTED,那么我们需要手工将挂载diskgroup
SQL> ALTER DISKGROUP dgroup1 MOUNT;
Diskgroup altered.
此时检查数据库初始化参数,发现asm_diskgroups参数值已经自动设置为DGROUP1,这表明在下次启动asm实例的时候,这个diskgroup会被自动挂载。
SQL> col name for a10
SQL> col type for a10
SQL> col value for a20
SQL> show parameter asm_diskgroups
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
asm_diskgroups string DGROUP1
如果要卸载diskgroup,使用下面的命令:
ALTER DISKGROUP ALL DISMOUNT;
创建ASM数据库
用dbca创建数据库,一直到选择数据类型的画面以前都跟创建普通数据库没有区别。
下面是dbca创建数据库的第6步画面,普通的数据库我们通常选择File System,而ASM类型的数据库我们则要选择“Automatic Storage Management”。
下一步,oracle将自动检查出已经加载的Diskgroup,在这个界面我们可以通过Create New按钮创建新的Diskgroup,也可以通过Add Disks按钮向当前的磁盘组中添加额外的磁盘,当然这些磁盘必须是先用oracleasm createdisk过的(在第4章节的创建ASM磁盘部分有所叙述)。
在数据文件的位置管理设定界面,通常应该使用OMF,由oracle自己管理数据文件的命名,这样才算是进一步解放了DBA对于物理存储方面的繁琐工作。
继续往下的步骤,跟创建普通数据库已经没有什么区别了。不再赘述。
启动ASM数据库的步骤
由于启动ASM数据库必须要先启动ASM实例,所以基本上启动步骤如下。
<!--[if !supportLists]-->1. <!--[endif]-->以oracle用户进入操作系统
<!--[if !supportLists]-->2. <!--[endif]-->$ export ORACLE_SID=+ASM
<!--[if !supportLists]-->3. <!--[endif]-->SQL> sqlplus / as sysdba
<!--[if !supportLists]-->4. <!--[endif]-->SQL> startup
<!--[if !supportLists]-->5. <!--[endif]-->SQL> exit
<!--[if !supportLists]-->6. <!--[endif]-->$ export ORACLE_SID=
<!--[if !supportLists]-->7. <!--[endif]-->SQL> sqlplus / as sysdba
<!--[if !supportLists]-->8. <!--[endif]-->SQL> startup
ASM数据库的简单测试
测试ASM数据库的automatic rebalance功能
添加两个虚拟硬盘,分别是sdf和sdg,大小500M
启动系统,启动ASM实例,启动数据库实例
创建ASM磁盘
#/etc/init.d/oracleasm createdisk VOL5 /dev/sdf
#/etc/init.d/oracleasm createdisk VOL6 /dev/sdg
登入ASM实例检查v$asm_disk视图,发现这两个新加的硬盘已经找到了
将硬盘添加到磁盘组中
SQL> ALTER DISKGROUP DGROUP1 ADD FAILGROUP FGROUP1 DISK 'ORCL:VOL5' FAILGROUP FGROUP2 DISK 'ORCL:VOL6';
Diskgroup altered.
检查数据库的auto rebalance工作进度,数据库正在将原来分布在两个磁盘上的数据平均分配到三个磁盘上
SQL> SELECT group_number, operation, state, est_work, sofar, est_rate, est_minutes FROM v$asm_operation;
GROUP_NUMBER OPERATION STATE EST_WORK SOFAR EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 416 0 0 0
SQL> /
GROUP_NUMBER OPERATION STATE EST_WORK SOFAR EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 275 39 148 1
SQL> /
以上表示数据重新分配的工作已经成功完成
SQL> select name,allocation_unit_size,total_mb from v$asm_diskgroup;
NAME ALLOCATION_UNIT_SIZE TOTAL_MB
------------------------------ -------------------- ----------
DGROUP1 1048576 5120
现在磁盘组空间总共是5120M
登入数据库实例
创建一个自己的表空间,创建一个用户,创建一个表
SQL> create tablespace ts_test datafile '+DGROUP1' size 200M;
Tablespace created.
SQL> create user kamus identified by pass default tablespace ts_test;
User created.
SQL> grant dba to kamus;
Grant succeeded.
SQL> conn kamus/pass
Connected.
SQL> create table t_test as select * from dba_objects;
Table created.
SQL> select count(*) from t_test;
COUNT(*)
----------
10319
登入ASM实例,将磁盘从磁盘组中删除
SQL> alter diskgroup dgroup1 drop disk VOL4;
Diskgroup altered.
SQL> SELECT group_number, operation, state, est_work, sofar, est_rate, est_minutes FROM v$asm_operation;
GROUP_NUMBER OPERATION STATE EST_WORK SOFAR EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 566 46 151 3
SQL> select name,allocation_unit_size,total_mb from v$asm_diskgroup;
NAME ALLOCATION_UNIT_SIZE TOTAL_MB
------------------------------ -------------------- ----------
DGROUP1 1048576 4096
Executed in 0.13 seconds
SQL> select label,failgroup from v$asm_disk;
LABEL FAILGROUP
------------------------------- ------------------------------
VOL1 FGROUP1
VOL2 FGROUP1
VOL3 FGROUP2
VOL5 FGROUP1
VOL6 FGROUP2
可以看到磁盘组的总容量已经减少了,磁盘数目也减少了
有些文档上说删除了磁盘之后要执行:ALTER DISKGROUP REBALANCE
但是发现不需要手动执行,整个REBALANCE的工作确实是自动的,当删除磁盘以后,数据库自动开始作REBALANCE了
为了两个FAILGROUP的大小相同,再删除一个磁盘
SQL> alter diskgroup dgroup1 drop disk VOL2;
Diskgroup altered.
我们可以从下面的SQL知道在ASM实例中可以查询到所有可以用的磁盘,而在数据库实例中只可以查询到让自己使用的磁盘
ASM实例:
SQL> SELECT disk_number, label FROM V$asm_disk;
DISK_NUMBER LABEL
----------- --------------------------------------------------------------
0 VOL4
1 VOL2
0 VOL1
2 VOL3
4 VOL5
5 VOL6
数据库实例:
SQL> SELECT disk_number, label FROM V$asm_disk;
DISK_NUMBER LABEL
----------- -------------------------------
0 VOL1
2 VOL3
4 VOL5
5 VOL6
总结
通过上面简单的测试,我们已经可以基本领略到ASM数据库在数据文件存储方面的强大功能,欢迎大家对于ASM数据库进行更深入的讨论。
如果有任何问题,可以到的Oracle
10g和新技术板块进行讨论,也可以给我发邮件,邮件地址: 。