在 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 或备份恢复)。


🔁 三、切换后处理(重要!)

  1. 更新应用连接字符串:指向新主库的 IP/服务名。
  2. 重建原主库为新备库 (Switchover 可跳过,Failover 必须做):
    • 使用 RMAN DUPLICATE TARGET DATABASE FOR STANDBY
    • 或使用备份恢复 + 配置 Redo 传输
  3. 清理归档日志:新主库会产生新归档,确保磁盘空间充足。
  4. 更新备份策略:立即对新主库执行全量备份。

📌 关键视图查询(切换前检查)

检查项 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 仅用于紧急情况,事后必须重建备库。
  • 切换前通知应用停服,避免连接混乱。
  • 使用脚本自动化切换流程,减少人为错误。
相关推荐
百***24132 小时前
oracle使用PLSQL导出表数据
数据库·oracle
cqsztech2 小时前
ORACLE 11g 在线修改数据文件路径
数据库·oracle
为什么要做囚徒2 小时前
Oracle跨用户表授权+同义词创建的标准脚本模板
数据库·oracle
q***46522 小时前
对基因列表中批量的基因进行GO和KEGG注释
开发语言·数据库·golang
合作小小程序员小小店3 小时前
桌面开发,在线%日记本,日历%系统开发,基于eclipse,jdk,java,无数据库
java·数据库·eclipse·jdk
拾忆,想起3 小时前
Dubbo线程模型全解析:提升微服务性能的底层逻辑
java·数据库·微服务·架构·dubbo·哈希算法
鸽芷咕3 小时前
开源新势力:openGauss 在数字时代企业级开源库选型核心的竞争力
数据库
Ro Jace3 小时前
三国华容道(横刀立马)移动策略
android·java·数据库·人工智能·深度学习·神经网络·游戏
奇树谦3 小时前
Qt 自定义菜单栏 / 工具栏按钮 QToolButton + InstantPopup 详细解析
开发语言·数据库·qt