在 Oracle Data Guard 环境中,手工将备库(Standby)切换为主库(Primary)
在 Oracle Data Guard 环境中,手工将备库(Standby)切换为主库(Primary),通常是指 不使用 Data Guard Broker(DGMGRL),而是通过 原生 SQL 命令 手动完成角色切换。这种操作适用于以下场景:
- 未配置 Data Guard Broker
- Broker 不可用
- 需要精细控制切换过程
根据主库是否可用,分为两种情况:
✅ 一、计划内切换(Switchover)——主库正常
目标:主库 → 备库,备库 → 主库(无数据丢失,可逆)
📌 前提条件
- 主库和备库均正常运行
- 日志同步无延迟(
V$ARCHIVED_LOG.APPLIED = 'YES') - 主库
SWITCHOVER_STATUS = 'TO STANDBY'
🔧 操作步骤
步骤 1:在主库上切换为备库
-- 1.1 检查是否可切换
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
-- 期望值:TO STANDBY 或 SESSIONS ACTIVE-- 1.2 执行切换(主库变备库)
ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN;-- 1.3 关闭并重新启动为备库
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
WITH SESSION SHUTDOWN会自动断开所有用户会话,避免“ORA-01093”错误。
步骤 2:在原备库上切换为主库
-- 2.1 检查是否可切换
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
-- 期望值:TO PRIMARY-- 2.2 停止 Redo 应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;-- 2.3 切换为主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;-- 2.4 打开数据库(如果是 11g 及以上,通常自动 OPEN)
ALTER DATABASE OPEN;步骤 3:验证角色
-- 新主库
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
-- 应返回:PRIMARY, READ WRITE-- 新备库(原主库)
SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;
-- 应有 MRP(Managed Recovery Process)或 RFS 进程⚠️ 二、故障切换(Failover)——主库宕机
目标:强制将备库提升为主库(可能有数据丢失,不可逆)
📌 前提条件
- 主库已宕机或不可恢复
- 备库已应用尽可能多的 Redo 日志
🔧 操作步骤
步骤 1:确保备库应用完所有可用日志
-- 停止 Redo 应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;-- 尝试应用剩余日志(如果有归档日志未应用)
RECOVER STANDBY DATABASE UNTIL CANCEL;
-- 输入 AUTO 或指定归档日志路径,直到提示“Media recovery complete”如果使用 实时应用(Real-Time Apply),通常已应用到最新。
步骤 2:激活备库为主库
-- 方式 1(推荐,11g+):
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;-- 方式 2(旧版本):
-- ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
-- (但 Failover 通常用 ACTIVATE)-- 打开数据库
ALTER DATABASE OPEN;✅
ACTIVATE会直接将备库转为主库,并生成新的 Redo 线程。
步骤 3:验证
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
-- 应返回:PRIMARY, READ WRITE❗ 注意:Failover 后,原主库无法直接作为备库加入,必须重建(使用 RMAN duplicate 或备份恢复)。
🔁 三、切换后处理(重要!)
- 更新应用连接字符串:指向新主库的 IP/服务名。
- 重建原主库为新备库(Switchover 可跳过,Failover 必须做):
- 使用 RMAN
DUPLICATE TARGET DATABASE FOR STANDBY - 或使用备份恢复 + 配置 Redo 传输
- 使用 RMAN
- 清理归档日志:新主库会产生新归档,确保磁盘空间充足。
- 更新备份策略:立即对新主库执行全量备份。
📌 关键视图查询(切换前检查)
| 检查项 | SQL 命令 |
|---|---|
| 数据库角色 | SELECT DATABASE_ROLE FROM V$DATABASE; |
| 切换状态 | SELECT SWITCHOVER_STATUS FROM V$DATABASE; |
| 日志应用延迟 | SELECT MAX(SEQUENCE#) FROM V$LOG_HISTORY;(主库)SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES';(备库) |
| Redo 传输进程 | SELECT PROCESS, STATUS, CLIENT_PROCESS FROM V$MANAGED_STANDBY; |
✅ 总结对比
| 操作类型 | 主库状态 | 数据丢失 | 是否可逆 | 命令 |
|---|---|---|---|---|
| Switchover | 正常 | ❌ 无 | ✅ 是 | COMMIT TO SWITCHOVER TO ... |
| Failover | 故障 | ⚠️ 可能有 | ❌ 否 | ACTIVATE PHYSICAL STANDBY DATABASE |
💡 最佳实践建议
- 日常维护用 Switchover,避免数据丢失。
- Failover 仅用于紧急情况,事后必须重建备库。
- 切换前通知应用停服,避免连接混乱。
- 使用脚本自动化切换流程,减少人为错误。
