Switchover动作是不会引起数据丢失的,Standby可以保证接受并且应用所有的Redo Log数据。而Failover则不好说,根据不同的保护模式(Protection Mode),一个事务在主库上面是否被commit,是取决于standby上是否接受和应用上日志数据。所以,在进行Failover的时候,是可能会丢数据的。
在进行Failover之后,Primary库实际上是退出了Oracle HA架构体系,成为游离对象。Standby在切换之后就成为新的Primary。这个过程就是角色切换。
操作过程:
1.模拟primary崩溃,直接关闭。
SQL> shutdown abort
ORACLE instance shut down.
真实环境下,Primary的故障是多样的,现象也是多样的。最彻底的就是Primary站点直接失去联系,不能访问。这种情况出现并不多,但是也能出现。比如磁盘(非冗余)损坏、断电、地震天灾。最简单的情况也许是监听器停止工作需要重启、实例停止等等。
故障的多样,也就意味着恢复的机会是多样的。在11g里面,Oracle认为最理想的情况是,虽然Oracle数据库不能打开,但是可以启动到mount状态。
Mount状态之所以重要,就在于如果可以到这个阶段,控制文件control_file就可以读取到,归档日志和在线日志的位置、信息都可以读取到。这也就意味着最大可能性的进行数据恢复,避免数据损失。
在11g中,推出了日志手工flush的功能,来弥补日志数据没有传递的问题。
#10g版本下没有办法自动flush redo的。解决的方法也是有的,就是从Primary目录中,将日志拷贝到Standby端,手工去加载。
SQL> alter system flush redo to 'db131';
System altered.
检查日志gap的问题,可以查看视图v$archive_gap。
SQL> select thread#, low_sequence#, high_sequence# from v$archive_gap;
no rows selected
如果没有发现明显的gap现象,说明此次的failover不会有数据损失情况。在standby端,要进行关闭apply和结束应用动作。
2.将备库进行关闭apply和结束应用动作。
SQL> select thread#, low_sequence#, high_sequence# from v$archive_gap;
no rows selected
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database recover managed standby database finish;
Database altered.
将角色切换为primary,观察database_role在切换角色前后的变化:
SQL> select name,open_mode,database_role,db_unique_name from v$database;
NAME OPEN_MODE DATABASE_ROLE DB_UNIQUE_NAME
--------- -------------------- ---------------- ------------------------------
ORCL READ ONLY PHYSICAL STANDBY db131
SQL> alter database activate physical standby database;
Database altered.
SQL> select name,open_mode,database_role,db_unique_name from v$database;
NAME OPEN_MODE DATABASE_ROLE DB_UNIQUE_NAME
--------- -------------------- ---------------- ------------------------------
ORCL MOUNTED PRIMARY db131
最后打开备库:
SQL> alter database open;
Database altered.
SQL> select name,open_mode,database_role,db_unique_name from v$database;
NAME OPEN_MODE DATABASE_ROLE DB_UNIQUE_NAME
--------- -------------------- ---------------- ------------------------------
ORCL READ WRITE PRIMARY db131
Failover做完 后,HA环境已结束,需要重新搭建dataguard。