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錯誤 是什么原因﹖ |