Oracle DG切换
原创Oralce DG 切换方式:
1. switchover:用户主动切换,切换后DG关系正常,switch切换过程:先主库再备库
2. failover:主库出现故障,强行切换,备库提升为主库,提升后DG关系失败。
官方定义:
切换
允许主数据库与其备用数据库之一切换角色。切换过程中不会出现数据丢失。切换后,每个数据库继续以其新角色参与Data Guard配置。
故障转移
将备用数据库更改为主数据库,以响应主数据库故障。如果主数据库在故障前没有以最大保护模式或最大可用性模式运行,则可能会发生一些数据丢失。如果在主数据库上启用了Flashback Database,那么一旦故障原因得到纠正,它就可以被恢复为新的主数据库的备用数据库。
- 1.
- 2.
- 3.
- 4.
- 5.
v$database Switchover_Status值的含义
一. switch over
主库
1. 查看switchover_status:
SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS FROM V$DATABASE;
2. 切换为备库
alter database commit to switchover to physical standby WITH SESSION SHUTDOWN;
alter database commit to switchover to physical standby;
注意:如果上一步的SWITCH_STATUS参数值为"TO STANDBY",则 WITH SESSION SHUTDOWN 可以省略。
3. 启动mount
SQL> SHUTDOWN ABORT
SQL> STARTUP MOUNT
注意:11.2.0.4版本及其以上版本不需要执行"SHUTDOWN ABORT",因为数据库已经在切换命令中关闭了。
4. 数据库状态
set line 600
SELECT DB_UNIQUE_NAME,DATABASE_ROLE,PROTECTION_MODE, SWITCHOVER_STATUS, OPEN_MODE FROM V$DATABASE;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
备库
1. 备库状态
SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS FROM V$DATABASE;
注意:需要检查SWITCH_STATUS参数,如果值为"SESSION ACTIVE"或"TO PRIMARY",则备库可以切换为主库。
3. 提升主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
注意:如果上一步的SWITCH_STATUS参数值为"TO PRIMARY",则 WITH SESSION SHUTDOWN 可以省略。
4. 状态查看
SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, FORCE_LOGGING, DATAGUARD_BROKER, GUARD_STATUS FROM V$DATABASE;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
状态校验
查看数据库角色是否切换成功
select database_role from v$database;
查看DG进程是否正常
select process,status,thread#,sequence# from v$managed_standby;
查看同步延时
set pagesize 20;
column name format a13;
column value format a20;
column unit format a30;
column TIME_COMPUTED format a30;
select name,value,unit,time_computed from v$dataguard_stats where name in ('transport lag','apply lag');
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
二. failover
备库
在备库确认是否有日志没有同步:
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
如果此查询有记录,需要把这些日志从主库拷贝到备库,并注册到数据库中:
ALTER DATABASE REGISTER PHYSICAL LOGFILE '拷贝过来的日志文件';
查询日志是否应用到最新状态:
select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;
在备库做失败切换:
alter database recover managed standby database finish force;
alter database commit to switchover to primary;
alter database open;