随着RAC在国内的流行,出现了不少将原本单节点数据库转换成RAC的需求;事实上这种single instance到RAC的转换并不困难,可以直接在原有单节点数据库上修改一些初始化参数并运行脚本来完成转换;这里我们通过实例向大家展示转换工作的大致步骤和注意事项。 示例环境中的节点名与示例名对应关系如下,注意Instance Name为PROD21和PROD22。
Node Name Instance Name DB NAME
vrh1 PROD21 PROD2
vrh2 PROD22 PROD2
以下操作均应当在1号节点上完成 一、在各节点上安装clusterware,并确保CRS正常启动;针对clusterware的安装在这里不做展开
[oracle@vrh1 u01]$ crsctl check crs
CSS appears healthy
CRS appears healthy
EVM appears healthy

/* 应当确保所有RAC节点上的CRS均正常启动 */

[oracle@vrh1 u01]$ crsctl query crs activeversion
CRS active version on the cluster is [10.2.0.4.0]
二、在各个节点上以Real Application Cluster选项安装Oracle Database Software软件,一般我们要求DB的版本要与clusterware的版本一致,所以如我们的环境中CRS的版本是10.2.0.4.0,那么DB的版本最好也是10.2.0.4.0;Database Software可以安装在共享存储上(shared storage),也可以是各节点上独立的文件系统上; 同时我们有必要修改一系列的环境变量如ORACLE_HOME、LD_LIBRARY_PATH到新软件的相应目录下,以及为RAC设置Oracle所推荐的一些操作系统内核参数如net.core.wmem_max等; 三、从新安装的DB Software目录下启动Netca工具,为Cluster配置新的Listener监听器;在完成新Listener的配置后;最终将老的单节点的Listener关闭掉 四、备份原单节点的数据库,并将之还原到今后RAC使用的共享存储(shared storage)上;如果今后使用ASM作为共享存储方案的话,那么可以 参考文档Note 452758.1 <How to Convert a Single-Instance ASM to Cluster ASM> 五、备份原单节点实例的参数文件,并加入下列参数:
*.cluster_database = TRUE
*.cluster_database_instances = 2
*.undo_management=AUTO
<SID1>.undo_tablespace=undotbs (undo tablespace which already exists)
<SID1>.instance_name=<SID1>
<SID1>.instance_number=1
<SID1>.thread=1
<SID1>.local_listener=<LISTENERNAME>_<HOSTNAME1>
<SID2>.instance_name=<SID2>
<SID2>.instance_number=2
<SID2>.local_listener=<LISTENERNAME>_<HOSTNAME2>
<SID2>.thread=2
<SID2>.undo_tablespace=UNDOTBS2
<SID2>.cluster_database = TRUE
<SID2>.cluster_database_instances = 2

如在我们的示例环境中:

SQL> create pfile from spfile;
File created.

[oracle@vrh1 u01]$ cd $ORACLE_HOME/dbs

[oracle@vrh1 dbs]$ cp initPROD2.ora initPROD2.ora.bak

/* 以上备份了pfile形式的参数文件 */

*.cluster_database = TRUE
*.cluster_database_instances = 2
*.undo_management=AUTO
PROD21.undo_tablespace=undotbs
PROD21.instance_name=PROD21
PROD21.instance_number=1
PROD21.thread=1
PROD21.local_listener=LISTENER

PROD22.instance_name=PROD22
PROD22.instance_number=2
PROD22.local_listener=LISTENER
PROD22.thread=2

PROD22.undo_tablespace=undotbs2
PROD22.cluster_database= TRUE
PROD22.cluster_database_instances= 2

/* 以上为示例环境中我们加入参数文件的RAC相关initial parameter */
如之前说明的<SID1>对应于<DB_NAME>1; 而<SID2>对应于<DB_NAME>2;因为这里的DB_NAME为PROD2,所以2个实例的名字为PROD21和PROD22,希望不会造成你的困惑。 六、修改参数文件中的"control_files"参数即将控制文件指向到新的共享存储的路径下 七、从pfile的文本参数文件上创建Server parameter file即SPFILE;如果我们将来不使用共享的SPFILE的话,那么因为原单节点上的实例名从原来的PROD2装换成PROD21,所以这里spfile的名字应当是spfilePROD21.ora;如果我们希望使用共享的SPFILE的话,则follow下一个步骤
SQL> create spfile='?/dbs/spfilePROD2.ora' from pfile='?/dbs/initPROD2.ora';
File created.
八、一般我们使用共享的SPFILE,那么就要将以上创建的SPFILE拷贝到共享存储上,并在本地的ORACLE_HOME/dbs/initSID.ora参数文件中留下共享SPFILE的路径:
[oracle@vrh1 dbs]$ cp spfilePROD2.ora /share1

