在RHEL 3 的单机上安装oracle9i RAC(zt)

发表于:2007-07-04来源:作者:点击数: 标签:
在RHEL3的单机上安装oracle9iRAC 这两天闲来无事,想起不久前看到文章说可以在单机上安装Oracle9iRac,就到处找资料,想自己装来玩玩.将过程和心得贴出来,与大家分享. 安装过程中参考的文章: http://chinaunix.net/jh/19/119236.html 在建立数据库以后,启动第二

在RHEL 3 的单机上安装oracle9i RAC 

这两天闲来无事,想起不久前看到文章说可以在单机上安装Oracle9i Rac,就到处找资料,想自己装来玩玩.将过程和心得贴出来,与大家分享. 

安装过程中参考的文章: 
http://chinaunix.net/jh/19/119236.html 
在建立数据库以后,启动第二个实例时,参考了作者的做法,在此对作者表示感谢! 

安装过程中参考的官方安装文档,RAC_1030.pdf.英文的,而且不是单机,但有很大的参考价值,因此当附件传上来. 

安装开始前,请先参考在<RHEL3上安装Oracle9.2.0>. 
http://www.itpub.net/showthread.php?threadid=171693 
补丁包和环境变量的设置,请看此文. 


1.安装 Oracle Cluster Manager 9.2.0 

安装环境和变量的设置请看上文中的1-5节. 

注意: 
如果以前没有打过补丁3006845,则需要打.如果已经打过了,则不需要再打. 


首先生成一个Quorum Disk File.在多节点RAC中,需要是一个裸设备或是在OCFS文件系统上. 但因为我们是单机,因此可以随便指定一个文件.用命令来生成: 
$ dd if=/dev/zero of=/u02/rac/RacFile bs=1024 count=1024 
我看metalink上的文章说这个文件至少要4+(4*number_of_node)KB,我给了1M,足够了. 


然后到Disk1下运行runInstaller.出现产品选择界面时,选择 'Oracle Cluster Manager 9.2.0.1.0' 

出现'Public Node Information'时,填入本机的hostname. 就是hostname命令返回的值,注意,不要将后面的域也填进去了! 不能包含'.'字符. 
因为是单机,所以只填一个 

出现'Private Node Information'时,也填本机hostname. 

出现watchdog 参数时,接受缺省值.在升级到9.2.0.4后,不会用watchdog. 

出现Quorum Disk Information选项时,填刚才生成的文件名/u02/rac/RacFile 

然后就可以安装了. 
装完以后,退出安装界面,不要安装数据库软件. 


2.打补丁到 OCM 9.2.0.4 

需要先打OCM的补丁.我第一次装的时候,先装了数据库软件,然后升级OCM,然后打数据库的补丁.但打数据库的补丁时,因为没有出现选择节点的画面,让我误认为OCM升级失败,只得将软件全部删掉重新装. 

但先打OCM的补丁,打数据库软件的补丁时,也没有出现选择节点的画面,我硬着头皮装下去,结果能正确将补丁打上.不知道在多节点集群环境中,是不是也不出现选择节点的画面. 

将补丁包解开,运行runInstaller,打补丁 OCM 9.2.0.4 . 
过程跟安装OCM 9.2.0.1类似.

 vipcui 回复于:2004-06-02 12:57:00
3.配置RAC,并启动 

OCM9.2.0.4使用hangcheck-timer来代替watchdog,因此手工修改配置文件和启动文件. 
先检查模块是否已经安装,看这个文件是否存在: 
/lib/modules/2.4.21-4.EL/kernel/drivers/char/hangcheck-timer.o 
如果不存在,则需要安装. 

因为我的系统中,有这个文件,我就没有去找这个文件到底在哪个包中,所以,我也不知道该装哪个包! 


配置内核模块,使用hangcheck-timer代替watchdog: 
# lsmod │ grep watchdog 
应该没有输出.否则使用 
# rmmod 命令去掉这个模块. 

然后加载hangcheck-timer模块 
# insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180 
Using /lib/modules/2.4.21-4.EL/kernel/drivers/char/hangcheck-timer.o 

确认模块已经加载: 
# lsmod │ grep hang 
hangcheck-timer 2648 0 (unused) 

使系统一启动就加载这个模块,需要在/etc/rc.local文件最后加入一行: 
/sbin/insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180 


修改配置文件和启动文件: 

