利用Oracle的STANDBY技术,可以将单实例数据库升级到RAC数据库。这种方式可以有效的降低单实例迁移到RAC环境的停机时间。


这篇文章描述单实例环境与RAC环境的SWITCHOVER过程。




前面已经成功搭建了单实例数据库TEST11G的RAC环境STANDBY数据库TEST11GR。STANDBY数据库的两个实例可以同时以READ ONLY方式启动。


下面为了执行SWITCHOVER操作,可以先关闭实例2:


bash-3.00$ export ORACLE_SID=test11gr2


bash-3.00$ sqlplus "/ as sysdba"


SQL*Plus: Release11.1.0.6.0 - Production on星期五7月17 19:44:11 2009


Copyright (c) 1982, 2007, Oracle.  All rights reserved.




连接到:


Oracle Database11gEnterprise Edition Release11.1.0.6.0 - 64bit Production


With the Partitioning, Real Application Clusters, OLAP, Data Mining


and Real Application Testing options


SQL> SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;


INSTANCE_NAME    STATUS


---------------- ------------


test11gr2        OPEN


SQL> SELECT INSTANCE_NAME, STATUS FROM GV$INSTANCE;


INSTANCE_NAME    STATUS


---------------- ------------


test11gr2        OPEN


test11gr1        OPEN


SQL> SHUTDOWN IMMEDIATE


数据库已经关闭。


已经卸载数据库。


ORACLE例程已经关闭。


SQL> EXIT


从Oracle Database11gEnterprise Edition Release11.1.0.6.0 - 64bit Production


With the Partitioning, Real Application Clusters, OLAP, Data Mining


and Real Application Testing options断开


回到节点1上,将数据库置于RECOVER状态,确保应用最新的归档数据:


SQL> alter database close;


数据库已更改。


SQL> alter database recover managed standby database disconnect from session;


数据库已更改。


SQL> select pid, status, client_process, group#, resetlog_id, thread#, sequence#


 2  from v$managed_standby;


      PID STATUS       CLIENT_P GROUP#     RESETLOG_ID    THREAD#  SEQUENCE#


---------- ------------ -------- ---------- ----------- ---------- ----------


    13916 CONNECTED    ARCH     N/A                  0          0          0


    13918 CONNECTED    ARCH     N/A                  0          0          0


    13920 CONNECTED    ARCH     N/A                  0          0          0


    13922 CONNECTED    ARCH     N/A                  0          0          0


      476 WAIT_FOR_GAP N/A      N/A          683602501          1        159


    16679 IDLE         UNKNOWN  N/A                  0          0          0


    16689 IDLE         UNKNOWN  N/A                  0          0          0


    16691 IDLE         UNKNOWN  N/A                  0          0          0


已选择8行。


检查主库的归档情况。


SQL> select name, dest_id, thread#, sequence#, creator


 2  from v$archived_log


 3  where sequence# = 158;


NAME                                                   DEST_ID   THREAD#  SEQUENCE# CREATOR


----------------------------------------------------- -------- --------- ---------- -------


/data/oradata/test11g/archivelog/1_158_683602501.dbf         1         1        158 ARCH


TEST11GR                                                     2         1        158 ARCH


确认主库和备库归档应用已经同步。


在进行DATA GUARD的物理STANDBY切换前需要注意:


确认主库和从库间网络连接通畅;


确认没有活动的会话连接在数据库中;


PRIMARY数据库处于打开的状态,STANDBY数据库处于MOUNT状态;


确保STANDBY数据库处于ARCHIVELOG模式;


如果设置了REDO应用的延迟,那么将这个设置去掉;


确保配置了主库和从库的初始化参数,使得切换完成后,DATA GUARD机制可以顺利的运行。


由于RAC环境STANDBY在SWITCHOVER时,很容易由于设置DB_RECOVERY_FILE_DEST导致bug的出现,具体描述可以参考:


SWITCHOVER RAC数据库出现ORA-600(kcctrdf_2)错误:http://yangtingkun.itpub.net/post/468/418311


因此在STANDBY数据库建立初始化参数文件的时候就没有加载DB_RECOVERY_FILE_DEST等参数,这里将主库的相应参数也去掉:


SQL> show parameter db_recovery_file_dest


NAME                                 TYPE                   VALUE


------------------------------------ ---------------------- ------------------------------


db_recovery_file_dest                string                 /data/oracle/flash_recovery_area


db_recovery_file_dest_size           big integer           4G


SQL> alter system reset db_recovery_file_dest scope = spfile;


系统已更改。


SQL> alter system reset db_recovery_file_dest_size scope = spfile;


系统已更改。


下面关闭主数据库,断开所有的连接,确保重新启动后,没有业务会话连接到数据库上:


SQL> shutdown immediate


