1.如果当前备库是处于最大保护(maximum protection)模式,要进行故障转移,必须先修改为最大性能(maximum performance)模式。修改方法:

1.1 查看当前备库的保护模式:

SQL > select name,db_unique_name,protection_mode from v$database;  

1.2 修改为最大性能保护模式:

SQL> alter database set standby database to maximize performance;


在Oracle 11g里,Data Guard 切换多了一个新的功能:flush redo。

      Flush 能把没有发送的redo 从主库传送到standby库。 只要主库能启动到mount 状态,那么Flush 就可以把没有发送的归档和current online redo 发送到备库。

Flush语法:

      SQL> ALTER SYSTEM FLUSH REDO TO target_db_name;

      这里的target_db_name 是我们在主库的db_unique_name 名称。 也就是在tnsnames.ora 文件配置的。 Flush 会将未发送的redo 从主库传到备库,并且等待redo 在standby 库上apply 之后返回成功。 所以只要Flush成功,那么Failover 就没有主句丢失。

      如果说我们的Primary 已经不能启动到mount 状态,那么就只能按照之前的方法来。 Oracle 10g 下就是这么操作的。


2.查看是否有归档日志的GAP:

   SQL> SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;

   SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;


3.加载copy归档归档日志信息至控制文件

SQL> ALTER DATABASE REGISTER  physical  logfile  '路径';

SQL>alter database register physical logfile ‘e:\log\1_1324_70523277.DBF’;


4.对比主备库归档日志列表的完整性,查看是否应用完毕

SYS@LEO> select sequence#,ARCHIVED,APPLIED from v$archived_log;   主库归档日志列表

SEQUENCE# ARC APP

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

      10 YES YES

      11 YES NO

      11 YES YES

      12 YES NO

      12 YES YES

SYS@OEL> select sequence#,ARCHIVED,APPLIED from v$archived_log;   备库归档日志列表

      10 YES YES

      11 YES YES

      12 YES YES


5.再应用redo前,要确保上面的备份日志已经全部运用完毕。redo日志应用问题


5.1 如果用户在主库commit 之后,然后shutdown abort, 这时候,主库的online redo 会自动的写入备库的最后一个归档文件里(大小会发生变化)。 我们在恢复的时候需要对备库的最后一个归档文件进行重新的注册。


sql>alter database register physical logfile 'filespec1';


   5.2 如果说,主库OS是整个宕机了。 这个时候,online redo 是不会发送到备库。所以我们需要手工的将主库的所有online redo copy到备库。 然后进行recover。

步骤如下:

SQL> alter database recover managed standby database cancel;

Database altered.


SQL> recover standby database until cancel;

ORA-00279: change 509016 generated at 11/05/2010 11:40:27 needed for thread 1

ORA-00289: suggestion : /u01/archive/1_17_734225750.dbf

ORA-00280: change 509016 for thread 1 is in sequence #17

-- 默认情况下会提示需要归档17, 实际上这个序列为17的归档还没有生成,我们忽略它,使用我们刚才copy过来的redo 日志来恢复。

Specify log: {=suggested | filename | AUTO | CANCEL}

/u01/app/oracle/oradata/orcl/redo01.log   -- 注意, 这个位置是我手动写的

Log applied.

Media recovery complete.


这里一次就搞定了。 实际上有三个redo,如果不确定使用哪个redo的,只能一个一个试。


当我们使用了recover standby database until cancel之后,只能使用强制激活备库,如果使用正常模式,会提示我们需要:

ORA-16139: media recovery required


5.3 最后强制激活备库:

sql> alter database recover managed standby database cancel;

sql> recover standby database until cancel;

sql>alter database activate standby database;

sql>shutdown immediate;

sql>startup


6. Switchover

6.1 主库操作:

(1)查看状态:

sql>select switchover_status from v$database;


(2)切换

sql> alter database commit to switchover to physical standby with session shutdown;

SQL> shutdown immediate;

SQL> startup;

SQL> alter database mount standby database;

SQL> recover managed standby database disconnect;


6.2 备库操作:

SQL> alter database commit to switchover to primary with session shutdown;

SQL> shutdown immediate

SQL> startup