$ORACLE_HOME/oracm/bin/ocmstart.sh 
启动命令行.将所有有关watchdog的行全部注释掉.将这几行注释为以下的样子: 

# watchdogd's default log file 
# WATCHDOGD_LOG_FILE=$ORACLE_HOME/oracm/log/wdd.log 

# watchdogd's default backup file 
# WATCHDOGD_BAK_FILE=$ORACLE_HOME/oracm/log/wdd.log.bak 

# Get arguments 
# watchdogd_args=`grep '^watchdogd' $OCMARGS_FILE │\ 
# sed -e 's+^watchdogd *++'` 

# Check watchdogd's existance 
# if watchdogd status │ grep 'Watchdog daemon active' >/dev/null 
# then 
# echo 'ocmstart.sh: Error: watchdogd is already running' 
# exit 1 
# fi 

# Backup the old watchdogd log 
# if test -r $WATCHDOGD_LOG_FILE 
# then 
# mv $WATCHDOGD_LOG_FILE $WATCHDOGD_BAK_FILE 
# fi 

# Startup watchdogd 
# echo watchdogd $watchdogd_args 
# watchdogd $watchdogd_args 

$ORACLE_HOME/oracm/admin/ocmargs.ora 
参数文件,去掉或注释掉下面这行: 
watchdogd 

$ORACLE_HOME/oracm/admin/cmcfg.ora 
配置文件.将cmcfg.ora.tmp拷贝为cmcfg.ora文件,并修改成以下样子: 

HeartBeat=15000 
ClusterName=Oracle Cluster Manager, version 9i 
PollInterval=1000 
MissCount=210 
PrivateNodeNames=hostname 
PublicNodeNames=hostname 
ServicePort=9998 
HostName=ao-040 
CmDiskFile=/u02/rac/RacFile 
KernelModuleName=hangcheck-timer 

其中,PrivateNodeNames和PublicNodeNames要跟你安装OCM时填入的hostname相同. 
CmDiskFile要跟你先前生成的Quorum Disk File一样. 
最后一行确认使用hangcheck-timer模块. 


启动OCM: 
官方文档中,创建了一个启动脚本,因为是用来玩,就省略了这一步.用命令行来启动: 
$ su 
# cd $ORACLE_HOME/oracm/bin 
# ./ocmstart.sh 
oracm </dev/null 2>&1 >/u01/app/oracle/product/9.2.0.4.0/oracm/log/cm.out & 

如果启动太频繁,可能会报错: 
ocmstart.sh: Error: Restart is too frequent 
ocmstart.sh: Info: Check the system configuration and fix the problem. 
ocmstart.sh: Info: After you fixed the problem, remove the timestamp file 
ocmstart.sh: Info: "/u01/app/oracle/product/9.2.0.4.0/oracm/log/ocmstart.ts" 

这时,用 
# killall oracm 
# ps -ef │ grep oracm 
来确认OCM没有启动.再将/u01/app/oracle/product/9.2.0.4.0/oracm/log/ocmstart.ts文件删除了就可以启动了. 
# rm -f /u01/app/oracle/product/9.2.0.4.0/oracm/log/ocmstart.ts 
# ./ocmstart.sh 
oracm </dev/null 2>&1 >/u01/app/oracle/product/9.2.0.4.0/oracm/log/cm.out &

 vipcui 回复于:2004-06-02 12:58:10
4.安装Enterprise Server 9.2.0 

配置好OCM,并启动后,就可以开始安装数据库软件了. 
首先装9.2.0 

首先需要生成一个共享配置文件,用于多实例间和多监听器间的通信. 
文档中说要是裸设备或在共享文件系统上.因为是单机,因此可以在任意位置生成. 
$ dd if=/dev/zero of=/u02/rac/SrvConfigFile bs=1024 count=10240 
文档中没有说此文件需要多大,我设置了10M. 

如果前面没有出错,并且ORACM软件启动正确,则运行runInstaller后,欢迎画面后会出现选择节点的画面.因为是单机安装,因此只有一个节点出现,选择了之后,就可以按照正常的步骤进行. 

在选择产品的时候,建议选择自定义(Customer),可以确保Cluster Manager安装好,并且不创建数据库. 

安装完,进行配置时,因为要打补丁,我直接将窗口关闭了.免得它配完以后,要启动HTTP. 

