暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

windows下主备切换

原创 张超 2026-02-28
30

Windows 环境下 Oracle 19c Data Guard 主备切换实战指南

文档概述
本指南专为 Windows Server 环境下的 Oracle 19c Data Guard (DG) 架构设计。涵盖从日常状态检查到计划内切换(Switchover)及故障紧急切换(Failover)的全流程操作。

⚠️ 重要警告:
生产环境操作前务必备份控制文件和参数文件。
所有命令请在 CMD (命令提示符) 或 PowerShell 中以 管理员身份 运行。
确保 ORACLE_SID 和 ORACLE_HOME 环境变量在每次切换会话前正确设置。

前置检查 (Pre-Check)
在执行任何切换操作前,必须确认主备库状态健康,无日志传输延迟。

2.1 在主库 (Primary) 上执行
登录 SQLPlus (sqlplus / as sysdba):

-- 1. 检查数据库角色和开放模式
SELECT DATABASE_ROLE, OPEN_MODE, PROTECTION_MODE FROM V$DATABASE;
-- 预期: PRIMARY, READ WRITE, MAXIMUM PERFORMANCE/AVAILABILITY

-- 2. 检查归档日志发送状态 (关键)
SELECT DEST_ID, STATUS, ERROR, APPLIED_THREAD#, APPLIED_SEQ#
FROM V$ARCHIVE_DEST_STATUS
WHERE DEST_ID = 2; -- 假设备库是 DEST_2
-- 预期: STATUS 为 VALID, ERROR 为空

-- 3. 检查是否有日志缺口 (Gap)
SELECT * FROM V$ARCHIVE_GAP;
-- 预期: 未选定行 (no rows selected)。如果有行,必须先解决缺口才能切换。

2.2 在备库 (Standby) 上执行
登录 SQLPlus (sqlplus / as sysdba):

-- 1. 检查数据库角色和同步状态
SELECT DATABASE_ROLE, OPEN_MODE, PROTECTION_MODE FROM V$DATABASE;
-- 预期: PHYSICAL STANDBY, MOUNTED (或 READ ONLY WITH APPLY)

-- 2. 检查 MRD 进程状态 (日志应用进程)
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCKS
FROM V$MANAGED_STANDBY
WHERE PROCESS LIKE 'MRP%';
-- 预期: STATUS 为 APPLYING_LOG 或 WAIT_FOR_LOG。如果是 CONNECTING 需排查网络。

-- 3. 确认最后应用的日志序列号
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED = 'YES';

场景一:计划内切换 (Switchover)
适用场景:服务器维护、补丁升级、硬件迁移。
特点:零数据丢失,原主库可平滑变回备库,业务中断时间极短。

步骤 1:确认是否允许切换
在主库执行:
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

如果返回 TO STANDBY 或 SESSIONS ACTIVE,可以继续。
如果返回 NOT ALLOWED,请检查是否有日志缺口或未解决的错误。

步骤 2:执行主库切换 (Primary -> Standby)
在主库 SQLPlus 中执行:

-- 如果有活跃会话,添加 WITH SESSION SHUTDOWN 强制断开
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
执行成功后,原主库会自动关闭并挂载 (MOUNT),角色变为备库。

步骤 3:执行备库切换 (Standby -> Primary)
注意:此时需切换到原备库的服务器进行操作。

停止日志应用 (如果 MRD 进程还在运行):
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;


确认切换状态:
SELECT SWITCHOVER_STATUS FROM VDATABASE;

应返回 TO PRIMARY 或 SESSIONS ACTIVE。

执行切换命令:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;


打开新主库:
ALTER DATABASE OPEN;


步骤 4:启动新备库的日志应用
回到原主库(现为新备库)服务器:

启动数据库到 Mount 状态 (如果未自动挂载):
STARTUP MOUNT;


开启日志应用:
-- Oracle 19c 推荐使用子句自动管理
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;


步骤 5:验证切换结果
分别在两台机器上查询 VDATABASE,确认角色已互换,且新备库开始接收日志。

场景二:故障紧急切换 (Failover)
适用场景:主库宕机、磁盘损坏、网络永久中断且无法恢复。
特点:可能有数据丢失 (取决于保护模式),原主库通常无法直接变回备库,需要重建。

🚨 决策点:仅在确认主库无法短时间恢复时执行!

