Oracle Dataguard中,角色转换包含两类:Switchover和Failover。上文《Oracle Dataguard之switchover》中,我们已经谈过了switchover,本文将谈谈failover以及如何将failed primary database转换为physical standby database。
failover
一、 主库挂掉
在这里我们杀掉lgwr进程模拟实例崩溃。
[oracle@node2 ~]$ ps -ef | grep lgwr -->> 注意:在这个案例中,node2是主库
oracle 1375 1 0 14:07 ? 00:00:21 ora_lgwr_victor
oracle 1668 1654 0 16:08 pts/0 00:00:00 grep lgwr
[oracle@node2 ~]$ kill -9 1375 -->> 杀掉lgwr进程,实例崩溃,无法访问
二、 备库上停止Redo Apply -->> node1 为备库
SQL> alter database recover managed standby database cancel;
SQL> select switchover_status,database_role from v$database;
SWITCHOVER_STATUS DATABASE_ROLE
-------------------- ----------------
NOT ALLOWED PHYSICAL STANDBY
三、 备库上finish applying all received redo data -->> node1 为备库
SQL> alter database recover managed standby database finish;
SQL> select switchover_status,database_role from v$database;
SWITCHOVER_STATUS DATABASE_ROLE
-------------------- ----------------
TO PRIMARY PHYSICAL STANDBY
-->> 注意:在执行完上个命令后,switchover_status从not allowed变为to primary了,即可以切换为主库了。
四、 备库开始switchover
SQL> alter database commit to switchover to primary with session shutdown;
SQL> alter database open;
SQL> select switchover_status,database_role from v$database;
SWITCHOVER_STATUS DATABASE_ROLE
-------------------- ----------------
RESOLVABLE GAP PRIMARY
此时,备库角色已经成功切换为Primary了,failover成功。
在failover之后,如果原主库故障解决,可以重新上线,我们可以看到,在startup以后,它的角色仍然是Primary,很显然,一个dataguard配置中,是不可能有两个主库 的。这时,我们可以将这个原主库转换为新主库的备库。主要有三种方法:一、按照先前的方法,利用新主库的备份,将这个原主库重新配置为备库。二、利用flashback。 三、利用rman备份。
在这里,我们主要谈谈第二种和第三种方法。
Flashing Back a Failed Primary Database into a Physical Standby Database
一、 查询原备库转换成主库时的SCN -->> node1 上操作
SQL> select to_char(standby_became_primary_scn) from v$database;
TO_CHAR(STANDBY_BECAME_PRIMARY_SCN)
----------------------------------------
901719
二、 Flash back原主库 -->> 即node2
SQL> shutdown immediate
SQL> startup mount
SQL> flashback database to scn 901719;
-->> 注意,前提是flashback_on的特性必须开启,alter database flashback on;
三、 将原主库转换为备库 -->> node2 上操作
SQL> alter database convert to physical standby;
SQL> shutdown immediate
SQL> startup
四、 现备库上启用Redo Apply -->> node2 上操作
SQL> alter database recover managed standby database using current logfile disconnect from session;
基本OK!
Converting a Failed Primary into a Standby Database Using RMAN Backups
一、 查询原备库转换成主库时的SCN
SQL> select to_char(standby_became_primary_scn) from v$database;
二、 恢复原主库
RMAN > run
{ set until scn <standby_became_primary_scn+1>;
restore database;
recover database;
}
三、 将原主库转换为备库
SQL> alter database convert to physical standby;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database open read only;
四、 现备库上启用Redo Apply
SQL> alter database recover managed standby database using current logfile disconnect from session;
基本OK!