在 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 仅用于紧急情况,事后必须重建备库。
  • 切换前通知应用停服,避免连接混乱。
  • 使用脚本自动化切换流程,减少人为错误。
相关推荐
不像程序员的程序媛3 小时前
系统cpu内存负载资源分析
运维·服务器·数据库
Jane Chiu4 小时前
Oracle DBMS_REDEFINITION(在线重定义)
数据库·oracle·分区表
全栈前端老曹5 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
怕孤单的草丛5 小时前
缓存管理面临的主要问题
java·数据库·缓存
我会尽全力 乐观而坚强6 小时前
MySQL零基础入门(二)
数据库·mysql·adb
kali-Myon7 小时前
某校园门禁系统高危 SQL 注入漏洞挖掘复盘
数据库·sql·安全·web安全
程序员在囧途8 小时前
likeadmin-api API 中转站怎么做统一报价?从 /pricing、/user/balance 到 task_id 回执的落地方法
运维·服务器·数据库·likeadmin-api·api中转站·token计费
龙石数据9 小时前
MySQL 全量同步到 Hive 怎么做?三步配置教程
数据库·hive·mysql·数据治理·数据中台
程序员在囧途9 小时前
likeadmin-api API 算力超市怎么做供应商切换?统一鉴权、task_id 和 callback_url 才能稳交付
java·服务器·数据库·开放api·likeadmin-api·api算力超市