前面的文章提到,当用grid contorl中的broker页面配置的dataguard,进行switchover切换时,只需在页面中点击“切换”按钮,主备切换操作就会自动在后台完成,方便快捷。但是当我们无法登录grid control页面,而又需要紧急进行切换时,这就是手工进行切换操作。
初始环境:
主库:oracle11gR2 RAC rac1,rac2(racdb1,racdb2)
备库:oracle11gR2单实例 single (racstd)
1.下面就是手动switchover切换的步骤及注意的问题:
假设需要在rac2实例上进行switchover操作
--在rac2上直接进行切换操作,
--报如下错误
SQL> alter database commit to switchover to standby;
alter database commit to switchover to standby
*
第 1行出现错误:
ORA-01105:装载操作与其他实例的装载操作不兼容
--查询RAC环境其它活动实例
SQL> Select Instance_Name, Host_Name From Gv$instance
2 Where Inst_Id <> (Select Instance_Number From V$instance);
INSTANCE_NAME HOST_NAME
---------------- ----------------------------------------------------------------
racdb2 rac2.localdomain
错误问题原因:
在RAC+dataguard环境手动主备切换时,主库和备库都必需只保留一个活动实例,才能完成切换操作(通过broker管理页面则不需要这步手动关闭实例操作,则在后台自动完成),所以切换前首先要关闭其它不需要切换操作的实例,切换完成后再重新启动即可。
--关闭rac1实例(racdb1)
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE例程已经关闭。
--然后再回到rac2,此时进行切换操作
SQL> alter database commit to switchover to standby;
alter database commit to switchover to standby
*
第 1行出现错误:
ORA-01093: ALTER DATABASE CLOSE仅允许在没有连接会话时使用
--切换为备库操作
SQL> alter database commit to switchover to standby with session shutdown;
数据库已更改。
SQL> select name,open_mode,DATABASE_ROLE,PROTECTION_MODE from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
RACDB READ WRITE PHYSICAL STANDBY MAXIMUM PERFORMANCE
--转换操作完成后,racdb2实例会自己关闭
SQL> shutdown immediate
ORA-01092: ORACLE instance terminated. Disconnection forced
SQL> select name,open_mode,DATABASE_ROLE,PROTECTION_MODE from v$database;
ERROR:
ORA-03114:未连接到 ORACLE
--rac2的alert日志:
Process (ospid 31592) is suspended due to switchover to physical standby operation.
Wed Sep 05 12:17:45 2012
Performing implicit shutdown abort due to switchover to physical standby
Shutting down instance (abort)
--在rac2重新启动原主库实例(racdb2)
SQL> startup
ORACLE例程已经启动。
Total System Global Area 1235959808 bytes
Fixed Size 2227904 bytes
Variable Size 922747200 bytes
Database Buffers 301989888 bytes
Redo Buffers 8994816 bytes
数据库装载完毕。
数据库已经打开。
SQL> select name,open_mode,DATABASE_ROLE,PROTECTION_MODE from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
RACDB READ ONLY PHYSICAL STANDBY MAXIMUM PERFORMANCE
--在single racstd实例,切换为主库操作
SQL> alter database commit to switchover to primary with session shutdown;
数据库已更改。
--重新启动原备库
SQL> select name,open_mode,DATABASE_ROLE,PROTECTION_MODE from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
RACDB MOUNTED PRIMARY MAXIMUM PERFORMANCE
SQL> shutdown immediate
ORA-01109:数据库未打开
已经卸载数据库。
ORACLE例程已经关闭。
SQL> startup mount
ORACLE例程已经启动。
Total System Global Area 1235959808 bytes
Fixed Size 2227904 bytes
Variable Size 805306688 bytes
Database Buffers 419430400 bytes
Redo Buffers 8994816 bytes
数据库装载完毕。
SQL> select name,open_mode,DATABASE_ROLE,PROTECTION_MODE from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
RACDB MOUNTED PRIMARY MAXIMUM PERFORMANCE
SQL> alter database open;
数据库已更改。
SQL> select name,open_mode,DATABASE_ROLE,PROTECTION_MODE from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
RACDB READ WRITE PRIMARY MAXIMUM PERFORMANCE
--在rac2打开实时应用查询功能
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
数据库已更改。
SQL> select name,open_mode,DATABASE_ROLE,PROTECTION_MODE from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
RACDB READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE
SQL>
--最后再启动rac1实例:
SQL> startup
ORACLE例程已经启动。
Total System Global Area 1235959808 bytes
Fixed Size 2227904 bytes
Variable Size 922747200 bytes
Database Buffers 301989888 bytes
Redo Buffers 8994816 bytes
数据库装载完毕。
数据库已经打开。
SQL>
SQL> select name,open_mode,DATABASE_ROLE,PROTECTION_MODE from v$database;
NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
--------- -------------------- ---------------- --------------------
RACDB READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE
--最后可以检查切换是否成功,可以单实例数据库端建测试表,然后在RAC数据库端查看表是否同步,不再测试
2.手工切换后broker页面不再同步的问题
当完成上面的手工switchover后,虽然切换成功,但此时grid control页面的broker页面显示状态却不正常,如下:
[oracle@rac2 dbs]$ dgmgrl sys/oracle123
DGMGRL for Linux: Version 11.2.0.3.0 - 64bit Production
Copyright (c) 2000, 2009, Oracle. All rights reserved.
欢迎使用 DGMGRL,要获取有关信息请键入 "help"。
已连接。
DGMGRL> show configuration
配置 - racdb
保护模式: MaxPerformance
数据库:
racdb -主数据库
错误: ORA-16810: 检测到数据库的多个错误或警告
racstd -物理备用数据库
错误: ORA-16810: 检测到数据库的多个错误或警告
快速启动故障转移: DISABLED
配置状态:
ERROR
问题原因:
因为开始我们的dataguard是用grid control的broker页面进行配置和管理的,手工进行切换后,broker中信息不能和手工切换信息同步,导致dataguard状态和broker状态不一致。
解决办法:
使用broker重新配置添加dataguard信息,步骤如下:
--登录dataguard环境任一服务器
--首先删除dataguard的broker配置
[oracle@rac1 log]$ dgmgrl sys/oracle123
DGMGRL> help remove
删除配置,数据库或实例
语法:
REMOVE CONFIGURATION [PRESERVE DESTINATIONS];
REMOVE DATABASE <database name> [PRESERVE DESTINATIONS];
REMOVE INSTANCE <instance name> [ON DATABASE <database name>];
DGMGRL> remove configuration
已移去配置
DGMGRL> show configuration
ORA-16532: Data Guard中介配置不存在
配置详细资料不能由 DGMGRL确定
--然后再登录grid control的broker管理页面重新配置dataguard
点击“添加备用数据库”
选择“使用dataguard中介管理现有备库”
选择现有备库
查看配置
展开
复查配置
执行配置
执行完成
跳转到broker管理页面
--命令查看状态
DGMGRL> show configuration
配置 - racstd
保护模式: MaxPerformance
数据库:
racstd -主数据库
racdb -物理备用数据库
快速启动故障转移: DISABLED
配置状态:
SUCCESS