1. 环境说明与前提条件

1.1. 核心环境信息

 
角色DB_UNIQUE_NAMEIP 地址切换后角色
原主库 RKHY_PRIMARY 172.21.204.201 新备库
原备库 RKHY_STANDBY 172.21.204.200 新主库
Oracle 版本 11.2.0.4 - -
保护模式 MAXIMUM PERFORMANCE(默认) - -
 

1.2. 切换前置检查(必须完成)

  • 主备库已配置核心 DG 参数(适配实际路径):
    -- 主备库统一配置
    *.log_archive_config='DG_CONFIG=(RKHY_PRIMARY,RKHY_STANDBY)'
    -- 原主库(RKHY_PRIMARY):log_archive_dest_2指向备库
    *.log_archive_dest_2='SERVICE=RKHY_STANDBY LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_STANDBY'
    -- 原备库(RKHY_STANDBY):log_archive_dest_2指向主库
    *.log_archive_dest_2='SERVICE=RKHY_PRIMARY LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=RKHY_PRIMARY'
    -- 启用归档目标
    *.log_archive_dest_state_1='ENABLE'
    *.log_archive_dest_state_2='ENABLE'
    -- 备库路径转换(主库可按需配置)
    *.LOG_FILE_NAME_CONVERT='/data/oracle/oradata/RKHY_PRIMARY','/data/oracle/oradata/RKHY_STANDBY'
    *.DB_FILE_NAME_CONVERT='/data/oracle/oradata/RKHY_PRIMARY','/data/oracle/oradata/RKHY_STANDBY'
    -- FAL参数(主备互指)
    *.FAL_SERVER='RKHY_PRIMARY'
    *.FAL_CLIENT='对应库的DB_UNIQUE_NAME' -- 主库填RKHY_PRIMARY,备库填RKHY_STANDBY
     
  • 主备库均已创建 Standby Redo Log(SRL),确保日志实时应用;
  • 切换前确认备库无日志间隙(v$archive_gap无记录);
  • 原主库无长时间未提交的活跃会话(避免切换阻塞)。

2. 正常切换(Switchover,无数据丢失)

适用于计划性切换(如演练、迁移),全程无数据丢失,步骤如下:

