ORACLE19C DG SWITCHOVER和FAILOVER

来源:这里教程网 时间:2026-03-03 23:07:26 作者:

一. 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;

相关推荐