Oracle DG主备架构两种切换方式总结(switch over和fail over)
一、DG主备正常切换(即有计划的切换)
主备正常switch over切换(即有计划的切换),这种切换方式无数据丢失
备注:
1)Oracle10g版本,RAC环境下,主备都只能保留一个实例,才能进行switch over,否则不容许。而且备库上,保留的实例,必须是MPR进程存在的实例。
2)11g版本以上,上面的限制已经取消,只需确保备库切换为主库时,必须MPR进程存在的实例。(如果条件允许,保留一个节点来切换,影响最小化)
1、查看主库状态,是否能够进行switch over切换
主库上执行
set linesize 200 pagesize 999
col open_mode format a10
select open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from v$database;
查询结果类似如下
OPEN_MODE DATABASE_ROLE PROTECTION_LEVEL PROTECTION_MODE SWITCHOVER_STATUS FOR
---------- ---------------- -------------------- -------------------- -------------------- ---
READ WRITE PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE TO STANDBY YES
根据SWITCHOVER_STATUS列,判断是否可以切换,To standby 或者session active表明可以进行切换,session active表示主备库有活动的session关联,在switchover前需要将这些session关闭(执行切换命令时加上with session shutdown)
2、主库上发起切换命令,切换为备库
主库上执行
Alter database commit to switchover to standby with session shutdown ;
这个命令完成后,主库自动down(集群环境,所有节点都会自动停止)
3、备库切换为主库
1)如果备库是集群,判断MPR日志应用进程在哪个节点,需要在MPR进程上完成备库切换为主库
备库上执行
查询MPR进程在哪个节点的语句
SELECT INST_ID,PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM GV$MANAGED_STANDBY where PROCESS like '%MRP%';
2)在MPR节点上,查看备库状态,是否能够切换为主库
备库上执行
set linesize 200 pagesize 999
col open_mode format a10
select open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from v$database;
查询结果类似如下
OPEN_MODE DATABASE_ROLE PROTECTION_LEVEL PROTECTION_MODE SWITCHOVER_STATUS FOR
-------------------- ---------------- -------------------- -------------------- -------------------- ---
READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE TO PRIMARY YES
根据SWITCHOVER_STATUS列,判断是否可以切换,TO PRIMARY表名可以进行切换
3)执行切换命令
备库上执行
alter database commit to switchover to primary with session shutdown ;
备注:集群环境,切换完成后,所有节点都会变为mount状态(数据库挂载状态)
4)切换后,检查备库状态
set linesize 200 pagesize 999
col open_mode format a10
select open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from v$database;
OPEN_MODE DATABASE_ROLE PROTECTION_LEVEL PROTECTION_MODE SWITCHOVER_STATUS FOR
---------- ---------------- -------------------- -------------------- -------------------- ---
MOUNTED PRIMARY UNPROTECTED MAXIMUM PERFORMANCE NOT ALLOWED YES
5)打开新的主库(源备库)
alter database open;
如果是集群环境,所有节点都需要执行数据库打开操作,这一点不要遗漏!!!
6)新主库检查状态
set linesize 200 pagesize 999
col open_mode format a10
select inst_id,open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from gv$database;
INST_ID OPEN_MODE DATABASE_ROLE PROTECTION_LEVEL PROTECTION_MODE SWITCHOVER_STATUS FOR
---------- ---------- ---------------- -------------------- -------------------- -------------------- ---
2 READ WRITE PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE FAILED DESTINATION YES
1 READ WRITE PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE FAILED DESTINATION YES
4、原先的主库,再次打开后,直接转变为standby db,直接应用日志即可
1)打开原先的主库
单库环境
sqlplus "/as sysdba"
startup
集群环境
srvctl start database -d orcl
2)检查状态
set linesize 200 pagesize 999
col open_mode format a10
select inst_id,open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from gv$database;
INST_ID OPEN_MODE DATABASE_ROLE PROTECTION_LEVEL PROTECTION_MODE SWITCHOVER_STATUS FOR
2 READ ONLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE RECOVERY NEEDED YES
1 READ ONLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE RECOVERY NEEDED YES
3)执行日志应用
alter database recover managed standby database using current logfile disconnect from session;
4)检查状态
set linesize 200 pagesize 999
col open_mode format a10
select inst_id,open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from gv$database;
INST_ID OPEN_MODE DATABASE_ROLE PROTECTION_LEVEL PROTECTION_MODE SWITCHOVER_STATUS FOR
1 READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE NOT ALLOWED YES
2 READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE NOT ALLOWED YES
至此switch over主备切换完成!
二、DG主备异常切换(主库意外挂掉,切换至备库接手对外服务)
主备异常切换,特指fail over切换,切换后主备环境破坏,备库需要重新搭建!大概率有数据丢失!
RAC环境中,关闭除了运行MRP进程的其他实例,然后再MRP存在的实例上执行。
执行切换前,备库最好是处于mount状态,可以提高切换速度。
(一)老版本切换方法(12c开始有新语法,但是老方法仍旧可用)
1、如果主库可以mount,将主库中所有未到备库的归档日志和redo刷新到备库
ALTER SYSTEM FLUSH REDO TO target_db_name;
备注:
1)target_db_name:用于指定目标备库的DB_UNIQUE_NAME,必须使用单引号括起来
2)语句必须在mount状态下执行
具体如下:
ALTER SYSTEM FLUSH REDO TO 'orcl_st';
2、如果主库不可以mount,使用下面方式尽可能将主库数据同步至备库
查询备库上的v$archivd_log视图,以获取redo的最大sequence号。
su - oracle
sqlplus "/as sysdba"
set linesize 20o pagesize 999
col standby_tns_name format a30
select inst_id,max(sequence#) ,min(sequence#) from gv$archived_log where applied='NO' group by inst_id order by 1;
将主库的最新归档日志传输到备库,然后注册该归档文件
ALTER DATABASE REGISTER PHYSICAL LOGFILE '归档日志文件名绝对路径';
继续查询备库上的v$archived_GAP视图,在确定备库上是否存在gap
SELECT inst_id,THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM gV$ARCHIVE_GAP;
如果有gap,请将gap的归档日志从主库传输到备库,然后在备库中继续注册归档文件。
ALTER DATABASE REGISTER PHYSICAL LOGFILE '归档日志文件名绝对路径';
重复执行,直至所有的gap间隙都得到解决
如果上面的1、2步骤,都不能达成,此问题不能解决,则在failover期间可能会丢失一些数据。
3、备库取消日志应用
alter database recover managed standby database cancel;
4、备库执行如下SQL语句应用完成所有接收到的归档日志。
alter database recover managed standby database finish force;
备注:如果上面的命令出错,无法解决错误(例如gap间隙),可以通过在目标备库上执行下面的SQL语句来强制切换(会丢失一些数据):
alter database activate physical standby database;
5、确认目标备库已经准备好切换成主库
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
TO PRIMARY或SESSIONS ACTIVE的值均表示目标备库已准备好切换到主库。如果返回结果不是这两个值,大概率只能执行强制切换。
6、目标备库上执行以下SQL语句将物理备库切换成主库
alter database commit to switchover to primary with session shutdown;
7、如果4-6步骤无问题,则表示failover切换完成,跳过这一步骤!!如果4-6步骤,切换出现问题,则只能强制切换(会丢失一些数据);
alter database activate physical standby database;
8、打开新主库
sqlplus "/as sysdba"
alter database open;
检查:
select inst_id,open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from gv$database;
9、建议立即对新主库执行完整备份
(二)12c版本开始,新的failover方法(旧方法也可以继续使用)
12c版本开始,failover有新语,方法如下
1-3步骤保持不变
4、目标备库上执行(语法有变动)
ALTER DATABASE FAILOVER TO targe_db_name;
备注:
1)target_db_name:用于指定目标备库的 DB_UNIQUE_NAME,必须使用单引号括起来
如果上面的命令执行报错,下面的命令忽略与原主库交互时遇到的任何故障,并在可能的情况下继续进行failover,如下
ALTER DATABASE FAILOVER TO targe_db_name FORCE;
5、如果4步骤无问题,则表示failover切换完成,跳过这一步骤即可!!如果步骤4,切换出现问题,则只能强制切换(会丢失一些数据);
alter database activate physical standby database
6、打开新主库
sqlplus "/as sysdba"
alter database open;
检查:
select inst_id,open_mode,database_role,protection_level,protection_mode,switchover_status,force_logging from gv$database;
7、建议立即对新主库执行完整备份
(三)FAILOVER切换总结
1、主库尽量将日志传输至备库中
2、备库取消日志一个应用(取消同步)
alter database recover managed standby database cancel;
3、尝试常规切换(常规切换不行、报错,则直接使用步骤四)
alter database recover managed standby database finish force;
alter database commit to switchover to primary with session shutdown;
shutdown immediate;
4、如果常规切换成功,步骤四无需执行!!如果fail over时,存在gap,常规切换不起作用,直接使用强制切换(会丢失一部分数据)
alter database activate physical standby database;
shutdown immediate;
5、打开新主库
startup;
如果时间紧迫,必须第一时间打开备库,则上述步骤,只需要执行2、4、5即可,这是最快打开备库的方法!
(四)DG BROKER工具下的failover切换,记录一下(实际很少使用)
1、通过dg broker工具检查主备的同步状态
show database verbose 目标主库;
show database verbose 目标备库;
show configuration verbose;
返回结果中有报错,尽量处理
2、通过dg broker工具执行failover(主备库皆可执行)
failover to 备库名称。




