一、切换(swithover)和故障转移(failover)区别

  • 1、切换适用于主备工作状态良好。主库变更状态为备库,备库变更状态为主库。

  • 2、故障转移,适用于主库故障、崩溃,不可修复,让备库变更状态,接替主库角色。

二、swithover步骤

2.1、切换前准备


1、检查主库上是否存在standby redo logfile

select group#,member,type from v$logfile where type='STANDBY';

基于rac到rac dataguard得切换和故障转移_第1张图片


2、在物理standby数据库上检查当standby端切换为主库时,是否能传递redo数据到新的standby数据库


image.png

tnsping orcl  10 

基于rac到rac dataguard得切换和故障转移_第2张图片

3、在主库上测试到备机得tnsnames是否联通

基于rac到rac dataguard得切换和故障转移_第3张图片


4、在swithover前检查物理standby数据库上是否有临时表空间的设置

image.png

5、检查主库和物理standby数据库是否有离线的数据文件

image.png

6、确定主库和物理备份库的最大归档日志序列号是否匹配


在主库上查询每一个实例的最大归档序列号

image.png

在备库上查询每一个备库的最大归档序列号

select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#;

image.png

7、检查物理standby 上的MRP 进程是否处于运行状态

基于rac到rac dataguard得切换和故障转移_第4张图片

8、确保数据库无job运行,同时禁止rmanexp或者expdp备份

基于rac到rac dataguard得切换和故障转移_第5张图片


如果有考虑禁止job运行,并kill掉。方法如下:

declare

begin

    DBMS_JOB.BROKEN(27,true);

end;

kill会话信息

根据sid查询出session信息

select SID,SERIAL# from V$Session where SID='9'; 

alter system kill session '9,43767'; 

9、设置JOB_QUEUE_PROCESSES =0 

基于rac到rac dataguard得切换和故障转移_第6张图片

10、在rac环境中关闭一个数据库实例

oracle@snode1:~> srvctl stop instance -d srac -n snode2

oracle@snode1:~> srvctl status instance -d srac -i srac1,srac2

Instance srac1 is running on node snode1

Instance srac2 is not running on node snode2


11、备库停止redo应用,并且确保standby数据库处于挂载状态

基于rac到rac dataguard得切换和故障转移_第7张图片


srvctl stop database -d trac -o immediate;

srvctl start database -d trac -o mount;

image.png


12、建议给主库和物理standby库做个全备份


2.3、用sqlplus执行切换过程

1、在主库上执行如下命令查询主库状态是否为TO STANDBY 或者SESSION ACTIVE

SQL> select switchover_status,open_mode,database_role from v$database;

image.png


2、在主库上执行如下swithover命令。


SQL>alter database commit to switchover to physical standby with session shutdown;


3、在standby节点上运行switchover命令 

SQL>  select name,open_mode,database_role,protection_mode from gv$database;

 

NAME       OPEN_MODE           DATABASE_ROLE    PROTECTION_MODE

--------- -------------------- ---------------- --------------------

SRAC        MOUNTED        PHYSICAL STANDBY MAXIMUM PERFORMANCE

SRAC        MOUNTED        PHYSICAL STANDBY MAXIMUM PERFORMANCE

 

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN

*

ERROR at line 1:

ORA-16139: media recovery required

 

SQL> ALTER  DATABASE RECOVER MANAGED STANDBY  DATABASE DISCONNECT FROM SESSION;

 

Database altered.

 

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

 

Database altered.

基于rac到rac dataguard得切换和故障转移_第8张图片

4、在新主库节点上重新启动rac read write 状态

srvctl stop database -d torcl -o immediate;

srvctl start database -d torcl -o open;

SQL>select db_unique_name,database_role,open_mode from v$database;

基于rac到rac dataguard得切换和故障转移_第9张图片


5、在新备库(原主库)节点上重启数据库并应用redo log

srvctl stop database -d orcl -o immediate;

srvctl start database -d orcl -o open;

alter database recover managed standby database using current logfile disconnect from session;


三、failover步骤

3.1、failover 简介

  1、failover主要用于主库由于服务器层或存储层产生的问题导致primary  database变的不可访问。

2、对于faileover的考虑

  • standby数据库的硬件性能要满足生产环境。

  • 确保所有可用的redo被应用到standby数据库。

  • faileover后new primary database处于最大性能保护模式。而不管之前数据库的保护模式最大保护或者最大性能。

3.2、failover切换

1、如果主库崩溃后能够启动主库到mount状态,则执行如下命令

alter system flush redo to 'db_unique_name'; 

 注意需要给standby 数据库的db_unique_name加单引号。

例如,假设备库的db_unique_name为dg2 则在主库执行如下命令

生产环境命令为在主库执行如下命令:alter system flush redo to ‘torcl’;

基于rac到rac dataguard得切换和故障转移_第10张图片



2、检测主库和standby数据库的状态,在主库上检测生成的最大归档日志文件

在主库检测生成的最大归档日志文件

Select thread# max(sequence#) from v$archived_log group by thread#;


image.png


在备库检测已经应用的最大归档日志文件

select max(sequence#) from v$archived_log where applied='YES' group by thread#;

如下图

image.png

select  REGISTRAR,sequence#,applied from v$archived_log order by sequence#;

基于rac到rac dataguard得切换和故障转移_第11张图片

3、在备库处理未传递和应用的归档

说明

如果备库查询到的已经应用的最大日志序列号和主库有差别,则需要从主库手动拷贝归档到备库,并在备库上注册和应用归档。

如果无差别,则无需执行这一步骤

ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_7.arc';

Alter  database recover managed standby database disconnect from sessions;

如果主库的归档已经传递到了备库,但是没有应用,则手动应用。

如果主库完全不可用,则备库需要恢复,恢复前需要在备库上应用所有已经传递过来的归档

 

4、在standby库即备库上停止redo应用

说明

Force 关键字用于立即终止RFS进程传递

FINISH 关键子用于failover和恢复当前standby redo logfile

SQL> alter database recover managed standby database cancel;


基于rac到rac dataguard得切换和故障转移_第12张图片

alter database recover managed standby database finish force;

select thread#,sequence#,process,status,client_process from v$managed_standby

基于rac到rac dataguard得切换和故障转移_第13张图片


基于rac到rac dataguard得切换和故障转移_第14张图片


在物理standby上执行如下命令使备库变更主库。

SQL>alter database commit to switchover to primary with session shutdown;


image.png

基于rac到rac dataguard得切换和故障转移_第15张图片


6、查询转换后的数据库状态

select db_unique_name,database_role,standby_became_primary_scn from v$database;

image.png


基于rac到rac dataguard得切换和故障转移_第16张图片


7、重启standby新数据库到 read write状态。

srvctl stop database -d torcl -o immediate;

srvctl start database -d torcl -o open;