在真正的海量数据库环境中,DBA可能会花费很多的时间来作磁盘管理,比如一个表空间将占满整个磁盘,DBA就需要再添加一块磁盘到操作系统中,然后再在新的磁盘上创建新的数据文件,如果是单个磁盘这倒不是很繁琐,问题是如果原先我们使用的是RAID或者说是LVM,那么现在大量的数据仍然是分布在以前的那些磁盘上,如果我们想让这些数据均匀地分布在以前的磁盘和新增加的磁盘上,我们可能就要耗费一天甚至几天的时间来作原先数据的导出导入。那么如果有一种方法,能实现我们就把一块磁盘加到系统里,然后告诉Oracle我们要用这块盘了,剩下的工作全部由Oracle来完成,该是多好的一件事情!幸运的是,Oracle
本文通过vmware安装RHEL3 + Oracle
IBM R50 5GC
迅驰
WindowsXP Pro SP1,VMware GSX Server
这一步就不多说了,我安装的是VMware GSX Server,没有测试过VMware Workstation,所以不保证可以实现本文中的步骤。
<!--[if !supportLists]-->1. <!--[endif]-->安装RHEL3
这个过程也不多说了,跟实际环境中安装RHEL3一样。值得注意的是,由于通过Vmware所以可能在安装时无法正常启动Xwindow,那么在字符界面下安装就可以了。安装完毕重新启动系统,Xwindow会自动启动的。记住安装所有的开发包即可,这将会尽量避免以后可能出现的link错误。我的测试环境中给了RHEL3总共
<!--[if !supportLists]-->2. <!--[endif]-->添加4块虚拟磁盘
按照如下操作,在虚拟机的属性中选择添加硬件,然后添加一个Virtual Disk
下一步,由于我们创建的虚拟磁盘只是用来放置Oracle的数据文件,而且我们将使用ASM中的failgroup的条带功能,所以设置最大size是
下一步,指定虚拟磁盘文件的名称和存放位置,默认存放在虚拟机的相同目录下。这里我们指定文件名为physical1
点击Advanced按钮,设置虚拟磁盘的物理挂载点,通常我们选择和虚拟机已有的系统盘在不同的SCSI端口上,比如我们虚拟机的系统盘是SCSI0:0,那么就设置这个磁盘为SCSI1:0。即将添加的另外三块磁盘依次为SCSI1:1、SCSI1:2和SCSI1:3
由于Virtual Disk的特点,在新创建这个磁盘文件的时候,并不会用到最大的size,所以即使整个分区的空闲容量没有
<!--[if !supportLists]-->3. <!--[endif]-->更新内核
>uname -a
RHEL3默认安装的linux内核版本是
原因是我们安装的oracleasmlib是已经编译好的rpm包,而我们当前操作系统的内核必须和编译时候的系统内核版本一样,否则即使看上去安装正常,但是在启动oracleasm时候会在/var/log/messages文件中发现类似如下的报错信息:
kernel-module version mismatch
^I/lib/modules/
从这个报错信息中我们也可以知道应该安装的内核版本,为了更确切地知道下载的oracleasm包需要哪个版本的内核,我们也可以先下载oracleasm,安装,启动然后查看这个报错信息,之后再升级内核到相应的版本。
注意:本文中提到的
下载新内核:
kernel-2.4.21-15.EL.i686: http://public.planetmirror.com/pub/pmstuff/patches/kernel-2.4.21-15.EL.i686.rpm
安装新内核:
# rpm –ivh –-nodeps kernel-2.4.21-15.EL.i686.rpm
安装完毕以后,修改/boot/grub/grub.conf,rpm安装完毕以后,应该已经自动在grub.conf文件中添加了新版kernel启动的段落,我们需要将default=1修改为default=0,这样保证每次启动都用新的内核启动,当测试没有问题之后,我们也可以直接删除grub.conf文件中的title Red Hat Enterprise Linux AS (
# cat /boot/grub/grub.conf
# grub.conf 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 (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Red Hat Enterprise Linux AS (
root (hd0,0)
kernel /boot/vmlinuz-
initrd /boot/initrd-
title Red Hat Enterprise Linux AS (
root (hd0,0)
kernel /boot/vmlinuz-
initrd /boot/initrd-
修改完毕以后,重新启动系统,保证使用了新内核
# uname –a
Linux LinuxNode1
下载ASMLib需要的三个文件:
asmlib:http://otn.oracle.com/software/tech/linux/asmlib/files/RPMS/rhel3/x86/oracleasmlib-1.0.0-1.i386.rpm
asm-support:http://otn.oracle.com/software/tech/linux/asmlib/files/RPMS/rhel3/x86/oracleasm-support-1.0.2-1.i386.rpm
asm-kernel:http://otn.oracle.com/software/tech/linux/asmlib/files/RPMS/rhel3/x86/oracleasm-2.4.21-EL-1.0.0-1.i686.rpm
如果是多处理器的版本,那么可以下载下面这个文件替换上面的第三个文件:
asm-smp-kernel:http://otn.oracle.com/software/tech/linux/asmlib/files/RPMS/rhel3/x86/oracleasm-2.4.21-EL-smp-1.0.0-1.i686.rpm
安装:
$su –
# rpm -Uvh oracleasm-support-
oracleasm-lib-
oracleasm-
配置ASMLib:
# /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 ]
以上操作将加载oracleasm.o驱动,并且mount上ASM文件系统,同时我们可以通过以下命令来手工的卸载和加载ASMLib
# /etc/init.d/oracleasm disable
Writing Oracle ASM library driver configuration [ OK ]
Unmounting ASMlib driver filesystem [ OK ]
Unloading module "oracleasm" [ OK ]
# /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 ]
如果当前操作系统的内核和编译ASMLib的内核不同,那么上面的操作将会出错,请检查/var/log/messages文件,确认需要更新的系统内核版本。
添加init文件使系统启动时自动加载ASMLib
$ su –
# cd /etc/rc3.d
# ln -s ../init.d/oracleasm S99oracleasm
# ln -s ../init.d/oracleasm K01oracleasm
注意:如果系统启动是自动进入图形界面,也就是系统的init level是5,那么上面生成链接的命令应该在/etc/rc5.d目录中操作。
重新启动系统,确认ASMLib已经可以自动加载
#lsmod | grep oracleasm
oracleasm 14224 1
#dmesg | grep oracleasm
ASM: oracleasmfs mounted with options:
创建ASM磁盘
# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb
Marking disk "/dev/sdb" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL2 /dev/sdc
Marking disk "/dev/sdc" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL3 /dev/sdd
Marking disk "/dev/sdd" as an ASM disk [ OK ]
#/etc/init.d/oracleasm createdisk VOL4 /dev/sde
Marking disk "/dev/sde" as an ASM disk [ OK ]
# /etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
如果要删除ASM磁盘通过以下命令:
# /etc/init.d/oracleasm deletedisk VOL4
Removing ASM disk "VOL4" [ OK ]
注意:如果是在RAC环境中的某一个节点中添加了ASM磁盘,那么需要在其它的节点上运行scandisk来获取这种变化。
# /etc/init.d/oracleasm scandisks
Scanning system for ASM disks [ OK ]
详细的安装文档可以通过以下连接查看:
http://otn.oracle.com/tech/linux/asmlib/install.html
现在我们已经完成了创建ASM实例的物理基础,下面开始安装数据库。
在RHEL3上安装Oracle
从以下连接可以得到在RHEL3上安装Oracle
http://www.puschitz.com/InstallingOracle10g.shtml
在安装Oracle
<!--[if !supportLists]-->1. <!--[endif]-->创建初始化文件
$ su – oracle
$ cd $ORACLE_HOME/dbs
$ vi init+ASM.ora
创建asm实例的初始化脚本,脚本内容如下所示:
# ******Below is init script for asm instance******
*.asm_diskstring='ORCL:VOL*'
*.background_dump_dest='/oracle/admin/+ASM/bdump'
*.core_dump_dest='/oracle/admin/+ASM/cdump'
*.instance_type='asm'
*.large_pool_size=
*.remote_login_passwordfile='SHARED'
*.user_dump_dest='/oracle/admin/+ASM/udump'
# ******Above is init script for asm instance******
说明:
<!--[if !supportLists]-->1. <!--[endif]-->dump目录指向$ORACLE_BASE/
<!--[if !supportLists]-->2. <!--[endif]-->asm_diskstring用于实例启动的时候检查可用的ASM磁盘,由于我们前面创建ASM磁盘的名称是VOL1到VOL4,所以我们此处使用*通配符,前面的’ORCL:’不可以省略,否则ASM实例将无法检查到磁盘。
<!--[if !supportLists]-->2. <!--[endif]-->创建密码文件
$ su – oracle
$ cd $ORACLE_HOME/dbs
$ orapwd file=orapw+ASM password=dba
<!--[if !supportLists]-->3. <!--[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]-->4. <!--[endif]-->启动实例
$ export ORACLE_SID=+ASM
$ sqlplus / as sysdba
SQL> startup
ASM instance started
Total System Global Area 100663296 bytes
Fixed Size 777616 bytes
Variable Size 99885680 bytes
Database Buffers 0 bytes
Redo Buffers 0 bytes
ORA-15110: no diskgroups mounted
因为我们是首次启动asm实例,还没有创建diskgroup,所以显示15110错误是正常的。
如果启动实例的时候碰到如下报错:
ORA-29701: unable to connect to Cluster Manager
那么请检查/etc/inittab文件,看看是否有下面这行
h1:35:respawn:/etc/init.d/init.cssd run >/dev/null 2>&1
如果没有请添加,如果被注释了请取消注释。
<!--[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;