另外,需要注意的是,运行root.sh前,按照文档说明,生成一个配置文件. 
# mkdir -p /var/opt/oracle 
# touch /var/opt/oracle/srvConfig.loc 
然后再运行root.sh,会报错,不管,在9.2.0.4中修正了. 

请参看 
http://www.itpub.net/showthread.php?threadid=171693 



5.数据库软件打补丁到Enterprise Server 9.2.0.4 

注意,打补丁时,要确保ORACM在运行,并且没有关联到此安装目录的实例,监听器,HTTP server在运行.因为我刚才直接将9201装完以后的配置画面关掉了,因此我的PC上没有.如果你的PC上有的话,记得关闭.忘了也没有关系,Installer会报告写文件错误,那时再关闭也可以. 

打补丁情况跟非RAC情况一样. 

先装Installer,然后再打Server的补丁. 
注意: 
因为Oracle Cluster Manager已经打过补丁了,不要再打这个补丁. 

另外,我在打Server补丁时,没有出现选择节点的画面!直接install就可以了. 
在Oracle提供的官方安装文档中,说会出现节点选择画面,但那个文档是RHAS2.1的,并且是多节点的普通RAC,我不知道是因为操作系统版本不对没有出现此画面,还是因为我只有一个节点而没有出现此画面.或者就是Oracle的文档错误.希望有条件做试验或已经做过试验的人告诉我原因! 先表示谢意! 

我在打补丁过程中,没有报错误,也就没有打补丁3119415.

 vipcui 回复于:2004-06-02 12:59:07
6.准备创建数据库 

首先创建一个配置文件srvConfig.loc 
因为先前已经用touch生成了这个文件,因此需要的只是更改权限和属主. 
# chmod 755 /var/opt/oracle/srvConfig.loc 
# chown oracle:dba /var/opt/oracle/srvConfig.loc 

并在其中添加以下内容: 
srvconfig_loc=<your_config_file_name> 
其中<your_config_file_name>就是先前用dd生成的共享配置文件. 
我的文件内容如下: 
srvconfig_loc=/u02/rac/SrvConfigFile 

初始化共享配置文件.以oracle身份运行: 
$ srvconfig -init 

启动公共服务进程(Global Services Deamon).以oracle身份运行: 
$ gsdctl start 
Successfully started GSD on local node 

然后就可以开始创建数据库了. 


7.在服务器端配置listener.ora和tnsnames.ora 

修改lisnter.ora和tnsnames.ora文件,以增加listener. 
这一部分,RAC环境和非RAC环境没有区别,可以参考oracle的文档. 

可以一个listener给三个instance服务,也可以启动三个listener给三个instance服务. 
我启动了三个listener. 

Listener.ora 
LSNR1 = 
(ADDRESS_LIST= 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1521))) 
LSNR2 = 
(ADDRESS_LIST= 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1522))) 
LSNR3 = 
(ADDRESS_LIST= 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1523))) 

tnsnames.ora 
lsnr1=(DEscriptION= 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1521))) 
lsnr2=(DEscriptION= 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1522))) 
lsnr3=(DEscriptION= 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1523))) 

将your_ip_or_name替换为你的IP地址或者hostname. 
Rac.test.com替换为你init.ora文件中设置的db_name.db_domain 

启动三个listener. 
$ lsnrctl start lsnr1 
$ lsnrctl start lsnr2 
$ lsnrctl start lsnr3 

8.创建数据库 

可以运行dbca用图形界面来创建,也可以用命令行来创建. 
因为以前没有创建过集群下的数据库,因此我用图形界面来创建脚本,修改后用命令行来创建. 

先确认ORACM和GSD已经启动: 
$ ps -ef │ grep oracm 
root 3056 1 0 10:50 pts/1 00:00:00 oracm 
root 3057 3056 0 10:50 pts/1 00:00:00 oracm 
root 3059 3057 0 10:50 pts/1 00:00:00 oracm 
root 3060 3057 0 10:50 pts/1 00:00:00 oracm 
root 3061 3057 0 10:50 pts/1 00:00:00 oracm 
root 3062 3057 0 10:50 pts/1 00:00:00 oracm 
root 3063 3057 0 10:50 pts/1 00:00:00 oracm 
root 3064 3057 0 10:50 pts/1 00:00:00 oracm 
root 3065 3057 0 10:50 pts/1 00:00:00 oracm 
root 3338 3057 0 11:36 pts/1 00:00:00 oracm 
root 3362 3057 0 11:36 pts/1 00:00:00 oracm 
oracle 3482 2932 0 11:38 pts/1 00:00:00 grep oracm 

