Oracle DG(DataGuard)中,角色转换包括Switchover和Failover两种。Switchover相对比较简单和常见,这里不做赘述。这里,本文仅就Failover及然后将Failed Primary Database转换为Physical Standby Database的操作和过程做介绍和说明。
一.备库Failover为主库
1.主库失败
--我们kill掉主库的lgwr进程模拟主库失败。
$ ps -ef | grep lgwr
$ kill -9 6792
2.备库停止恢复应用
$ sqlplus / as sysdba
--停止恢复应用进程
SQL> alter database recover managed standby database cancel;
--检查备库切换状态和角色
SQL> select switchover_status,database_role from v$database;
--注:
1)上述SQL查询结果中转换状态为“NOT ALLOWED”。
3.备库应用所有已接收日志
--应用所有已接收日志
SQL> alter database recover managed standby database finish;
--检查备库转换状态和角色
SQL> select switchover_status,database_role from v$database;
--注:
1)上述SQL查询结果中转换状态变为“TO PRIMARY”,说明当前备库可以切换为主库。
4.备库切换为主库
--备库切换为主库
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
--注:
1)上述SQL查询结果中数据库角色变为PRIMARY,说明备库已转换为主库,Failover成功。
二.原主库恢复上线后切换为备库
备库Failover为主库后,原主库故障解决并重新启动上线,其角色仍然是Primary,由于原备库已转换为Primary,因此,需要将原主库转换为备库,转换方法主要包括如下三种:
1)以当前新主库为基础,重新搭建备库(参照DG搭建文档,此处不再赘述)。
2)利用Oracle Flashback,将原主库转换为备库。
3)通过rman备份,将原主库转换为备库。
1.用Flashback技术将原主库转换为备库
1)新主库上获取原备库转换成主库时的SCN
SQL> select to_char(standby_became_primary_scn) from v$database;
2)根据1)中查询的SCN将原主库闪回至该SCNFlash back
SQL> shutdown immediate
SQL> startup mount
SQL> flashback database to scn 7879981;
--注:
1)由此可见,该方法的前提数据库的flashback_on的特性已开启,开启命令为:alter database flashback on。
3)原主库转换为备库
SQL> alter database convert to physical standby;
SQL> shutdown immediate
SQL> startup
4)新备库(原主库)启用恢复应用进程
SQL> alter database recover managed standby database using current logfile disconnect from session;
2.通过RMAN将原主库转换为备库
1)新主库上获取原备库转换成主库时的SCN
SQL> select to_char(standby_became_primary_scn) from v$database;
2)根据1)中查询的SCN将原主库恢复到该SCN
RMAN > run
{set until scn <7879981+1>;
restore database;
recover database;
}
3)原主库转换为备库
SQL> alter database convert to physical standby;
SQL> shutdown immediate
SQL> startup mount
SQL> alter database open read only;
4)备库启用恢复应用进程
SQL> alter database recover managed standby database using current logfile disconnect from session;