● 确保可能成为primary 数据库的standby 服务器已经处于archivelog 模式。
● 确保standby 数据库的临时文件存在并匹配primary 数据库的临时文件
●确保standby 数据库的RAC 实例只有一个处于open 状态。(对于rac 结构的standby 数据库,在角色转换时只能有一个实例startup。其它rac 实例必须统统shutdown,待角色转换结束后再startup)
不可预知原因导致primary 数据库故障并且短期内不能恢复就需要failover。如果是这种切换那你就要小心点了,有可能只是虚惊一场,甚至连你可能损失的脑细胞的数量都能预估,但如果运气不好又没有完备的备份恢复策略而且primary 数据并非处于最大数据保护或最高可用性模式地话,黑黑,哭是没用地,表太伤心了,来,让三思GG 安慰安慰你,这种情况下呢丢失数据有可能是难免的,并且如果其故障未能修复,那它甚至连快速修复成为standby 的机会也都失去了呐,咦,你脑门怎么好像在往外冒水,难道是强效净肤液,你的脸也忽然好白皙哟~~~~
SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
E:\ora10g>set oracle_sid=jssweb
E:\ora10g>sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on 星期四12 月13 09:41:29 2007
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
已连接。
SQL> selectswitchover_statusfromv$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
首先将primary 转换为standby 的角色,通过下列语句:
SQL> alterdatabasecommittoswitchovertophysicalstandby;
数据库已更改。
SQL> shutdownimmediate
ORA-01507: 未装载数据库
ORACLE 例程已经关闭。
SQL> startupmount
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1289484 bytes
Variable Size 104858356 bytes
Database Buffers 54525952 bytes
Redo Buffers 7098368 bytes
数据库装载完毕。
E:\ora10g>set oracle_sid=jsspdg
E:\ora10g>sqlplus " / as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on 星期四12 月13 10:08:15 2007
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
已连接。
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
此时待转换standby 数据库switchover_status 列值应该是"TO_PRIMARY",如否则检查其初始化参数文件中的设置,提示一下,比着原primary 数据库的初始化参数改改。
SQL> alter database commit to switchover to primary;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> show parameter db_unique
NAME TYPE VALUE
-------------------- ----------- ------------------------------
db_unique_name string jsspdg
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
67
SQL> altealter system switch logfile;
系统已更改。
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
68
SQL> show parameter db_unique
NAME TYPE VALUE
-------------------- ----------- ------------------------------
db_unique_name string jssweb
SQL> select max(sequence#) from v$archived_log;
MAX(SEQUENCE#)
--------------
68
二、物理standby的failover
● 多数情况下,其它逻辑/物理standby 数据库不直接参与failover 的过程,因此这些数据库不需要做任何操作。
● 某些情况下,新的primary 数据库配置之后,需要重新创建其它所有的standby 数据库。
一般情况下failover 都是表示primary 数据库瘫痪,最起码也是起不来了,因此这种类型的切换基本上不需要primary 数据库做什么操作。所以下列步骤中如果有提到primary 和standby 执行的,只是建议你如果primary还可以用,那就执行一下,即使它能用你却不执行,也没关系,不影响standby 数据库的切换:)
1、检查归档文件是否连续
查询待转换standby 数据库的V$ARCHIVE_GAP 视图,确认归档文件是否连接:
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
未选定行
SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
SQL> select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;
SQL> alter database recover managed standby database finish force;
数据库已更改。
SQL> alter database commit to switchover to primary;
数据库已更改。
SQL> alter database open;
数据库已更改。