$ gsdctl stat 
GSD is running on the local node 


然后运行dbca启动数据库配置助手. 

在欢迎画面中,选择Oracle cluster database, 然后一路继续就可以了. 

在最后的总结画面上,可以选择创建数据库,也可以选择创建脚本.我选择了创建脚本. 

手工修改脚本为自己想要的样子,然后跟非集群环境一样手工创建数据库.数据文件使用本地管理,不用数据字典管理.并创建缺省的撤消表空间(undo tablespace)和临时表空间. 

注意: 
根据我的经验,SGA太小,在创建数据字典的时候会失败,因此SGA可以大一些.但因为是集群,需要启动多个instance,所以在数据字典创建完以后,即catalog.sql,catproc.sql,catclust.sql运行完以后,需要将SGA改小一点. 


修改init.ora文件,并拷贝到$ORACLE_HOME/dbs下,改名字为initrac.ora. 
我是一个instance对应一个listener.也可以一个listener响应多个instnce. 

其余参数可以自己根据自己的情况进行设置,以下是cluster的参数: 

undo_management=AUTO 
undo_retention=10800 

cluster_database=true 
cluster_database_instances=5 
rac1.instance_name=rac1 
rac1.instance_number=1 
rac1.local_listener=lsnr1 
rac1.thread=1 
rac1.undo_tablespace=UNDOTBS1 
rac2.instance_name=rac2 
rac2.instance_number=2 
rac2.local_listener=lsnr2 
rac2.thread=2 
rac2.undo_tablespace=UNDOTBS2 
rac3.instance_name=rac3 
rac3.instance_number=3 
rac3.local_listener=lsnr3 
rac3.thread=3 
rac3.undo_tablespace=UNDOTBS3 

如果要多个instance都由一个listener来响应,则改以下两行: 
rac2.local_listener=lsnr1 
rac3.local_listener=lsnr1 

注意: 
尽管数据库名字叫rac,但启动的实例名字不能叫rac.我将ORACLE_SID分别设置成了rac1,rac2,rac3. 


然后启动第一个实例,创建数据库: 

$ export ORACLE_SID=rac1 
$ sqlplus /nolog 
SQL*Plus: Release 9.2.0.4.0 - Production on Fri Nov 21 13:43:22 2003 

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 

SQL> conn / as sysdba; 
Connected to an idle instance. 
SQL> startup pfile=/u01/app/oracle/product/9.2.0.4.0/dbs/initrac.ora; 
ORACLE instance started. 

Total System Global Area 38867968 bytes 
Fixed Size 451584 bytes 
Variable Size 33554432 bytes 
Database Buffers 4194304 bytes 
Redo Buffers 667648 bytes 
Database mounted. 
Database opened. 
SQL> 

创建数据库的命令: 
CREATE DATABASE rac 
MAXINSTANCES 32 
MAXLOGHISTORY 100 
MAXLOGFILES 192 
MAXLOGMEMBERS 3 
MAXDATAFILES 1024 
DATAFILE '/u02/oradata/rac/rac/system01.dbf' SIZE 100M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE 1000M 
EXTENT MANAGEMENT LOCAL 
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/u02/oradata/rac/rac/temp01.dbf' SIZE 40M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE 1000M 
UNDO TABLESPACE "UNDOTBS1" DATAFILE '/u02/oradata/rac/rac/undotbs01.dbf' SIZE 50M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE 1000M 
CHARACTER SET ZHS16GBK 
LOGFILE GROUP 1 ('/u02/oradata/rac/rac/redo01.log') SIZE 10M REUSE, 
GROUP 2 ('/u02/oradata/rac/rac/redo02.log') SIZE 10M REUSE, 
GROUP 3 ('/u02/oradata/rac/rac/redo03.log') SIZE 10M REUSE; 


然后创建数据字典. 

以sysdba身份运行: 
SQL> @?/rdbms/admin/catalog.sql; 
SQL> @?/rdbms/admin/catproc.sql; 
SQL> @?/rdbms/admin/catclust.sql; 

以system身份运行: 
SQL> @?/sqlplus/admin/pupbld.sql;

 vipcui 回复于:2004-06-02 13:00:03
9.创建并启动多个instance 