[oracle@vrh1 dbs]$ cat initPROD21.ora
spfile='/share1/spfilePROD2.ora'
九、以新的SID为实例创建密码文件:
[oracle@vrh2 dbs]$ cd $ORACLE_HOME/dbs
[oracle@vrh1 dbs]$ orapwd file=orapwPROD21 password=oracle entries=10
十、启动实例到mount状态 [oracle@vrh1 dbs]$ echo $ORACLE_SID PROD21 SQL> startup mount; ORACLE instance started. Total System Global Area 629145600 bytes Fixed Size 1269016 bytes Variable Size 318767848 bytes Database Buffers 301989888 bytes Redo Buffers 7118848 bytes Database mounted. 十一、注意将数据文件(datafile),在线日志文件(redo log)重命名(rename)到共享设备上,如:
SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/share1/redo01.log
/share1/redo02.log
/share1/redo03.log

SQL> alter database rename file '/share1/redo01.log' to '/u01/redo01.log';
Database altered.

SQL>  alter database rename file '/share1/redo02.log' to '/u01/redo02.log';
Database altered.
......................

/* 不要忘记临时文件 */

SQL> select name from v$tempfile;

NAME
--------------------------------------------------------------------------------
/share1/temp01.dbf

SQL> alter database rename file '/share1/temp01.dbf' to '/u01/temp01.dbf';
Database altered.
十二、加入2号线程的重做日志组,并启用2号线程
SQL> alter database add logfile thread 2 group 4 '/u01/redo04.log' size 50M;
Database altered.
SQL> alter database add logfile thread 2 group 5 '/u01/redo05.log' size 50M;
Database altered.

SQL> alter database enable public thread 2;
Database altered.

............
十三、从1号节点打开数据库,并创建供二号实例(或其他更多实例)使用的撤销表空间UNDO TABLESPACE:
SQL> alter database open;
Database altered.

SQL>  CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '/u01/undotbs02.dbf' size 100M;
Tablespace created.
十四、从1号节点上运行?/rdbms/admin/catclust.sql脚本创建cluster相关的视图:
SQL> @?/rdbms/admin/catclust
...........

Grant succeeded.

Synonym created.

PL/SQL procedure successfully completed.
以下操作应当在2号或其他更多节点上执行 十五、在2号节点上设置合理的ORACLE_HOME(指向新安装的DB软件目录)和ORACLE_SID(我们的环境中为PROD22)环境变量;你可能还需要为2号实例创建必要的audit_file_dest审计文件存放目录和background_dump_dest后台转储文件存放目录等,如果实例无法正确获取这些目录可能出现"ORA-09925: Unable to create audit trail file"错误。如步骤2所述也需要在2号节点上配置推荐的操作系统内核参数等。 十六、创建$ORACLE_HOME/dbs/initSID.ora PFILE参数文件指向共享的SPFILE文件,如步骤8所示
[oracle@vrh2 ~]$ echo $ORACLE_SID
PROD22

[oracle@vrh2 ~]$ cd $ORACLE_HOME/dbs

[oracle@vrh2 dbs]$ cat initPROD22.ora
spfile='/u01/spfilePROD2.ora'
十七、在2号节点上创建形如orapwSID的密码文件:
[oracle@vrh2 dbs]$ cd $ORACLE_HOME/dbs
[oracle@vrh2 dbs]$ orapwd file=orapwPROD22 password=oracle entries=10
十八、启动2号节点的实例,并打开数据库:
SQL> startup mount;
ORACLE instance started.

Total System Global Area  629145600 bytes
Fixed Size                  1269016 bytes
Variable Size             318767848 bytes
Database Buffers          301989888 bytes
Redo Buffers                7118848 bytes
Database mounted.

SQL> alter database open;
Database altered.

SQL> select instance_name,status from gv$instance;

INSTANCE_NAME    STATUS
---------------- ------------
PROD22           OPEN
PROD21           OPEN
以上完成了对单节点数据库到RAC数据库的转换,但该RAC数据库的资源尚未注册到OCR中,因此无法使用例如srvctl、crs_stat等命令配置或监控这些资源,我们需要手动将这些资源加入到OCR中。 以下操作在任意一节点上完成即可:
srvctl add database -d <database name> -o <ORACLE_HOME path> -p <spfile location and name>

srvctl add instance -d <database name> -i <instance 1 name> -n <node 1 name >

srvctl add instance -d <database name> -i <instance 2 name> -n <node 2 name >

如在我们的示例环境中可以如下添加:
[oracle@vrh2 ~]$ srvctl add database -d PROD2 -o $ORACLE_HOME -p /u01/spfilePROD2.ora

[oracle@vrh2 ~]$ srvctl add instance -d PROD2 -i PROD21 -n vrh1

[oracle@vrh2 ~]$ srvctl add instance -d PROD2 -i PROD22 -n vrh2

[oracle@vrh2 ~]$ crs_start ora.PROD2.db

[oracle@vrh2 ~]$ crs_stat -t
Name