1. 环境说明与前提条件
1.1. 核心环境信息
| 角色 | DB_UNIQUE_NAME | IP 地址 | 切换后角色 |
|---|---|---|---|
| 原主库 | 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)操作
-
登录 SQLPLUS(sysdba 权限),检查切换状态:
-- 基础状态检查 select name,open_mode,protection_mode from v$database; -- 关键:确认切换状态(需显示TO STANDBY) select switchover_status, database_role from v$database;- 正常结果:
SWITCHOVER_STATUS=TO STANDBY、DATABASE_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
- 正常结果:
-
执行主库切换为物理备库:
-- 无活跃会话时 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
-
切换后实例自动宕机,重启到 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.
-
验证角色切换结果:
select switchover_status, database_role from v$database; -- 正常结果:DATABASE_ROLE=PHYSICAL STANDBY、SWITCHOVER_STATUS=RECOVERY NEEDEDSQL> select switchover_status, database_role from v$database; SWITCHOVER_STATUS DATABASE_ROLE -------------------- ---------------- RECOVERY NEEDED PHYSICAL STANDBY
-
以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)操作
-
登录 SQLPLUS(sysdba 权限),检查切换状态:
select name,open_mode,protection_mode from v$database; select switchover_status, database_role from v$database;- 正常结果:
SWITCHOVER_STATUS=TO PRIMARY、DATABASE_ROLE=PHYSICAL STANDBY、OPEN_MODE=READ ONLY WITH APPLY。 - 在主库未切换前 SWITCHOVER_STATUS= NOT ALLOWED
- 正常结果:
-
执行备库切换为主库:
alter database commit to switchover to primary;SQL> alter database commit to switchover to primary; Database altered.
-
验证角色切换结果(实例会自动变为 MOUNT 状态):
select switchover_status, database_role from v$database; select status from v$instance; -- 正常结果:DATABASE_ROLE=PRIMARY、STATUS=MOUNTEDSQL> select switchover_status, database_role from v$database; SWITCHOVER_STATUS DATABASE_ROLE -------------------- ---------------- NOT ALLOWED PRIMARY SQL> select status from v$instance; STATUS ------------ MOUNTED
-
以读写模式打开新主库:
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.
切换验证(关键)
-
在新主库(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; -
在新备库(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)操作
-
登录 SQLPLUS(sysdba 权限),检查日志间隙:
select * from v$archive_gap; -- 正常结果:no rows selected(无日志间隙) -
检查备库当前状态:
select name,open_mode,switchover_status,DATABASE_ROLE,protection_mode from v$database; -- 正常结果:DATABASE_ROLE=PHYSICAL STANDBY、OPEN_MODE=READ ONLY WITH APPLY -
强制完成日志恢复(初始化 Failover):
alter database recover managed standby database finish force; -
再次检查切换状态(需显示 TO PRIMARY):
select name,open_mode,switchover_status,DATABASE_ROLE,protection_mode from v$database; -- 正常结果:SWITCHOVER_STATUS=TO PRIMARY、OPEN_MODE=MOUNTED -
将备库切换为主库:
alter database commit to switchover to primary; -
验证角色切换结果:
select name,open_mode,switchover_status,DATABASE_ROLE,protection_mode from v$database; -- 正常结果:DATABASE_ROLE=PRIMARY、OPEN_MODE=MOUNTED -
以读写模式打开新主库:
alter database open;
3.3.步骤 3:后续处理(可选)
若故障主库恢复后需重新作为备库,需重新配置 DG(如重建备库、同步日志),确保新主备架构正常。
4. 总结
- Switchover 核心:计划性切换无数据丢失,需先将原主库切为备库,再将原备库切为主库,最后启动备库日志应用;
- Failover 核心:故障应急切换(可能丢数据),关键步骤是备库执行
recover managed standby database finish force强制完成日志恢复,再切换为主库; - 状态检查关键:切换前后重点检查
v$database的switchover_status和database_role,备库需确认 MRP 进程为APPLYING_LOG状态。
posted on
浙公网安备 33010602011771号