在11.2RAC上如何手工添加一个数据库实例
更新时间: 2019-03-27 16:27
有些情况下,需要添加一个新的实例到数据库上,推荐用dbca来添加新的实例,但是有的情况下无法使用dbca,比如这个数据库是从11.2之下升级上来的,还在使用裸设备,但是dbca中已经不支持用裸设备来添加数据库文件,这种情况下需要手工添加这个实例。
下面是在11.2上添加一个实例RACDB2的过程,已有实例为RACDB1。 已有节点为rac1,新节点为rac2。
在11.2上,一般会使用grid用户来管理GI,使用oracle用户来管理数据库,下面的操作都是用oracle用户来执行。
1. 确保参数文件中日志相关的路径已经存在,如果不存在,需要提前创建相关的目录:
audit_file_dest, background_dump_dest, user_dump_dest 和core_dump_dest等。
比如audit_file_dest=/u01/app/oracle/admin/RACDB/adump,如果这个目录不存在,那么启动实例会报错:
ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925
2. 在已有的数据库实例上执行下面的命令来添加新实例相关的参数:
SQL> alter system set instance_number=2 scope=spfile sid='RACDB2';
SQL> alter system set thread=2 scope=spfile sid='RACDB2';
SQL> alter system set undo_tablespace='UNDOTBS2' scope=spfile sid='RACDB2';
SQL> alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.0.2.122)(PORT=1521))))' sid='RACDB2'; <=====192.0.2.122是节点2的VIP
3. 拷贝已有节点的DB的$ORACLE_HOME/dbs/init<sid>.ora 到新节点的DB的$ORACLE_HOME/dbs/init<sid>.ora,一定要修改对应的实例名。
保证init<sid>.ora 只有一行,用来指定spfile的位置:
=======================
SPFILE='+DATA/racdb/spfileracdb.ora'
比如:
[oracle@rac1 ~]$ scp $ORACLE_HOME/dbs/initRACDB1.ora rac2:$ORACLE_HOME/dbs/initRACDB2.ora <===文件名修改为实例2
4. 修改新节点的/etc/oratab,保证其中有类似下面的内容:
RACDB2:/u01/app/oracle/product/11.2.0/dbhome_1:N
5. 拷贝已有节点的密码文件: DB的$ORACLE_HOME/dbs/ora<sid>.pwd 到新节点DB的$ORACLE_HOME/dbs/ora<sid>.pwd,一定要修改对应的实例名。
比如:
[oracle@rac1 dbs]$ scp $ORACLE_HOME/dbs/orapwRACDB1 rac2:$ORACLE_HOME/dbs/orapwRACDB2 <==修改为实例2
6. 在已有的实例执行下面的命令,为新建的实例添加UNDO TABLESPACE。
比如:
SQL>CREATE UNDO TABLESPACE "UNDOTBS2" DATAFILE '/dev/….' SIZE 4096M ;
或者使用磁盘组:
SQL>CREATE UNDO TABLESPACE "UNDOTBS2" DATAFILE '+DATA' SIZE 4096M ;
7. 在已有的实例执行下面的命令,为新建的实例添加redo thread和redo log:
比如:
SQL> alter database add logfile thread 2
group 3 ('/dev/...', '/dev/...') size 1024M,
group 4 ('/dev/...','dev/...') size 1024M;
或者使用磁盘组:
SQL> alter database add logfile thread 2
group 3 ('+DATA','+RECO') size 1024M,
group 4 ('+DATA','+RECO') size 1024M;
SQL> alter database enable thread 2; <==启动这个thread
8. 在新节点上启动新实例,保证环境变量设置的是正确的:
[oracle@rac2 admin]$su - oracle
[oracle@rac2 admin]$export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
[oracle@rac2 admin]$export ORACLE_SID=RACDB2
[oracle@rac2 admin]$ sqlplus / as sysdba
SQL> startup <==如果启动成功,说明之前的实例2相关的参数应该设置正确了
9. 添加实例到OCR中来被GI管理,这个命令可以在任意节点执行:
$srvctl add instance -d <database name> -i <new instance name> -n <new node name>
Example of srvctl add instance command:
============================
[oracle@rac2 ~]$ srvctl add instance -d racdb -i RACDB2 -n rac2 <==注意实例的大小写,可以执行ps -ef|grep smon来查看
[oracle@rac2 dbs]$ ps -ef|grep smon
root 3453 1 1 Jun12 ? 04:03:05 /u01/app/11.2.0/grid/bin/osysmond.bin
grid 3727 1 0 Jun12 ? 00:00:19 asm_smon_+ASM2
oracle 5343 4543 0 14:06 pts/1 00:00:00 grep smon
oracle 28736 1 0 Jun25 ? 00:00:03 ora_smon_RACDB2 <========实例名大写的
10. 查看实例的状态:
$su - grid
[grid@rac2 ~]$ crsctl stat res -t
...
ora.racdb.db
1 ONLINE ONLINE rac1 Open
2 OFFLINE OFFLINE
rac2已经添加,但是状态显示offline,实际上这个实例之前已经被sqlplus启动了
可以用sqlplus把实例先停掉,然后用srvctl启动:
[grid@rac2 ~]$ su - oracle
Password:
[oracle@rac2 ~]$ sqlplus / as sysdba
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
[oracle@rac2 ~]$ srvctl start instance -d racdb -i RACDB2
[oracle@rac2 ~]$ su - grid
Password:
[grid@rac2 ~]$ crsctl stat res -t
ora.racdb.db
1 ONLINE ONLINE rac1 Open
2 ONLINE ONLINE rac2 Open
11. 检查数据库的依赖性:
[oracle@rac2 ~]$ crsctl stat res ora.racdb.db -p
NAME=ora.racdb.db
TYPE=ora.database.type
ACL=owner:oracle:rwx,pgrp:oinstall:rwx,other::r--
ACTION_FAILURE_TEMPLATE=
ACTION_SCRIPT=
ACTIVE_PLACEMENT=1
AGENT_FILENAME=%CRS_HOME%/bin/oraagent%CRS_EXE_SUFFIX%
AUTO_START=restore
CARDINALITY=2
CHECK_INTERVAL=1
CHECK_TIMEOUT=30
CLUSTER_DATABASE=true
DATABASE_TYPE=RAC
DB_UNIQUE_NAME=RACDB
DEFAULT_TEMPLATE=PROPERTY(RESOURCE_CLASS=database) PROPERTY(DB_UNIQUE_NAME= CONCAT(PARSE(%NAME%, ., 2), %USR_ORA_DOMAIN%, .))
ELEMENT(INSTANCE_NAME= %GEN_USR_ORA_INST_NAME%) ELEMENT(DATABASE_TYPE= %DATABASE_TYPE%)
DEGREE=1
DESCRIPTION=Oracle Database resource
ENABLED=1
FAILOVER_DELAY=0
FAILURE_INTERVAL=60
FAILURE_THRESHOLD=1
GEN_AUDIT_FILE_DEST=/u01/app/oracle/admin/RACDB/adump
GEN_START_OPTIONS=
GEN_START_OPTIONS@SERVERNAME(rac1)=open
GEN_START_OPTIONS@SERVERNAME(rac2)=open
GEN_USR_ORA_INST_NAME=
GEN_USR_ORA_INST_NAME@SERVERNAME(rac1)=RACDB1
HOSTING_MEMBERS=
INSTANCE_FAILOVER=0
LOAD=1
LOGGING_LEVEL=1
MANAGEMENT_POLICY=AUTOMATIC
NLS_LANG=
NOT_RESTARTING_TEMPLATE=
OFFLINE_CHECK_INTERVAL=0
ONLINE_RELOCATION_TIMEOUT=0
ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_HOME_OLD=
PLACEMENT=restricted
PROFILE_CHANGE_TEMPLATE=
RESTART_ATTEMPTS=2
ROLE=PRIMARY
SCRIPT_TIMEOUT=60
SERVER_POOLS=ora.RACDB
SPFILE=+DATA/RACDB/spfileRACDB.ora
START_DEPENDENCIES=hard(ora.DATA.dg,ora.RECO.dg) weak
(type:ora.listener.type,global:type:ora.scan_listener.type,uniform:ora.ons,global:ora.gns) pullup(ora.DATA.dg,ora.RECO.dg)
START_TIMEOUT=600
STATE_CHANGE_TEMPLATE=
STOP_DEPENDENCIES=hard(intermediate:ora.asm,shutdown:ora.DATA.dg,shutdown:ora.RECO.dg)
STOP_TIMEOUT=600
TYPE_VERSION=3.2
UPTIME_THRESHOLD=1h
USR_ORA_DB_NAME=RACDB
USR_ORA_DOMAIN=
USR_ORA_ENV=
USR_ORA_FLAGS=
USR_ORA_INST_NAME=
USR_ORA_INST_NAME@SERVERNAME(rac1)=RACDB1
USR_ORA_INST_NAME@SERVERNAME(rac2)=RACDB2
USR_ORA_OPEN_MODE=open
USR_ORA_OPI=false
USR_ORA_STOP_MODE=immediate
VERSION=11.2.0.3.0
由于在11.2,在OCR中只有database资源,没有实例资源,所以实例的属性都是通过database来设置的。
由于database的属性已经存在,而且是正确的,所以不需要再对这个实例设置针对ASM或者磁盘组的的依赖性了。
附:dbca 中添加新实例的大概步骤:
在已有的节点上用oracle用户打开dbca:
su - oracle
dbca
选择 RAC database
选择 Instance Management
选择 add an instance
会列出active rac database
输入新的实例名
添加undo和redo信息