DataGuard角色切换分为两种情况:
1.正常角色切换(switchover)
2.故障转移切换(failover)
通常情况下,数据库运行正常时,不需要执行DataGuard的角色切换.
当数据库所在主机或数据库发生故障,不能及时解决的情况下,就需要进行DataGuard的角色转换.最大化保证业务运行,尽量减少损失.
一、正常角色切换(switchover)
switchover属于正常的DataGuar角色切换,切换后,原primary数据库转换角色为standby database;原standby database转换角色为primary database.
它们两个之间的保护关系依然可以维持.
概括的说,switchover分为三个部分,八个步骤.
第一部分:primary database端:
1.查看primary数据库是否能执行切换
执行切换时,确保数据库中除了数据库后台进程外没有其它用户登陆,也不能有job在运行(job定义为user类型的进程)
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
2.执行primary到standby的switchover
SQL> alter database commit to switchover to physical standby;
Database altered.
3.关闭数据库,重新启动到standby状态
SQL> shutdown immediate
SQL> startup mount
SQL> select db_unique_name,database_role,switchover_status from v$database;
DB_UNIQUE_NAME DATABASE_ROLE SWITCHOVER_STATUS
------------------------------ ---------------- --------------------
orcl PHYSICAL STANDBY TO PRIMARY
第二部分:standby database端:
4.查看standby数据库是否能进行switchover
SQL> select db_unique_name,database_role,switchover_status from v$database;
DB_UNIQUE_NAME DATABASE_ROLE SWITCHOVER_STATUS
--------------------- ---------------- --------------------
dgorcl PHYSICAL STANDBY TO PRIMARY
5.将standby数据库转换为primary角色.
SQL> alter database commit to switchover to primary;
Database altered.
6.关闭数据库,重新启动到primary状态,准备接管前端应用.
SQL> shutdown immediate
SQL> startup mount
SQL> select db_unique_name,database_role,switchover_status from v$database;
DB_UNIQUE_NAME DATABASE_ROLE SWITCHOVER_STATUS
--------------------- ---------------- --------------------
dgorcl PRIMARY TO STANDBY
SQL> alter database open;
Database altered.
第三部分:切换后角色:
7.查看new primary database归档参数等状态,确认是否能正常传送归档日志到new standby database
SQL> show parameter log_archive
SQL> show parameter fal
SQL> show parameter standby_file
8.切换日志.确认新DataGuard生效.
SQL> alter system switch logfile;
System altered.
二、故障转移切换(failover)
Failover属于不正常状态下的DataGuard角色切换.
切换后,原standby database 转换角色为new primary database,接管原primary database的应用继续提供服务.
而原primary database因为其它原因(比如所在主机故障造成不可用)而不可用,废弃.之后可以重新再搭建DataGuard环境,继续提供保护.
因为Failover后原primary database不可用,所以,切换过程中,不需要对原primary database进行切换操作.
1.比对主备库之间是否存在日志的差异.
--备库最大归档日志序列:
SQL> select unique thread#,max(sequence#) over(partition by thread#) from v$archived_log;
THREAD# MAX(SEQUENCE#)OVER(PARTITIONBYTHREAD#)
---------- --------------------------------------
1 116
比对主,备库之间日志序列差异,从主库copy差异日志文件到备库(包括未归档日志文件,最大化减少数据损失).
2.确认归档日志的断点后,需要从primary database所在主机复制断点的归档日志到standby database所在主机.
scp /../.. oracle@ip or hostname:/xxx
3.手工恢复未应用的日志
SQL> recover standby database; --手工恢复(主要应用于未归档的主库online logfile,执行该命令后根据提示输入copy过来的日志文件路径)
例:
SQL>recover standby database;
SQL> recover standby database;
ORA-00279: change 327228 generated at 07/01/2008 15:41:20 needed for thread 1
ORA-00289: suggestion : /z02/arch/dgorcl_1_11_658924314.dbf
ORA-00280: change 327228 for thread 1 is in sequence #11
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/z02/redo02.log
Log applied.
Media recovery complete.
SQL>
SQL>
4.激活数据库.
SQL> recover managed standby database disconnect;
Media recovery complete.
SQL>
SQL> recover managed standby database finish;
Media recovery complete.
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
NOT ALLOWED
SQL> alter database commit to switchover to primary;
alter database commit to switchover to primary
*
ERROR at line 1:
ORA-16139: media recovery required
SQL>alter database activate standby database;
Database altered.
SQL> shutdown immediate
SQL> startup