一、切换(swithover)和故障转移(failover)区别
1、切换适用于主备工作状态良好。主库变更状态为备库,备库变更状态为主库。
2、故障转移,适用于主库故障、崩溃,不可修复,让备库变更状态,接替主库角色。
二、swithover步骤
2.1、切换前准备
1、检查主库上是否存在standby redo logfile
select group#,member,type from v$logfile where type='STANDBY';
2、在物理standby数据库上检查当standby端切换为主库时,是否能传递redo数据到新的standby数据库
tnsping orcl 10
3、在主库上测试到备机得tnsnames是否联通
4、在swithover前检查物理standby数据库上是否有临时表空间的设置
5、检查主库和物理standby数据库是否有离线的数据文件
6、确定主库和物理备份库的最大归档日志序列号是否匹配
在主库上查询每一个实例的最大归档序列号
在备库上查询每一个备库的最大归档序列号
select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#;
7、检查物理standby 上的MRP 进程是否处于运行状态
8、确保数据库无job运行,同时禁止rman、exp或者expdp备份
如果有考虑禁止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
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数据库处于挂载状态
srvctl stop database -d trac -o immediate;
srvctl start database -d trac -o mount;
12、建议给主库和物理standby库做个全备份
2.3、用sqlplus执行切换过程
1、在主库上执行如下命令查询主库状态是否为TO STANDBY 或者SESSION ACTIVE
SQL> select switchover_status,open_mode,database_role from v$database;
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.
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;
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’;
2、检测主库和standby数据库的状态,在主库上检测生成的最大归档日志文件
在主库检测生成的最大归档日志文件
Select thread# max(sequence#) from v$archived_log group by thread#;
在备库检测已经应用的最大归档日志文件
select max(sequence#) from v$archived_log where applied='YES' group by thread#;
如下图
select REGISTRAR,sequence#,applied from v$archived_log order by sequence#;
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;
alter database recover managed standby database finish force;
select thread#,sequence#,process,status,client_process from v$managed_standby
在物理standby上执行如下命令使备库变更主库。
SQL>alter database commit to switchover to primary with session shutdown;
6、查询转换后的数据库状态
select db_unique_name,database_role,standby_became_primary_scn from v$database;
7、重启standby新数据库到 read write状态。
srvctl stop database -d torcl -o immediate;
srvctl start database -d torcl -o open;