WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: Oracle
2009-12-13 13:58:45
利用Oracle的STANDBY技术,可以将单实例数据库升级到RAC数据库。这种方式可以有效的降低单实例迁移到RAC环境的停机时间。
这篇文章描述单实例环境与RAC环境的SWITCHOVER过程。
利用STANDBY将单实例数据库升级为RAC环境(一):http://yangtingkun.itpub.net/post/468/494736
利用STANDBY将单实例数据库升级为RAC环境(二):http://yangtingkun.itpub.net/post/468/494766
前面已经成功搭建了单实例数据库TEST11G的RAC环境STANDBY数据库TEST11GR。STANDBY数据库的两个实例可以同时以READ ONLY方式启动。
下面为了执行SWITCHOVER操作,可以先关闭实例2:
bash-3.00$ export ORACLE_SID=test11gr2
bash-3.00$ sqlplus "/ as sysdba"
SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 7月 17 19:44:11 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.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 Database 11g Enterprise Edition Release 11.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: Release 11.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的方法快速的切换为原始环境,且不会丢失任何的数据。