一. DG SWITCHOVER 步骤1.确认主备库同步情况
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; select thread#,sequence#,first_time,next_time,applied from v$archived_log where applied='NO'; SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;
2.确认主库是否可以切换为备库
select NAME,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,SWITCHOVER_STATUS from v$database;
SWITCHOVER_STATUS 为TO STANDBY 即表示可以切换 3.切换主库->备库alter database commit to switchover to physical standby; 4.确认备库是否可以切换为主库
select NAME,OPEN_MODE,PROTECTION_MODE,DATABASE_ROLE,SWITCHOVER_STATUS from v$database;
SWITCHOVER_STATUS 为TO PRIMARY 即表示可以切换 5.切换备库->主库alter database commit to switchover to primary; 6.启动主备库,在备库执行同步alter database recover managed standby database using current logfile disconnect from session; 二. DG FAILOVER 步骤 1.检查数据同步状态
-- 1. 确认最后应用时间 SELECT TO_CHAR(MAX(NEXT_TIME), 'YYYY-MM-DD HH24:MI:SS') FROM V$ARCHIVED_LOG WHERE APPLIED='YES'; -- 2. 检查是否有未应用的归档 SELECT COUNT(*) FROM V$ARCHIVED_LOG WHERE APPLIED='NO' AND REGISTRAR='RFS'; -- 3. 验证保护模式 SELECT PROTECTION_MODE, PROTECTION_LEVEL FROM V$DATABASE; -- 4. 记录当前SCN(用于后续可能的闪回) SELECT CURRENT_SCN FROM V$DATABASE; -- 5. 检查数据库一致性 ALTER DATABASE VERIFY DATABASE;
2.确认可能丢失数据时间
SELECT
CASE
WHEN MINUTES_BEHIND < 1 THEN '✅ 可以切换 - 数据丢失 < 1分钟'
WHEN MINUTES_BEHIND < 5 THEN '⚠️ 谨慎切换 - 数据丢失 1-5分钟'
WHEN MINUTES_BEHIND < 30 THEN '⚠️⚠️ 需要审批 - 数据丢失 5-30分钟'
ELSE '❌ 高风险 - 数据丢失 > 30分钟,建议先恢复主库'
END AS DECISION_RECOMMENDATION,
MINUTES_BEHIND,
LAST_APPLIED_TIMEFROM (
SELECT
ROUND(('主库宕机时间' - MAX(NEXT_TIME)) * 24 * 60, 2) AS MINUTES_BEHIND,
TO_CHAR(MAX(NEXT_TIME), 'YYYY-MM-DD HH24:MI:SS') AS LAST_APPLIED_TIME FROM V$ARCHIVED_LOG
WHERE APPLIED = 'YES');
3.评估后进行切换
-- 在目标备库执行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; -- 执行故障切换ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
4.验证主库新状态
-- 检查数据库角色 SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE; -- 打开数据库(如果未自动打开) ALTER DATABASE OPEN; -- 检查实例状态 SELECT INSTANCE_NAME, STATUS, DATABASE_STATUS FROM V$INSTANCE;
