在 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 仅用于紧急情况,事后必须重建备库。
  • 切换前通知应用停服,避免连接混乱。
  • 使用脚本自动化切换流程,减少人为错误。
相关推荐
NineData3 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师5 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石9 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker