在我之前的2篇Blog 里提到了RAC ASM实例名和 DB实例名的问题。
RAC 中 ASM 实例名 与 节点的对应关系
RAC 修改 ASM实例名 的步骤
我们在这一篇,主要讨论RAC 平台下DB 实例名的修改问题。
对于单实例下DB 实例名的修改,可以使用NID命令。 这个在我的blog:
RMAN 备份异机恢复 并创建新DBID
的最后一部分有说明。 NID 命令会帮我们更新控制文件里的信息。 所以,如果不用NID命令,那么我们手工的用创建控制文件的方式来实现。
方法一:修改控制文件的方法来修改实例名的步骤:
(1)关闭其他节点,只保留一个节点。在剩下的节点上,将控制文件生成到trace里。使用命令:
alter database backup control file to trace ;
生成trace 文件的好处的好处是我们可以通过这个trace文件看到控制文件的生成语句。 可以对其进行修改。
关于控制文件,具体参考:
Oracle 控制文件
(2) 将第一步生成的trace文件复制一份成crctl.sql。修改这个这个文件中数据库的名称。 改成我们想设置的名称。
(3)修改pfile文件。
(4)关闭所有节点,
(5)用新的pfile重新创建spfile
(6)用修改之后的spfile,将其中一个节点启动到nomount状态。
(7)重建控制文件:执行第二部修改过的sql脚本。 当然,也可以直接编写控制文件的创建脚本。 即忽略第一步和第二步。
(8)修改tnsnames.ora 和 listener.ora 文件
)更新OCR信息
(10)启动所有节点。
方法二:使用NID命令修改实例名的方法:
)将cluster_database设置为false,将节点1启动到mount,其他节点关闭。
(2)使用NID 修改db name:
$nid target=sys/oracle dbname=dave
(3)创建pfile,并修改相关参数,如listener.ora,tnsnames.ora,并生成新的spfile。
(4)更新OCR
srvctl remove database -d <old_database_name> srvctl add database -d <new_db_name> -o $ORACLE_HOMEsrvctl add instance -d <new_db_name> -i <instance name on node 1> -n Node1srvctl add instance -d <new_db_name> -i <instance name on node 2> -n Node2
(5)在其中一个节点上open resetlogs打开DB。 其他节点正常启动
(6)启动cluster_database 参数
我之前的的环境是实例名有点怪。 所以我们在这里将演示2种情况。 先将2个节点的实例名对应的方式。 然后修改下实例名。
一. RAC 实例名相同,只修改每个节点的实例名
这个测试就是讲我们当前环境下的2个节点实例名换一下。
[oracle@rac1 u01]$ sh crs_stat.sh
Name Target State Host
------------------------------ ---------- --------- -------
ora.rac.db ONLINE ONLINE rac2
ora.rac.rac1.inst ONLINE ONLINE rac2
ora.rac.rac2.inst ONLINE ONLINE rac1
--两个节点上的名称反了,在第一个测试中将他们的顺序切换一下
ora.rac.taf.cs ONLINE ONLINE rac2
ora.rac.taf.rac1.srv ONLINE ONLINE rac2
ora.rac.taf.rac2.srv ONLINE ONLINE rac1
ora.rac1.ASM1.asm ONLINE ONLINE rac1
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm ONLINE ONLINE rac2
--ASM实例的,在之前的测试中已经更换过来了
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
因为不需要修改实例名,所以不需要重建控制文件,操作步骤和前面的列出来的相同。 把重建控制文件的那部分去掉就ok了。
在这里补充一点知识:
DB_NAME 是数据库名,它的长度不能超过8个字节,超过8个会被截断。对于RAC环境,各个节点之间的DB_NAME都是相同的,INSTANCE_NAME 不同。 对于Data Guard环境,DB_NAME相同,DB_UNIQUE_NAME 不同。
DB_NAME记录在datafile,redo log和control file中。 这个记录方式就是通过DBID。 因为DBID 就是用DB_NAME 加算法来生成的。
更多信息参考:
DBID,SID,DB_NAME,DB_DOMAIN,INSTANCE_NAME,DB_UNIQUE_NAME,SERVICE_NAMES 及监听参数的说明
INSTANCE_NAME 会影响进程的命名:
[oracle@rac1 u01]$ ps -ef |grep pmon
oracle 7453 26076 0 10:38 pts/2 00:00:00 grep pmon
oracle 28004 1 0 10:06 ? 00:00:00 asm_pmon_+ASM1
oracle 28844 1 0 10:06 ? 00:00:00 ora_pmon_rac2
[oracle@rac1 u01]$ export ORACLE_SID=rac2
[oracle@rac1 u01]$ sqlplus / as sysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 28 10:24:41 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
rac2
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DATA/rac/spfilerac.ora
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string rac
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string rac2
SQL> create pfile from spfile;
File created.
在上面的操作中,我们生成了pfile文件。 pfile和口令文件的名称和instance_name要保持一致。 如果在生成时,没有写明目录,默认会生成到$ORACLE_HOME/dbs 下。
[oracle@rac1 u01]$ cd $ORACLE_HOME/dbs
[oracle@rac1 dbs]$ ls
ab_+ASM1.dat hc_+ASM1.dat hc_rac2.dat initdw.ora initrac2.ora orapwrac2 ab_+ASM2.dat hc_+ASM2.dat init+ASM1.ora init.ora orapw+ASM1
1.1 重名了pfile文件和口令文件, 并修改pfile文件instance_name参数
RAC的spfile 文件是保存在共享存储上的。 所以我们先讲这个共享存储上的spfile转成pfile。 修改完之后,在转成spfile。
重命名:
节点1:
[oracle@rac1 dbs]$ mv initrac2.ora initrac1.ora
[oracle@rac1 dbs]$ mv orapwrac2 orapwrac1
节点2:
[oracle@rac2 dbs]$ mv orapwrac1 orapwrac2
[oracle@rac2 dbs]$ mv initrac1.ora initrac2.ora
[oracle@rac2 dbs]$ cat initrac2.ora
SPFILE='+DATA/rac/spfilerac.ora'
节点2的参数文件是直接指向了我们的spfile,即共享位置上。 我这里只是修改了一下文件的名称。 指向的内容并没有改变。 在下一步,我们在节点1上用pfile 创建新的spfile就可以了。
修改pfile参数
在initrac1.ora 文件里添加实例的信息:
[oracle@rac1 dbs]$ cat initrac1.ora |grep instance_name
rac1.instance_name=rac1
rac2.instance_name=rac2
1.2 shutdown 所有实例
[oracle@rac1 dbs]$ srvctl stop instance -d rac -i rac1
[oracle@rac1 dbs]$ srvctl stop instance -d rac -i rac2
[oracle@rac1 dbs]$ sh /u01/crs_stat.sh
Name Target State Host
------------------------------ ---------- --------- -------
ora.rac.db OFFLINE OFFLINE
ora.rac.rac1.inst OFFLINE OFFLINE
ora.rac.rac2.inst OFFLINE OFFLINE
ora.rac.taf.cs OFFLINE OFFLINE
ora.rac.taf.rac1.srv OFFLINE OFFLINE
ora.rac.taf.rac2.srv OFFLINE OFFLINE
ora.rac1.ASM1.asm ONLINE ONLINE rac1
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm ONLINE ONLINE rac2
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
1.3 用修改之后的pfile创建spfile
[oracle@rac1 u01]$ export ORACLE_SID=rac1
[oracle@rac1 u01]$ sqlplus / as sysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 28 13:15:47 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
SQL> create spfile='+DATA/rac/spfilerac.ora' from pfile='/u01/app/oracle/product/10.2.0/db_1/dbs/initrac1.ora';
File created.
注意,这里的spfile 要指定到共享设备上,不然会默认创建到$ORACLE_HOME/dbs目录下。
1.4 更新OCR
[oracle@rac1 dbs]$ srvctl stop instance -d rac -i rac1
[oracle@rac1 dbs]$ srvctl stop instance -d rac -i rac2
[oracle@rac1 dbs]$ srvctl remove database -d rac
Remove the database rac? (y/[n]) y
[oracle@rac1 dbs]$ srvctl add database -d rac -o $ORACLE_HOME
[oracle@rac1 dbs]$ srvctl add instance -d rac -i rac1 -n rac1
[oracle@rac1 dbs]$ srvctl add instance -d rac -i rac2 -n rac2
[oracle@rac1 rac1]$ sh /u01/crs_stat.sh
Name Target State Host
------------------------------ ---------- --------- -------
ora.rac.db ONLINE ONLINE rac2
ora.rac.rac1.inst ONLINE ONLINE rac1
ora.rac.rac2.inst ONLINE ONLINE rac2
--名称修改过来了
ora.rac1.ASM1.asm ONLINE ONLINE rac1
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm ONLINE ONLINE rac2
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
1.5 正常启动所有实例
[oracle@rac1 dbs]$ srvctl start instance -d rac -i rac1
[oracle@rac1 dbs]$ srvctl start instance -d rac -i rac2
[oracle@rac1 rac1]$ sh /u01/crs_stat.sh
Name Target State Host
------------------------------ ---------- --------- -------
ora.rac.db ONLINE ONLINE rac2
ora.rac.rac1.inst ONLINE ONLINE rac1
ora.rac.rac2.inst ONLINE ONLINE rac2
--已经换过来了
ora.rac1.ASM1.asm ONLINE ONLINE rac1
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm ONLINE ONLINE rac2
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
1.6 验证:
节点1:
[oracle@rac1 u01]$ export ORACLE_SID=rac1
[oracle@rac1 u01]$ sqlplus / as sysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 28 13:51:21 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string rac1
节点2:
[oracle@rac2 mapper]$ export ORACLE_SID=rac2
[oracle@rac2 mapper]$ sqlplus / as sysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 28 13:52:42 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string rac2
SQL>
实验一的测试,结束。 在实验二中,我们将测试修改RAC的实例名,即重建控制文件。
二. 使用NID修改RAC 实例名
在这个测试里,我们把的实例名从rac 修改成dave。
2.1将cluster_database 设置为false后,将节点1启动到mount状态,节点2关闭
[oracle@rac1 u01]$ export ORACLE_SID=rac1
[oracle@rac1 u01]$ sqlplus / as sysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 28 15:40:38 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> alter system set cluster_database=false scope=spfile;
System altered.
--要先设置该参数后,在将DB启动到mount状态,不然报如下错误:
--NID-00120: Database should be mounted exclusively
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 121636432 bytes
Database Buffers 159383552 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL>
关闭节点2:
[oracle@rac1 admin]$ srvctl stop instance -d rac -i rac2
2.2使用NID 修改db name:
[oracle@rac1 admin]$ export ORACLE_SID=rac1
[oracle@rac1 admin]$ nid target=sys/oracle dbname=dave
DBNEWID: Release 10.2.0.1.0 - Production on Mon Mar 28 15:50:45 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to database RAC (DBID=2334616217)
Connected to server version 10.2.0
Control Files in database:
+DATA/rac/controlfile/current.260.746634201
+FRA/rac/controlfile/current.256.746634203
Change database ID and database name RAC to DAVE? (Y/[N]) => y
--输入y
Proceeding with operation
Changing database ID from 2334616217 to 809910293
Changing database name from RAC to DAVE
Control File +DATA/rac/controlfile/current.260.746634201 - modified
Control File +FRA/rac/controlfile/current.256.746634203 - modified
Datafile +DATA/rac/datafile/system.256.746634087 - dbid changed, wrote new name
Datafile +DATA/rac/datafile/undotbs1.258.746634089 - dbid changed, wrote new name
Datafile +DATA/rac/datafile/sysaux.257.746634087 - dbid changed, wrote new name
Datafile +DATA/rac/datafile/users.259.746634089 - dbid changed, wrote new name
Datafile +DATA/rac/datafile/undotbs2.264.746634255 - dbid changed, wrote new name
Datafile +DATA/rac/tempfile/temp.263.746634229 - dbid changed, wrote new name
Control File +DATA/rac/controlfile/current.260.746634201 - dbid changed, wrote new name
Control File +FRA/rac/controlfile/current.256.746634203 - dbid changed, wrote new name
Instance shut down
Database name changed to DAVE.
Modify parameter file and generate a new password file before restarting.
Database ID for database DAVE changed to 809910293.
All previous backups and archived redo logs for this database are unusable.
Database is not aware of previous backups and archived logs in Recovery Area.
Database has been shutdown, open database with RESETLOGS option.
--注意,测试DB 已经被shutdown,需要使用resetlogs打开
Succesfully changed database name and ID.
DBNEWID - Completed succesfully.
2.3 在两个节点上修改pfile和相关参数,如口令文件,listener.ora和tnsnames.ora 等。
SQL> create pfile from spfile;
File created.
默认情况下,文件或生成在$ORACLE_HOME/dbs下
最好指定到其他目录。 因为如果指定到了默认目录下,启动RAC的时候,就使用了这个参数,所有指定到其他位置就ok了。
节点1
[oracle@rac1 dbs]$ cat initrac1.ora
*.control_files='+DATA/rac/controlfile/current.260.746634201','+FRA/rac/controlfile/current.256.746634203'
*.core_dump_dest='/u01/app/oracle/admin/rac/cdump'
*.db_name='dave'
rac1.instance_name='dave1'
rac2.instance_name='dave2'
dave2.instance_number=2
dave1.instance_number=1
rac2.instance_number=2
rac1.instance_number=1
*.log_archive_dest_1='LOCATION=+FRA/rac/'
*.remote_listener='LISTENERS_RAC'
*.undo_management='AUTO'
*.user_dump_dest='/u01/app/oracle/admin/rac/udump'
...
这里我省略了一些内容,我修改了3个参数,像其他一些有关目录的参数,没有修改。
[oracle@rac1 dbs]$ mv initrac1.ora initdave1.ora
[oracle@rac1 dbs]$ mv orapwrac1 orapwdave1
检查下tnsnames.ora 和 listener.ora, 如果有变跟,就修改一下。
节点2
[oracle@rac2 dbs]$ mv initrac2.ora initdave2.ora
[oracle@rac2 dbs]$ mv orapwrac2 orapwdave2
修改指定的映射文件
[oracle@rac2 dbs]$ cat initdave2.ora
SPFILE='+DATA/rac/spfiledave.ora'
检查下tnsnames.ora 和 listener.ora, 如果有变跟,就修改一下。
2.4 重新创建spfile
SQL>
2.5 更新OCR信息
[oracle@rac1 admin]$ srvctl remove database -d rac
Remove the database rac? (y/[n]) y
[oracle@rac1 admin]$ srvctl add database -d dave -o $ORACLE_HOME
[oracle@rac1 admin]$ srvctl add instance -d dave -i dave1 -n rac1
[oracle@rac1 admin]$ srvctl add instance -d dave -i dave2 -n rac2
注意一点,如果在实例上配置了Service sid TAF,那么删除db也会删除这个TAF的配置,需要重新配置。
具体参考:
Oracle RAC Failover 详解
2.6 启动所有实例
节点1:
[oracle@rac1 u01]$ export ORACLE_SID=dave1
[oracle@rac1 u01]$ sqlplus / as sysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 28 17:01:12 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 88082000 bytes
Database Buffers 192937984 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database open resetlogs;
Database altered.
SQL> select name from v$database;
NAME
---------
DAVE
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dave1
SQL> select instance_name from gv$instance;
INSTANCE_NAME
----------------
dave1
dave2
在节点1上发现一个问题:
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string
我们直接startup 的时候,使用的是本地的pfile文件,而不是共享设备上的spfile。
按正常情况,先是找spfile,在找pfile。因为我们本地没有spfile,所以就使用本地的pfile启动了。 而对于RAC 环境,需要使用共享设置上的spfile。 所以这里我们还是需要将$ORACLE_HOME/dbs的pfile 文件,改成指向共享设备的指针。
[oracle@rac1 dbs]$ cat initdave1.ora
SPFILE='+DATA/rac/spfiledave.ora'
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 88082000 bytes
Database Buffers 192937984 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DATA/rac/spfiledave.ora
使用了共享设备的spfile,这个问题搞定。
在节点2上直接启动即可:
[oracle@rac2 mapper]$ export ORACLE_SID=dave2
[oracle@rac2 mapper]$ sqlplus / as sysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on Mon Mar 28 17:04:28 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 88082000 bytes
Database Buffers 192937984 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> select name from v$database;
NAME
---------
DAVE
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dave2
SQL>
不要忘记启动该参数:
SQL> alter system set cluster_database=true scope=spfile;
System altered.
SQL> show parameter cluster_database
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cluster_database boolean TRUE
cluster_database_instances integer 2
SQL>
[oracle@rac1 dbs]$ sh /u01/crs_stat.sh
Name Target State Host
------------------------------ ---------- --------- -------
ora.dave.dave1.inst ONLINE ONLINE rac1
ora.dave.dave2.inst ONLINE ONLINE rac2
ora.dave.db ONLINE ONLINE rac2
ora.rac1.ASM1.asm ONLINE ONLINE rac1
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm ONLINE ONLINE rac2
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
小结:
在这篇文章里,整理了2种方法,其实对于生产环境,很少会去修改实例名。 所以我这里也仅是测试。
这个实验本来是上周五做的。结果SA的同事直接把ESX服务器给重启了。RAC的共享存储又没有起来。 下班了也找不到人,周末又要回合肥。就懒得折腾了。 做了7个小时,回来又是7个小时。人都散架了。 老了啊。 回来的时候是卧铺的上铺。 没票了。 在那狭小的空间窝了6个多小时。手机又给玩没了电。
感慨:做长途旅行必备的工具:手机,足够的电源。 最好是3+块电板。 我坐那趟车是从新疆乌鲁木齐到杭州的,从那边过来要近3天的时间。 这么长时间,不把人坐疯了。
---------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
DBA1 群:62697716(满); DBA2 群:62697977(满) DBA3 群:62697850(满)
DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823
聊天 群:40132017
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请