重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛
标题:
DataGuard 主备切换实操:Switchover 和 Failover 全流程
[打印本页]
作者:
mahan
时间:
7 天前
标题:
DataGuard 主备切换实操:Switchover 和 Failover 全流程
DataGuard 是 Oracle 高可用的核心方案,但很多 DBA 只会搭建,不敢切换。生产环境出故障时手忙脚乱,命令都记不全。这篇文章把 Switchover(计划切换)和 Failover(故障切换)的完整步骤整理清楚,关键时刻能救命。
一、先搞清楚两种切换的区别
登录/注册后可看大图
490786a09c1aa76ae2.png
(12.63 KB, 下载次数: 3)
下载附件
7 天前
上传
核心原则:能用 Switchover 就不用 Failover。
二、切换前检查(必做)
不管哪种切换,先做这些检查:
-- 1. 确认主库角色和保护模式
SELECT database_role, protection_mode, switchover_status
FROM v$database;
-- 2. 确认备库同步状态
-- 主库执行
SELECT dest_id, status, error, gap_status
FROM v$archive_dest_status
WHERE dest_id = 2;
-- 3. 确认备库应用进度
-- 备库执行
SELECT name, value, datum_time
FROM v$dataguard_stats
WHERE name IN ('transport lag', 'apply lag');
-- 4. 确认 Redo 传输是否正常
-- 主库执行
SELECT sequence#, applied
FROM v$archived_log
WHERE dest_id = 2
ORDER BY sequence# DESC
FETCH FIRST 10 ROWS ONLY;
关键指标:
switchover_status 显示 TO STANDBY 或 SESSIONS ACTIVE → 可以切换
transport lag 和 apply lag 都是 +00 00:00:00 → 同步无延迟
最近的归档日志 applied 都是 YES → 备库已应用
三、Switchover 操作步骤
3.1 主库切换为备库
-- 在主库执行
-- 第一步:确认 switchover 状态
SELECT switchover_status FROM v$database;
-- 期望结果:TO STANDBY 或 SESSIONS ACTIVE
-- 第二步:执行切换
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
-- 第三步:关闭并重启为 mount 状态
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
坑 1:如果 switchover_status 显示 NOT ALLOWED,说明有未传输的 Redo 日志。需要先解决 Redo 传输问题。
3.2 备库切换为主库
-- 在备库执行
-- 第一步:确认状态
SELECT switchover_status FROM v$database;
-- 期望结果:TO PRIMARY 或 SESSIONS ACTIVE
-- 第二步:执行切换
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
-- 第三步:打开数据库
ALTER DATABASE OPEN;
3.3 启动新备库的日志应用
-- 在新备库(原主库)执行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
3.4 验证切换结果
-- 两端都执行
SELECT database_role, open_mode, switchover_status
FROM v$database;
-- 新主库应显示:PRIMARY / READ WRITE
-- 新备库应显示:PHYSICAL STANDBY / MOUNTED (或 READ ONLY WITH APPLY)
四、Failover 操作步骤
警告:Failover 是不可逆操作。执行前确认主库确实无法恢复。
4.1 尝试抢救数据(如果可能)
-- 在备库执行,尝试应用所有收到的日志
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
如果 FINISH 成功,说明所有已传输的日志都已应用,数据丢失最小化。
4.2 执行 Failover
-- 在备库执行
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
-- 打开数据库
ALTER DATABASE OPEN;
如果使用 Flashback Database(推荐开启):
-- 确认 Flashback 是否开启
SELECT flashback_on FROM v$database;
4.3 Failover 后重建原主库
原主库恢复后,有两种方式重建为备库:
方式 A:Flashback Database(推荐,速度快)
-- 在原主库执行
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
-- 闪回到切换前的 SCN
FLASHBACK DATABASE TO SCN <failover_scn>;
-- 转换为备库
ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
方式 B:RMAN DUPLICATE(原主库损坏严重时使用)
rman TARGET sys/pwd@new_primary AUXILIARY sys/pwd@new_standby
DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER
NOFILENAMECHECK;
五、Data Guard Broker 简化操作
如果配了 DG Broker(推荐),切换操作简化为一行命令:
5.1 配置 Broker
-- 主库
ALTER SYSTEM SET dg_broker_start=TRUE;
-- 备库
ALTER SYSTEM SET dg_broker_start=TRUE;
-- 通过 dgmgrl 配置
dgmgrl sys/password@primary
DGMGRL> CREATE CONFIGURATION 'dg_config' AS
PRIMARY DATABASE IS 'orcl_primary'
CONNECT IDENTIFIER IS orcl_primary;
DGMGRL> ADD DATABASE 'orcl_standby' AS
CONNECT IDENTIFIER IS orcl_standby
MAINTAINED AS PHYSICAL;
DGMGRL> ENABLE CONFIGURATION;
5.2 Broker Switchover(一行命令)
dgmgrl sys/password@primary
DGMGRL> SWITCHOVER TO 'orcl_standby';
Broker 会自动完成全部步骤:检查状态 → 切换主库 → 切换备库 → 启动应用 → 验证结果。
5.3 Broker Failover
dgmgrl sys/password@standby
DGMGRL> FAILOVER TO 'orcl_standby';
5.4 查看状态
DGMGRL> SHOW CONFIGURATION;
DGMGRL> SHOW DATABASE 'orcl_primary';
DGMGRL> SHOW DATABASE 'orcl_standby';
六、切换演练清单
生产环境建议每季度做一次切换演练,按这个清单走:
步骤 操作 检查点
1 检查主备同步状态 lag = 0,日志全部 applied
2 通知业务方(计划切换) 确认维护窗口
3 关闭应用连接(或切换 VIP) 无活跃会话
4 执行 Switchover 两端角色互换
5 验证新主库 role=PRIMARY, open_mode=READ WRITE
6 验证新备库 日志应用正常,lag=0
7 切换应用连接到新主库 业务恢复
8 监控 30 分钟 alert log 无异常
9 (可选)切回原配置 再做一次 Switchover
七、常见问题
Q: Switchover 卡在 SESSIONS ACTIVE 怎么办?
加 WITH SESSION SHUTDOWN 参数强制断开活跃会话:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
Q: Failover 后发现数据丢失了怎么办?
如果开启了 Flashback Database,可以闪回到 Failover 前的时间点查看丢失的数据。但已经 Failover 的备库无法回退。这就是为什么要用 MAXIMUM AVAILABILITY 保护模式 + 同步 Redo 传输。
Q: 切换后应用连接怎么自动跟随?
推荐使用 TAF(Transparent Application Failover)或 Application Continuity,在 tnsnames.ora 中配置 FAILOVER_MODE,客户端会自动重连到新主库。
欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2