数据库已经关闭。


已经卸载数据库。


ORACLE例程已经关闭。


SQL> startup


ORACLE例程已经启动。


Total System Global Area 5279498240 bytes


Fixed Size                  2094528 bytes


Variable Size            3192597056 bytes


Database Buffers         2080374784 bytes


Redo Buffers                4431872 bytes


数据库装载完毕。


数据库已经打开。


SQL> show parameter db_recovery_file_dest


NAME                                 TYPE                   VALUE


------------------------------------ ---------------------- ------------------------------


db_recovery_file_dest                string


db_recovery_file_dest_size           big integer            0


SQL> select name, db_unique_name, database_role, switchover_status


 2  from v$database;


NAME       DB_UNIQUE_ DATABASE_ROLE   SWITCHOVER_STATUS


---------- ---------- --------------- ----------------------------------------


TEST11G    TEST11G    PRIMARY         TO STANDBY


数据库处于TO STANDBY状态,下面执行SWITCHOVER操作:


SQL> alter database commit to switchover to physical standby;


数据库已更改。


SQL> shutdown immediate


ORA-01507:未装载数据库




ORACLE例程已经关闭。


SQL> startup mount


ORACLE例程已经启动。


Total System Global Area 5279498240 bytes


Fixed Size                  2094528 bytes


Variable Size            3192597056 bytes


Database Buffers         2080374784 bytes


Redo Buffers                4431872 bytes


数据库装载完毕。


SQL> select name, db_unique_name, database_role, switchover_status


 2  from v$database;


NAME       DB_UNIQUE_ DATABASE_ROLE        SWITCHOVER_STATUS


---------- ---------- -------------------- ----------------------------------------


TEST11G    TEST11G    PHYSICAL STANDBY     TO PRIMARY


下面切换到RAC环境的STANDBY数据库,检查状态:


SQL> select name, db_unique_name, database_role, switchover_status


 2  from v$database;


NAME      DB_UNIQUE_NAME       DATABASE_ROLE    SWITCHOVER_STATUS


--------- -------------------- ---------------- --------------------


TEST11G   TEST11GR             PHYSICAL STANDBY TO PRIMARY


执行SWITCHOVER切换到主库,并打开数据库:


SQL> alter database commit to switchover to primary;


数据库已更改。


SQL> alter database open;


数据库已更改。


SQL> select name, db_unique_name, database_role, switchover_status


 2  from v$database;


NAME      DB_UNIQUE_NAME       DATABASE_ROLE    SWITCHOVER_STATUS


--------- -------------------- ---------------- --------------------


TEST11G   TEST11GR             PRIMARY          NOT ALLOWED


切换成功。


在原主数据库,也就是切换完成后的STANDBY主库执行:


SQL> alter database recover managed standby database disconnect from session;


数据库已更改。


使得STANDBY数据库应用主库的归档。


在新的主数据库的节点2上,启动实例:


bash-3.00$ export ORACLE_SID=test11gr2


bash-3.00$ sqlplus "/ as sysdba"


SQL*Plus: Release11.1.0.6.0 - Production on星期五7月17 20:35:50 2009


Copyright (c) 1982, 2007, Oracle.  All rights reserved.


已连接到空闲例程。


SQL> startup pfile=/export/home/oracle/inittest11gr2.ora


ORACLE例程已经启动。


Total System Global Area 7418036224 bytes


Fixed Size                  2095808 bytes


Variable Size            3250758976 bytes


Database Buffers         4160749568 bytes


Redo Buffers                4431872 bytes


数据库装载完毕。


数据库已经打开。


SQL> select instance_name, status from v$instance;


INSTANCE_NAME    STATUS


---------------- ------------


test11gr2        OPEN


SQL> select instance_name, status from gv$instance;


INSTANCE_NAME    STATUS


---------------- ------------


test11gr2        OPEN


test11gr1        OPEN


SQL> select name, db_unique_name, database_role


 2  from v$database;


NAME      DB_UNIQUE_NAME                 DATABASE_ROLE


--------- ------------------------------ ----------------


TEST11G   TEST11GR                       PRIMARY


至此,单实例数据库到RAC环境STANDBY的SWITCHOVER操作完成。同时,单实例数据库升级到RAC环境数据库的操作也完成了。


如果愿意,现在可以设置RAC环境的DB_RECOVERY_FILE_DEST参数。


使用这种办法升级RAC环境,所需要的停机时间非常短。如果前期准备工作顺利,只需要5到30分钟的停机时间。


而且采用这种方法,原数据库环境作为RAC环境的STANDBY数据库。如果一旦升级后RAC环境出现问题,或者不适应系统的压力。可以通过SWITCHOVER的方法快速的切换为原始环境,且不会丢失任何的数据。


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html