第五部分 安装配置Oracle RAC
5.1 配置环境变量
5.1.1 编辑.bashrc设置 ORACLE_BASE 和 ORACLE_HOME 等环境变量
基本路径:
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
ORA_CRS_HOME=/u01/crs/oracle/product/10.2.0/crs_1
据oracle的安装文档要求,CRS的目录最好不是ORACLE_BASE的子目录,因为安装过程中会改变CRS的父目录的权限,这会影响ORACLE的安装。在按以上要求生成对应目录之前,需检查所在磁盘的空间是否满足安装要求,确定之后生成目录,并将相关环境变量设置在oracle用户的profile中。用oracle帐号编辑 /home/oracle/.bashrc
oracle用户的profile文件.bashrc内容:
# .bashrc
# User specific aliases and functions
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORA_CRS_HOME=/u01/crs/oracle/product/10.2.0/crs_1
export ORACLE_SID=dbrac1
export ORACLE_TERM=xterm
export LD_ASSUME_KERNEL=2.4.1
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:$ORA_CRS_HOME/bin:/sbin
export PATH
然后执行
$ source .bash_profile
使环境变量生效
注意:ORACLE_SID每台机器不一样,如dbrac1的SID为dbrac1,dbrac2的SID为dbrac2,以此类推。
对LD_ASSUME_KERNEL环境变量的说明:
这个参数实际上是为了避免Linux上的 NPTL (Native POSIX Thread Library) 和Oracle应用不兼容的问题. 设定 LD_ASSUME_KERNEL为2.4.1表示使用旧有的 "Linuxthreads with floating stacks"
5.1.2创建CRS安装路径
注:With Oracle Database 10g Release 2 (10.2), Cluster Ready Services, or CRS, is now called Oracle Clusterware . 见ORACLE 10.2 安装文档之New Features for Oracle Clusterware and RAC Installation
1.CRS安装路径的创建及授权
如下所示:
# mkdir -p /u01/crs/oracle/product/10.2.0/crs_1
# chown -R oracle:oinstall /u01/crs/oracle
# chmod -R 775 /u01/crs/oracle
2.OCR及voting disk安装路径
先解释一下ocr(sdb1)和vote(sdb2)文件的用途,
OCR(Oracle Cluster Registry):它记录了机群配置和机群数据库的基本配置,默认大概需要100M的空间,这里我们给了它1000M的空间;
Vote:它是CSS(Cluster Synchronization Services)需要的文件,用来判断机群内各个节点的状态,默认大概也需要100M的空间,这里我们也给了它1000M的空间。
# mkdir -p /u02/oracrs/
# chown -R oracle:oinstall /u02/oracrs/
# chmod -R 775 /u02/oracrs/
绑定裸设备:
#raw /dev/raw/raw1 /dev/sdb1
#raw /dev/raw/raw2 /dev/sdb2
然后在/etc/sysconfig/rawdevices文件里加如下内容:
/dev/raw/raw1 /dev/sdb1
/dev/raw/raw2 /dev/sdb2
权限:
# chown root:oinstall /dev/raw/raw1
# chmod 640 /dev/raw/raw1
# chown oracle:dba /dev/raw/raw2
# chmod 660 /dev/raw/raw2
在/etc/rc.local里加如下内容(如果安装软件时出问题,则把root改为oracle)
chown root:oinstall /dev/raw/raw1
chmod 640 /dev/raw/raw1
chown oracle:dba /dev/raw/raw2
chmod 660 /dev/raw/raw2
以上操作在所有节点上执行
在安装CRS的过程中,安装程序会提示用户输入存放OCR和Vote文件的位置。因此,通常我们会使用以下方法设置文件位置(在所有节点上执行),以oracle用户执行:
$ ln -s /dev/raw/raw1 /u02/oracrs/ocr.crs
$ ln -s /dev/raw/raw2 /u02/oracrs/vote.crs
5.1.3创建oracle安装路径
# mkdir -p /u01/app/oracle
# chown -R oracle:oinstall /u01/app/oracle
# chmod -R 775 /u01/app/oracle
5.2安装和卸载CRS
5.2.1安装CRS
需要注意的问题:
1、每一步都要看清楚安装路径是否正确
2、分清虚拟地址和专用地址
3、脚本要一个节点一个节点的执行,切不可同时执行
4、如果安装过程中出现in future。。。之类错误,应为两台主机时间不一致导致,解决方法:
1〉用root执行net time –I TARGETIP命令同步
2〉如果net time同步仍然不成功,最好配置一台服务器(节点中的一台为ntp服务器),具体配置方法见后面附录
在安装CRS之前,确认显示没有问题:
# xhost +
解压CRS软件:
# cp 10201_clusterware_linux_x86_64.cpio.gz /home/oracle
# gzip –d 10201_clusterware_linux_x86_64.cpio.gz
# cpio –idmv < 10201_clusterware_linux_x86_64.cpio
# chown –R oracle:oinstall /home/oracle
# su oracle
切换到oracle用户,建立安装目录(该命令需要在各个节点上执行)
$ mkdir –p /u01/app/oracle/oraInventory
进入解压路径/home/oracle/cluterware执行(在集群的一个节点上执行):
$ ./runInstall
进入图形配置界面:
1.Welcome;单击 Next
2.Specify Inventory Directory and Credentials — 默认值应该就是正确的;确保 inventory 目录位于 ORACLE_BASE 目录中(例如: /u01/app/oracle/oraInventory)并且操作系统组是“oinstall”(确保在 /etc/hosts 中而不仅仅是在 DNS 中配置了您的主机)
3.Specify File Locations — 修改安装路径/u01/app/oracle/product/10.2.0/db_1为/u01/crs/oracle/product/10.2.0/crs_1
4.Language Selection — 确认默认值后继续
5.Cluster Configuration — 输入集群名(或接受默认的“crs”);配置public和private地址时,public地址即为主机名(与hostname命令所示相同即可),注意大小写;private地址即为ip,与/etc/hosts中所列相同,virtual 地址填写/etc/hosts中virtual address对应的主机名
6.Private Interconnect Enforcement — 为每个接口指定接口类型(公共、专用或“不使用”)
7.Oracle Cluster Registry — 选择外部冗余 在 clusterSpecify OCR Location 中输入ocr disk名:/u02/oracrs/ocr.crs
8.Voting Disk — 输入 voting disk 名: /u02/oracrs/vote.crs
9.Summary —单击 Install,开始安装。在安装到最后的时候又会弹出对话框,提示分别在各节点上以root执行orainstRoot.sh和root.sh。注意不要同时运行这些脚本,等一个脚本结束后再运行另一个。
执行最后一个root.sh的时候,可能会报""eth0" is not public.Public interfaces should be used to configure virtual IPs."这样的错误.这时候需要以root用户去执行$ORA_CRS_HOME/bin/vipca。起来图形界面——next——Network Interfaces (只选择用于公共网络的接口,本示例中为eth0,集群中所有主机上的这个接口必须相同,即如果在安装主机上该接口是eth0,则在集群中所有其他主机上都必须是eth0)。——Virtual IPs for cluster nodes 在vipca的提示框中输入/etc/hosts中事先定义的虚拟ip地址,vipca会自动将虚拟ip对应的hostname显示出来。VIP 配置助手创建并启动 VIP、GSD 和 ONS 应用程序资源。配置完毕后,oracle会自动为public网卡绑定虚拟地址。
在vipca配置完毕后,最好做一下关于vip地址的用户等效性。如执行
# ssh dbrac2-vip
提示后,输入yes。
CRS 安装结束
从 $ORACLE_BASE/product/10.2.0/crs_1/bin 目录中运行 olsnodes 验证安装已成功;例如:
$ cd $ORACLE_BASE/product/10.2.0/crs_1/bin
$ olsnodes
dbrac1
dbrac2
Once CRS 已安装并运行;现在可以安装 Oracle RAC 软件的其余部分了。
5.2.2卸载CRS
如果我们安装CRS出现了问题,就必须要卸载CRS了。而CRS是一个很令人头疼的服务,卸载CRS也是一个非常繁琐的工作。在目前的release1中,如果机群中的一个节点重启(无论什么原因,即使crs服务是正常的),机群中的所有节点都会随之重启。因为CSS服务会定期检查机群中所有节点的服务可用性,当有一个节点出现问题,系统为了保证数据一致性,就会令其他节点重启,重新检查服务,直到所有节点服务都正常。但是就我们现在遇到的情况而言,这种重启后自动回复正常的情况极少(目前还没有自动恢复过),经常会导致loopreboot。因此,在metalink上有很多关于这方面的介绍。这里,作者将实战经验与网上经验相结合,总结如下(目前的方法就是卸载所有oracle服务和CRS,然后重装)。
1.阻止循环重启的方法
方法一:将CRS服务禁止
在机器重启之间的那几秒中检测时间内,执行
# /etc/init.d/init.crs disable
禁止crs服务,在下一此重启后,系统将停止循环,但是要把握操作时机。
方法二:拔掉与共享设备的连线
ocr和voting disk文件是存放在共享设备中的,而CSS进程每次都要从这些文件中读取机群的配置信息,因此,在机器重启时断掉与共享设备的连接,机器也将停止循环重启。该方法操作简单,但是由于读取数据不完整,对于接下来的修复可能会带来一些不便。
方法三:改写启动脚本
将/etc/inittab中的最后三行注释掉,如:
#h1:35:respawn:/etc/init.d/init.evmd run >/dev/null 2>&1 </dev/null
#h2:35:respawn:/etc/init.d/init.cssd fatal >/dev/null 2>&1 </dev/null
#h3:35:respawn:/etc/init.d/init.crsd run >/dev/null 2>&1 </dev/null
令机器在下一次重启时,不在启动服务。该方法的操作时机要把握好,否则没等文件修改完毕,机器就又要重启。
2.在机群中的所有节点上执行$ORA_CRS_HOME/install/rootdelete.sh;
3.在机群中的任意一个节点上执行$ORA_CRS_HOME/install/rootdeinstall.sh;
4.用图形界面OUI卸载crs;
a)执行./runInstall
b)在界面中选择Installed;
c)选择home1,一般要先安装CRS,所以CRS的home一般都是home。
5.在机群所有节点上执行
/bin/rm -f /etc/init.d/init.cssd
/bin/rm -f /etc/init.d/init.crs
/bin/rm -f /etc/init.d/init.crsd
/bin/rm -f /etc/init.d/init.evmd
/bin/rm -f /etc/rc2.d/K96init.crs
/bin/rm -f /etc/rc2.d/S96init.crs
/bin/rm -f /etc/rc3.d/K96init.crs
/bin/rm -f /etc/rc3.d/S96init.crs
/bin/rm -f /etc/rc5.d/K96init.crs
/bin/rm -f /etc/rc5.d/S96init.crs
/bin/rm -rf /etc/oracle
/bin/rm -f /etc/inittab.crs
/bin/rm -f /etc/oratab
/bin/rm -f /etc/oraInst.loc
/bin/cp /etc/inittab.orig /etc/inittab
/bin/rm -rf /var/tmp/.oracle
/bin/rm -rf /u01/crs/oracle/product/10.1.0/crs_1
6.清掉共享磁盘上的内容。
如果ocr和voting disk所在分区不大,可以直接用下面命令清除:
# dd if=/dev/zero of=/dev/sdb1
# dd if=/dev/zero of=/dev/sdb2
7.如果可以,重启机群内所有节点。
8.清理干净后,按照5.2.1的介绍,重新安装CRS。
5.3安装 Oracle 数据库软件RAC
5.3.1 图形界面配置
执行以下命令(在集群的一个节点上):
# cp 10201_database_linux_x86_64.cpio.gz /home/oracle
# cd /home/oracle
# gzip –d 10201_database_linux_x86_64.cpio.gz
# cpio –idmv < 10201_database_linux_x86_64.cpio.gz
# cd /home/oracle/database
# su oracle
$ ./runInstall
启动图形界面
1.Welcome — 单击 Next
2.Specify File Locations — 确认默认值后继续
3.Specify Hardware Cluster Installation Mode — 选择 Cluster Installation 并选择集群中的其他节点
4.Select Installation Type — Enterprise Edition
5.选择数据库配置 — 选择“Do not create a starter database”。 (我们将在一个单独的步骤中使用数据库配置助手 (DBCA) 来创建数据库。)在安装到最后的时候又会弹出对话框,提示执行root.sh,这时从安装节点开始,每次在一个节点上运行 Oracle主目录中的 root.sh(例如: /u01/app/oracle/product/10.2.0/db_1/root.sh)。 不要同时运行这些脚本。 等一个脚本结束后再启动另一个.
6.Configuration Results — 检查结果并单击 Exit。 在其他节点上依次运行 root.sh。
7.安装结束
注意:在 安装 到 65%时,有一个错误:
信息: 终止从衍生进程输出。
信息: ----------------------------------
信息: 操作中出现异常错误: make
异常错误名: MakefileException
异常错误字符串: 调用 makefile '/oracle/product/10.2.0/db_1/rdbms/lib/ins_rdbms.mk' 的目标 'all_no_orcl' 时出错。请参阅 '/oracle/oraInventory/logs/installActions2005-12-29_10-44-31AM.log' 以了解详细信息。
异常错误严重级: 1
需要binutils-2.15.92.0.2-13.0.0.0.2.x86_64.rpm补丁
并用root用户 按以下语法安装:
# rpm -Uvh --force binutils-2.15.92.0.2-13.0.0.0.2.x86_64.rpm
安装完给补丁后,点重试,oracle顺利的安装完成
5.4 卸载 Oracle 数据库软件RAC
如果我们安装RAC出现了问题,就必须要卸载RAC了。
1.停止database的一些活动;
2.通过oui卸载RAC
3.如果想卸载的再干净一点,可以清空db_1下的所有内容。
4.由于$ORACLE_BASE/Orainventory记录了所有oracle软件的安装信息,所以一般不建议删除,否则包括CRS等信息也会被删掉。
第六部分 创建和删除数据库
6.1 创建数据库
在以 oracle 用户身份登录时,设置环境并运行 dbca。
$ dbca
图形界面起来以后:
1.Welcome — 选择“Oracle Real Application Clusters database”
2.Operations — 创建数据库
3.Node Selection — 单击 Select All
4.Database Templates — 选择general
5.Database Identification — 全局数据库名:dbrac.orademo.org;SID: dbrac
6.Management Options — 利用 Enterprise Manager 配置数据库;使用数据库控制进行数据库管理
7.Database Credentials — 为所有帐户使用相同的口令;输入口令并再次确认
8.Storage Options — 自动存储管理 (ASM)
9.Create ASM Instance — 设置 SYS 口令并确认;创建初始化参数文件 (IFILE)
10.ASM Disk Groups — Create New>Create Disk Group>Disk Group Name (DATA);冗余(external);更改磁盘发现路径(ORCL:* — 即使磁盘显示为已供应状态,仍然必须输入此项,否则会出错);选择磁盘;输入故障组名;选择新创建的磁盘组
11.Database File Locations — 使用 Oracle 管理的文件
12.Recovery Configuration — 单击 Next
13.Database Content — 示例模式
14.Initialization Parameters — 内存:把默认的40%改为60%;字符集的设定:要选择ZHSGBK16和UTF8。
15.Database Storage — 单击 Next
16.Create Options — 选择“Create Database”
17.Summary — 检查总结信息并单击 OK
根据经验,需要注意的有几下几点:
1.使用ASM管理共享磁盘的方法,将为数据库中的每个节点创建自己的ASM实例。如果系统中已存在ASM实例,可以继续使用,但需要输入ASM的管理密码;
2.使用ASM需要创建ASM DiskGroup,如果磁盘组存在,则可以选用现有的组;如果不存在,要创建一个。
a)点击“create new”,输入磁盘组的名称;
b)冗余程度。如果你的盘阵本身有raid保护,则可以选择external,这样的空间利用率最大;否则,normal的利用率是一半,因为是两个failure group做镜像;high的利用率是三分之一,因为是三个failure group做镜像;
c)磁盘候选。分为“show member”和“show all”两种,第一种显示尚未分配的磁盘,第二种显示所有磁盘。有时虽然已经删掉了以前的数据库,但是没有删掉磁盘组,所以磁盘仍会显示为已用,这是就需要show all。切记,一定要修改磁盘路径为ORCL:*,否则即使选中也会被视为无效。如果想选择那些已经被其他组用过的盘,则需要选择force,强制执行。
3.创建DB过程中会报错,点击确定即可。随后dbca会自动启动各个节点的instance,但是除了安装节点的正常,其他的都会报错。这是因为创建的ASM DiskGroup的时候,其他节点的ASM实例没有mount磁盘组。因此需要在其他节点上执行一下命令:
# srvctl stop asm –n hostname
# srvctl start asm –n hostname
# srvctl start instance –I instance_name on hostname–d database_name
最后用命令
# srvctl status database –d database_name
检查,是否所有节点的instance都已经running。
6.2 删除数据库
删除数据库最好也用dbca,虽然srvctl也可以。
1.运行dbca,选择”delete a database”。然后就next..,直到finish。
2.数据的删除并不影响asm实例,如果想删除与asm有关的内容,可以按如下做法:
# export ORACLE_SID=ASM_instance_name
# sqlplus / as sysdba
SQL> drop diskgroup diskgroup_name including contents;
SQL> quit
然后在各个节点上执行
# srvctl stop asm –n hostname
# srvctl remove asm –n hostname
这样,应该就可以删除的比较干净了。
Lsnrctl start
6.3 验证数据库安装正确
$su oracle
$sqlplus /nolog
>connect / as sysdba
Connected
>startup
ORA-01081:cannot start already-running ORACLE –shut it down first ---说明数据库已经运行
>connect system/oracle@dbrac1
Connected
>connect system/oracle@dbrac2
Connected
两个节点提示connected说明数据库在两个节点上正常运行。
6.4 数据库troubleshooting
重起后出现问题:
#su - oracle
$ srvctl status nodeapps –n dbrac1
VIP is running on node: dbrac1
GSD is not running on node: dbrac1
Listener is not running on node: dbrac1
ONS daemon is not running on node: dbrac1
$ srvctl status nodeapps –n dbrac2
VIP is running on node: dbrac2
GSD is not running on node: dbrac2
Listener is not running on node: dbrac2
ONS daemon is not running on node: dbrac2
暂时解决办法:
在各节点上分别:
# /etc/init.d/oracleasm enable
#/etc/init.d/oracleasm scandisks
然后在主节点上运行:
#su - oracle
$crs_stop -all
$srvctl stop nodeapps -n dbrac1
$srvctl stop nodeapps -n dbrac2
$srvctl start nodeapps -n dbrac1
$srvctl start nodeapps -n dbrac2
$crs_start -all
$srvctl start database -d dbrac
为什么呢……….
第七部分 附录
7.1 CRS进程介绍
CRS 维护着两个文件: Oracle Cluster Registry (OCR) 和 Voting Disk。 OCR 和 Voting Disk 必须以原始分区或集群文件系统文件的形式存在于共享磁盘上。
在以前的版本中,Oracle RAC必须借助第三方Cluster软件,但是从Oracle10g开始,我们有了新的选择。CRS就是这样一个替代产品,用以提供RAC环境中的群集服务。
CRS是一个单独的产品,在构建RAC环境中,需要单独安装。
系统启动以后,CRS会自动启动,启动主要由/etc/init.d中的几个脚本完成:
[eygle@raclinux1 init.d]$ ll init*
-r-xr-xr-x 1 root root 1951 Jun 27 13:27 init.crs
-r-xr-xr-x 1 root root 4735 Jun 27 20:32 init.crsd
-r-xr-xr-x 1 root root 35401 Jun 27 13:27 init.cssd
-r-xr-xr-x 1 root root 3197 Jun 27 13:27 init.evmd
CRS启动的三个主要的后台进程为:
[oracle@raclinux1 bin]$ ps -ef|grep d.bin
root 3140 1 0 23:13 00:00:00 /u01/app/oracle/product/10.2.0/crs/bin/crsd.bin
oracle 3884 3062 0 23:14 00:00:00 /u01/app/oracle/product/10.2.0/crs/bin/evmd.bin
oracle 4017 3983 0 23:14 00:00:00 /u01/app/oracle/product/10.2.0/crs/bin/ocssd.bin
oracle 21117 13799 0 23:29 pts/1 00:00:00 grep d.bin
这几个进程的主要作用如下:
CRSD:
- Engine for HA operation
- Manages 'application resources'
- Starts, stops, and fails 'application resources' over
- Spawns separate 'actions' to start/stop/check application resources
- Maintains configuration profiles in the OCR (Oracle Configuration Repository)
- Stores current known state in the OCR.
- Runs as root
- Is restarted automatically on failure
OCSSD:
- OCSSD is part of RAC and Single Instance with ASM
- Provides access to node membership
- Provides group services
- Provides basic cluster locking
- Integrates with existing vendor clusteware, when present
- Can also runs without integration to vendor clustware
- Runs as Oracle.
- Failure exit causes machine reboot.
--- This is a feature to prevent data corruption in event of a split brain.
注意,ocssd进程在单实例ASM系统中也可以见到,以下是我的一个单实例ASM系统,ocssd进程同样存在:
bash-2.03# ps -ef|grep _+ASM
oracle 3264 1 0 Aug 25 ? 0:01 asm_lgwr_+ASM
root 12669 8167 0 11:58:56 pts/1 0:00 grep _+ASM
oracle 3270 1 0 Aug 25 ? 0:00 asm_rbal_+ASM
oracle 3266 1 0 Aug 25 ? 0:05 asm_ckpt_+ASM
oracle 3268 1 0 Aug 25 ? 0:00 asm_smon_+ASM
oracle 3262 1 0 Aug 25 ? 0:00 asm_dbw0_+ASM
oracle 3258 1 0 Aug 25 ? 0:00 asm_pmon_+ASM
oracle 3260 1 0 Aug 25 ? 0:00 asm_mman_+ASM
bash-2.03# ps -ef|grep ocssd
root 12672 8167 0 11:59:01 pts/1 0:00 grep ocssd
oracle 5374 1 0 Apr 07 ? 0:01 /opt/oracle/product/10.2.0/bin/ocssd.bin
bash-2.03#
ocssd进程非常重要,如果该进程异常中止,会导致系统crash。
在某些极端情况下,如果ocssd无法正常启动,会导致操作系统循环重启。这时候需要DBA介入进行一些特殊处理。
EVMD:
- Generates events when things happen
- Spawns a permanent child evmlogger
- Evmlogger, on demand, spawns children
- Scans callout directory and invokes callouts.
- Runs as Oracle.
- Restarted automatically on failure
我们可以通过CRS工具来查看CRS状态:
[oracle@raclinux1 ~]$ cd $ORA_CRS_HOME/bin
[oracle@raclinux1 bin]$ pwd
/u01/app/oracle/product/10.2.0/crs/bin
[oracle@raclinux1 bin]$ ./crs_stat
NAME=ora.RACDB.RACDB1.inst
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1
NAME=ora.RACDB.RACDB2.inst
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1
NAME=ora.RACDB.db
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1
NAME=ora.raclinux1.ASM1.asm
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1
NAME=ora.raclinux1.LISTENER2_RACLINUX1.lsnr
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1
NAME=ora.raclinux1.LISTENER_RACLINUX1.lsnr
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1
NAME=ora.raclinux1.gsd
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1
NAME=ora.raclinux1.ons
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1
NAME=ora.raclinux1.vip
TYPE=application
TARGET=ONLINE
STATE=ONLINE on raclinux1