物理Data Guard 下Failover 时Redo 的处理问题
Oracle Data Guard Linux 平台 Physical Standby 搭建实例
Failover 是失败切换。 这种情况下切换对redo 的处理,就显的很重要。如果处理好,就不会有数据丢失。 否则就会有数据丢失。
在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 下就是这么操作的。
一. 正常的Failover
1.1 检查Gap
sql> select thread#, low_sequence#, high_sequence# from v$archive_gap;
如果有,将对应的归档文件copy到备库,在注册它
sql>alter database register physical logfile 'filespec1';
注意: 如果有Gap存在,并且没有解决。 那么是不能正常的进行一个Failover。 只能进行一个强制的Failover。 这种情况下会有数据丢失。
sql> alter database activate physical standby database;
1.2 解决gap问题后,进行切换
1.2.1 取消Apply
SQL> recover managed standby database cancel;
1.2.2 结束Apply
(1)在oracle 10gR2 或之后的版本:如果在备用库上有备用库日志文件
SQL> alter database recover managed standby database finish; -- [force|wait|nowait]
在执行这个命令的时候,如果主库和备库之间的网络中断了。 那么备库的RFS进程就会等待网络的连接,直到TCP超时。 因此在这种情况下,我们就需要加上Foce 关键字。
(2)在oracle 10gR2之前的版本:没有备库日志文件
SQL> alter database recover managed standby database finish skip standby logfile;
注意:如果执行了这条命令,就不能在进行recover standby database;
1.2.3 将备库切换成主库
SQL> alter database commit to switchover to primary;
SQL> shutdown immediate;
SQL> startup