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: {<RET>=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