2.1 步骤 1:原主库(RKHY_PRIMARY,172.21.204.201)操作

  1. 登录 SQLPLUS(sysdba 权限),检查切换状态:
    -- 基础状态检查
    select name,open_mode,protection_mode from v$database;
    -- 关键:确认切换状态(需显示TO STANDBY)
    select switchover_status, database_role from v$database;
    • 正常结果:SWITCHOVER_STATUS=TO STANDBYDATABASE_ROLE=PRIMARY
    • 若显示SESSIONS ACTIVE:需在切换命令中加with session shutdown wait
    SQL> select name,open_mode,protection_mode from v$database;
    
    NAME      OPEN_MODE            PROTECTION_MODE
    --------- -------------------- --------------------
    RKHY      READ WRITE           MAXIMUM PERFORMANCE
    
    SQL> select switchover_status, database_role from v$database;
    
    SWITCHOVER_STATUS    DATABASE_ROLE
    -------------------- ----------------
    TO STANDBY           PRIMARY
  2. 执行主库切换为物理备库:
    -- 无活跃会话时
    alter database commit to switchover to physical standby;
    -- 有活跃会话时(强制关闭会话)
    alter database commit to switchover to physical standby with session shutdown wait;
    SQL> alter database commit to switchover to physical standby with session shutdown wait;
    
    Database altered.
    
    SQL> select name,open_mode,protection_mode from v$database;
    select name,open_mode,protection_mode from v$database
    *
    ERROR at line 1:
    ORA-01034: ORACLE not available
    Process ID: 19468
    Session ID: 587 Serial number: 477
  3. 切换后实例自动宕机,重启到 MOUNT 状态:
    startup mount;
    SQL> startup mount;
    ORACLE instance started.
    
    Total System Global Area 2137886720 bytes
    Fixed Size                  2254952 bytes
    Variable Size             687867800 bytes
    Database Buffers         1442840576 bytes
    Redo Buffers                4923392 bytes
    Database mounted.
  4. 验证角色切换结果:
    select switchover_status, database_role from v$database;
    -- 正常结果:DATABASE_ROLE=PHYSICAL STANDBY、SWITCHOVER_STATUS=RECOVERY NEEDED
    SQL> select switchover_status, database_role from v$database;
    
    SWITCHOVER_STATUS    DATABASE_ROLE
    -------------------- ----------------
    RECOVERY NEEDED      PHYSICAL STANDBY
  5. 以ADG方式打开新备库:
    alter database open ;
    alter database recover managed standby database using current logfile disconnect from session;
    SQL> alter database open;
    
    Database altered.
    
    SQL> alter database recover managed standby database using current logfile disconnect from session;
    
    Database altered.
    
    SQL> select process,status from v$managed_standby;
    
    PROCESS   STATUS
    --------- ------------
    ARCH      CLOSING
    ARCH      CONNECTED
    ARCH      CONNECTED
    ARCH      CLOSING
    RFS       IDLE
    RFS       IDLE
    RFS       IDLE
    MRP0      APPLYING_LOG
    
    8 rows selected.
    
    SQL> select process, status, sequence# from v$managed_standby where process='MRP0';
    
    PROCESS   STATUS        SEQUENCE#
    --------- ------------ ----------
    MRP0      APPLYING_LOG         21
    
    SQL> select max(sequence#) from v$archived_log;
    
    MAX(SEQUENCE#)
    --------------
                20

2.2.步骤 2:原备库(RKHY_STANDBY,172.21.204.200)操作

  1. 登录 SQLPLUS(sysdba 权限),检查切换状态:
    select name,open_mode,protection_mode from v$database;
    select switchover_status, database_role from v$database;
    • 正常结果:SWITCHOVER_STATUS=TO PRIMARYDATABASE_ROLE=PHYSICAL STANDBYOPEN_MODE=READ ONLY WITH APPLY
    • 在主库未切换前 SWITCHOVER_STATUS= NOT ALLOWED
  2. 执行备库切换为主库:
    alter database commit to switchover to primary;
    SQL> alter database commit to switchover to primary;
    
    Database altered.
  3. 验证角色切换结果(实例会自动变为 MOUNT 状态):
    select switchover_status, database_role from v$database;
    select status from v$instance;
    -- 正常结果:DATABASE_ROLE=PRIMARY、STATUS=MOUNTED
    SQL> select switchover_status, database_role from v$database;
    
    SWITCHOVER_STATUS    DATABASE_ROLE
    -------------------- ----------------
    NOT ALLOWED          PRIMARY
    
    SQL> select status from v$instance;
    
    STATUS
    ------------
    MOUNTED
  4. 以读写模式打开新主库:
    alter database open;
    SQL> alter database open;
    
    Database altered.
    
    SQL> select process, status, sequence# from v$managed_standby where process='MRP0';
    
    no rows selected
    
    SQL> select max(sequence#) from v$archived_log;
    
    MAX(SEQUENCE#)
    --------------
                20

2.3.步骤 3:新备库(172.21.204.201)启动日志应用

-- 验证进程状态(确认MRP0为APPLYING_LOG)
select process,status from v$managed_standby;
SQL> select process,status from v$managed_standby;

PROCESS   STATUS
--------- ------------
ARCH      CLOSING
ARCH      CONNECTED
ARCH      CONNECTED
ARCH      CLOSING
RFS       IDLE
RFS       IDLE
RFS       IDLE
MRP0      APPLYING_LOG

8 rows selected.

切换验证(关键)

  1. 在新主库(172.21.204.200)创建测试数据:
    create table test.dg_switch_test(id int, name varchar2(100));
    insert into test.dg_switch_test values(1, 'switchover_success');
    commit;
  2. 在新备库(172.21.204.201)查询数据,确认同步:
    select * from test.dg_switch_test;
    -- 正常结果:能查询到id=1、name=switchover_success的记录

3. 故障切换(Failover,主库崩溃时)

适用于原主库(172.21.204.201)异常崩溃且无法恢复的场景,可能丢失部分数据,步骤如下:

3.1.步骤 1:模拟原主库故障(仅测试用,生产需确认主库不可恢复)

# 强制关闭原主库(示例)
sqlplus / as sysdba
shutdown abort;

3.2.步骤 2:原备库(RKHY_STANDBY,172.21.204.200)操作

  1. 登录 SQLPLUS(sysdba 权限),检查日志间隙:
    select * from v$archive_gap;
    -- 正常结果:no rows selected(无日志间隙)
  2. 检查备库当前状态:
    select name,open_mode,switchover_status,DATABASE_ROLE,protection_mode from v$database;
    -- 正常结果:DATABASE_ROLE=PHYSICAL STANDBY、OPEN_MODE=READ ONLY WITH APPLY
  3. 强制完成日志恢复(初始化 Failover):
    alter database recover managed standby database finish force;
  4. 再次检查切换状态(需显示 TO PRIMARY):
    select name,open_mode,switchover_status,DATABASE_ROLE,protection_mode from v$database;
    -- 正常结果:SWITCHOVER_STATUS=TO PRIMARY、OPEN_MODE=MOUNTED
  5. 将备库切换为主库:
    alter database commit to switchover to primary;
  6. 验证角色切换结果:
    select name,open_mode,switchover_status,DATABASE_ROLE,protection_mode from v$database;
    -- 正常结果:DATABASE_ROLE=PRIMARY、OPEN_MODE=MOUNTED
  7. 以读写模式打开新主库:
    alter database open;

3.3.步骤 3:后续处理(可选)

若故障主库恢复后需重新作为备库,需重新配置 DG(如重建备库、同步日志),确保新主备架构正常。

4. 总结

  1. Switchover 核心:计划性切换无数据丢失,需先将原主库切为备库,再将原备库切为主库,最后启动备库日志应用;
  2. Failover 核心:故障应急切换(可能丢数据),关键步骤是备库执行recover managed standby database finish force强制完成日志恢复,再切换为主库;
  3. 状态检查关键:切换前后重点检查v$databaseswitchover_statusdatabase_role,备库需确认 MRP 进程为APPLYING_LOG状态。
 posted on 2026-01-20 11:50  xibuhaohao  阅读(4)  评论(0)    收藏  举报