在启动多个instance前,需要为每个instance增加一个undo tablespace, 并增加一组 redo logfile. 

SQL>CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '/u02/oradata/rac/rac/undotbs02.dbf' SIZE 50M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE 1000M; 

SQL>CREATE UNDO TABLESPACE UNDOTBS3 DATAFILE '/u02/oradata/rac/rac/undotbs03.dbf' SIZE 50M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE 1000M; 

SQL> ALTER DATABASE ADD LOGFILE THREAD 2 '/u02/oradata/rac/rac/redo2_1.log' SIZE 10M; 
SQL> ALTER DATABASE ADD LOGFILE THREAD 2 '/u02/oradata/rac/rac/redo2_2.log' SIZE 10M; 

SQL> ALTER DATABASE ADD LOGFILE THREAD 3 '/u02/oradata/rac/rac/redo3_1.log' SIZE 10M; 
SQL> ALTER DATABASE ADD LOGFILE THREAD 3 '/u02/oradata/rac/rac/redo3_1.log' SIZE 10M; 

SQL> 

然后就可以启动多个instance了. 

$ export ORACLE_SID=rac2 
$ sqlplus /nolog 

SQL*Plus: Release 9.2.0.4.0 - Production on Fri Nov 21 15:11:16 2003 

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 

SQL> conn / as sysdba; 
Connected to an idle instance. 
SQL> startup pfile=/u01/app/oracle/product/9.2.0.4.0/dbs/initrac.ora 
ORACLE instance started. 

Total System Global Area 38867968 bytes 
Fixed Size 451584 bytes 
Variable Size 33554432 bytes 
Database Buffers 4194304 bytes 
Redo Buffers 667648 bytes 
Database mounted. 
Database opened. 
SQL> 

然后再启动rac3. 


注意: 
如果SGA配置太大,启动多个instance可能会死机. 
在出现Database mounted.后,到Database opened.可能会要一段时间,请耐心等待. 

可以用以下语句查询,确认多个instance已经启动. 
SQL> select inst_id, instance_number inst_no, instance_name inst_name, 
2 parallel, status, database_status db_stat, active_state stat, host_name 
3 from gv$instance; 

10.配置客户端 

在客户端的tnsnames.ora配置文件中添加以下行: 
rac=(DEscriptION= 
(ADDRESS_LIST= 
(LOAD_BALANCE=ON) 
(FAILOVER=ON) 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1522)) 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1523)) 
(ADDRESS=(PROTOCOL=tcp)(HOST=your_ip_or_name)(PORT=1521))) 
(CONNECT_DATA= 
(FAILOVER_MODE= 
(TYPE=select)(METHOD=basic)) 
(SERVICE_NAME=rac.test.com))) 

然后就可以在客户端使用rac连接串来连接数据库了. 

连接时,因为设置了load_balance=on,因此会随机选择一个来连接.查看连接到哪个实例: 
SQL> select instance_name from v$instance; 

INSTANCE_NAME 
---------------- 
rac3 

如果在服务器端将rac3停掉,可以用shutdown immediate;或者shutdown abort; 
再运行此语句,则: 
SQL> / 

INSTANCE_NAME 
---------------- 
rac1 

客户端在监测到instance down了以后,重新连接,这次连到了rac1. 


注意: 
在非RAC环境下,如果用户设置了failover=on,则instance down时,用户未commit的数据自动回滚了.在RAC下,需要用户执行rollback. 如果不rollback 而执行SQL语句,则oracle会报错: 
ERROR at line 1: 
ORA-25402: transaction must roll back 


11.结语 

到现在,单节点上多instance的RAC就配置好了. 
希望能对大家有所帮助.

 wind521 回复于:2004-06-02 13:08:38
好贴

 cgweb 回复于:2004-06-02 13:14:10
高!

 rollingpig 回复于:2004-06-02 20:11:21


告诉 luKai 你不务正业

 vipcui 回复于:2004-06-03 08:51:27
[quote:33ff96330d="rollingpig"]晕

告诉 luKai 你不务正业[/quote:33ff96330d]
你,你,你,要气死我啊 :mrgreen:

 chunguang_jia 回复于:2004-06-04 09:09:58
强,但太高深,没看懂。

 david791125 回复于:2005-03-16 09:16:29
gsdctl start錯誤
是什么原因﹖

原文转自:http://www.ltesting.net