步骤 1:尝试激活备库
在备库 SQLPlus 中执行:

-- 1. 终止日志应用进程
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 2. 尝试刷新未接收的日志 (如果网络通但主库挂了,这步可能失败,可跳过)
-- ALTER DATABASE FLUSH REDO LOGS TO STANDBY;

-- 3. 结束恢复并激活备库
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE ACTIVATE STANDBY DATABASE;

如果上述命令成功,备库已提升为主库。

步骤 4:打开新主库
ALTER DATABASE OPEN;

步骤 5:处理原主库 (Flashback 或 重建)
故障切换后,原主库与新主库的“脑裂”导致它们不再属于同一个 DG 组。
方案 A (推荐 - 如果开启了 Flashback):
修复原主库硬件/系统问题。
启动到 Mount:STARTUP MOUNT FORCE
闪回到切换前的 SCN (需查询新主库的 STANDBY_BECAME_PRIMARY_SCN)。
转换为物理备库:ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
重启并开启日志应用。

方案 B (通用 - 重建):
如果未开闪回,最稳妥的方式是使用 RMAN 从新主库重新备份,还原并重搭原主库为新的备库。

Windows 特有注意事项

5.1 服务名切换
Windows 依赖 Windows Service 来管理实例。切换角色后,服务名不会变,但注册表中的启动参数可能需要检查。
确保 OracleService 和 OracleVssWriter 服务处于 自动 启动状态。
如果使用了监听器,切换后通常不需要重启监听,但如果连接字符串中指定了 ROLE=PRIMARY,客户端可能需要重连。

5.2 路径与权限
Windows 对文件路径大小写不敏感,但 Oracle 内部元数据敏感。确保 LOG_ARCHIVE_DEST 路径在两个节点上都有效(如果是共享存储架构,但在 Windows DG 通常是独立存储)。
确保 Oracle 安装用户(如 oracle 或 Administrator)在两个服务器上都有相同的数据目录读写权限。

5.3 防火墙
切换后,新的主库需要开放 1521 (监听端口) 供应用连接。
新的备库需要确保 1521 允许原主库(现备库)连接以拉取日志(如果是主动推送模式,则是新主库推送到新备库,需确保新备库的 1521 开放)。

常见问题排查 (Troubleshooting)
问题现象 可能原因 解决方案
Switchover 报错 "not allowed" 存在归档日志缺口 (Gap) 查询 VARCHIVE_GAP,手动拷贝缺失的归档日志到备库并注册 (REGISTER LOGFILE)。

MRP 进程无法启动 备库控制文件损坏或参数不对 检查 alert.log,确认 DB_FILE_NAME_CONVERT 参数是否正确映射了文件路径。

切换后应用连不上 监听未更新或 TNS 配置问题 检查 tnsnames.ora,确认连接串是否指向了新的主库 IP。如果是 VIP 或域名,检查 DNS 解析。

ORA-12514 / ORA-12560 服务未启动 在 Windows 服务管理器中检查 OracleService 是否正在运行。

附录:一键检查脚本 (check_dg_status.sql)
将以下内容保存为 .sql 文件,在主备库分别运行以快速评估状态。

SET LINESIZE 200
SET PAGESIZE 100
COL DB_ROLE FORMAT A15
COL OPEN_MODE FORMAT A20
COL PROTECTION_MODE FORMAT A20
COL STATUS FORMAT A10
COL ERROR FORMAT A30

PROMPT === 数据库核心状态 ===
SELECT DATABASE_ROLE AS DB_ROLE, OPEN_MODE, PROTECTION_MODE FROM V$DATABASE;

PROMPT === 归档传输状态 (主库查此项) ===
SELECT DEST_ID, STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;

PROMPT === 日志应用进程 (备库查此项) ===
SELECT PROCESS, STATUS, THREAD#, SEQUENCE# FROM V$MANAGED_STANDBY WHERE PROCESS LIKE 'MRP%';

PROMPT === 是否存在日志缺口 ===
SELECT * FROM V$ARCHIVE_GAP;

结语:在 Windows 环境下,Oracle DG 的切换逻辑与 Linux 一致,核心在于环境的稳定性和参数的准确性。定期(如每季度)在测试环境进行一次 Switchover 演练,是保障生产安全的最有效手段。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论