Skip to content

Data Guard主备切换

概述

Data Guard主备切换是指将Data Guard配置中的主数据库转换为备数据库,同时将备数据库转换为主数据库的过程。主备切换是保证Data Guard高可用性的关键操作,用于计划内的维护活动(如软件升级、硬件维护等)或计划外的故障恢复。Data Guard支持两种切换类型:Switchover和Failover。

切换类型

1. Switchover

Switchover是一种计划内的主备切换,用于计划内的维护活动。Switchover的特点:

  • 切换过程可控,数据零丢失
  • 主库和备库都处于正常状态
  • 可以双向切换,主库变为备库,备库变为主库
  • 切换后可以快速回切

2. Failover

Failover是一种计划外的主备切换,用于主库故障时的应急恢复。Failover的特点:

  • 主库处于故障状态,无法正常运行
  • 备库接管主库角色,继续提供服务
  • 可能会丢失少量数据(取决于Data Guard配置)
  • 切换后需要重新配置Data Guard,才能进行回切

Switchover切换流程

1. 切换前准备

在执行Switchover之前,需要进行以下准备工作:

  • 验证主库和备库的状态
  • 检查Data Guard配置的完整性
  • 确保所有Redo日志都已传输到备库
  • 备份主库和备库的数据库
  • 通知相关团队,确保业务影响最小化

2. 执行Switchover

步骤1:验证主库可以切换

在主库上执行以下命令,验证主库是否可以切换:

sql
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
-- 输出应为:TO STANDBY或SESSIONS ACTIVE

如果输出为SESSIONS ACTIVE,需要终止所有活动会话或使用WITH SESSION SHUTDOWN选项。

步骤2:将主库转换为备库

在主库上执行以下命令,将主库转换为备库:

sql
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;

步骤3:关闭并重启原主库

sql
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

步骤4:验证备库可以切换

在备库上执行以下命令,验证备库是否可以切换:

sql
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
-- 输出应为:TO PRIMARY或SESSIONS ACTIVE

步骤5:将备库转换为主库

在备库上执行以下命令,将备库转换为主库:

sql
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

步骤6:打开新主库

sql
ALTER DATABASE OPEN;

步骤7:启动新备库的Redo应用

在新备库上执行以下命令,启动Redo应用:

sql
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

3. 切换后验证

执行以下命令,验证Switchover后的Data Guard配置:

sql
-- 在新主库上
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
SELECT DEST_ID, DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE TARGET='STANDBY';

-- 在新备库上
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
SELECT NAME, VALUE FROM V$DATAGUARD_STATS WHERE NAME IN ('transport lag', 'apply lag');

Failover切换流程

1. 切换前准备

在执行Failover之前,需要进行以下准备工作:

  • 确认主库已无法恢复
  • 检查备库的Redo应用状态
  • 确保备库已应用所有可用的Redo日志
  • 备份备库的数据库

2. 执行Failover

步骤1:验证主库故障

确认主库已无法恢复,无法通过正常方式连接。

步骤2:在备库上检查Redo应用状态

sql
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY;
SELECT APPLIED_SCN FROM V$DATAGUARD_STATS;

步骤3:尝试应用所有可用的Redo日志

sql
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

如果上述命令失败,可以使用FORCING选项:

sql
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;

步骤4:将备库转换为主库

sql
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

如果上述命令失败,使用Failover命令:

sql
ALTER DATABASE FAILOVER TO <db_unique_name>;

步骤5:打开新主库

sql
ALTER DATABASE OPEN;

3. 切换后恢复

Failover后,需要进行以下恢复工作:

  • 重新配置Data Guard,将原主库作为新备库添加到配置中
  • 重建Data Guard配置,确保数据同步
  • 测试新的Data Guard配置

版本差异

Oracle 19c vs 21c Data Guard切换差异

特性Oracle 19cOracle 21c
Switchover速度一般显著提升,优化了切换流程
Failover速度一般显著提升,优化了故障检测和恢复流程
自动切换支持Fast-Start Failover增强Fast-Start Failover,支持更多场景
零数据丢失支持增强零数据丢失,优化了Redo传输和应用
云集成基础云集成增强云集成,支持与OCI、AWS、Azure等云平台的切换
监控能力基础监控能力增强监控能力,提供更详细的切换状态和性能指标
自动诊断基础自动诊断增强自动诊断和修复能力,简化切换过程

最佳实践

1. 切换前准备

  • 制定详细的切换计划:包括切换步骤、时间窗口、人员分工、回滚计划等
  • 进行充分的测试:在测试环境中多次测试切换流程,确保切换顺利
  • 备份数据库:在切换前备份主库和备库的数据库,以便出现问题时可以快速恢复
  • 检查Data Guard配置:确保Data Guard配置完整,没有任何警告或错误
  • 通知相关团队:提前通知业务团队、应用团队、运维团队等,确保业务影响最小化

2. 切换过程

  • 选择合适的时间窗口:选择业务低峰期进行切换,减少对业务的影响
  • 监控切换过程:实时监控切换过程,及时发现和解决问题
  • 记录切换日志:详细记录切换过程中的每一步操作和输出,以便后续分析
  • 保持沟通:切换过程中保持与相关团队的沟通,确保信息同步
  • 准备回滚计划:制定详细的回滚计划,以便在切换失败时可以快速回滚

3. 切换后验证

  • 验证Data Guard配置:检查新主库和新备库的状态,确保Data Guard配置正常
  • 验证数据一致性:检查新主库和新备库的数据一致性,确保数据没有丢失
  • 验证应用连接:测试应用程序是否可以正常连接到新主库
  • 验证性能:监控新主库的性能,确保性能正常
  • 更新文档:及时更新Data Guard配置文档,包括新的主库和备库信息

4. 日常维护

  • 定期测试切换流程:至少每季度在测试环境中测试一次切换流程,每年在生产环境中测试一次
  • 监控Data Guard状态:定期监控Data Guard的状态,包括Redo传输状态、应用状态、延迟等
  • 更新软件版本:及时更新Oracle和Data Guard的软件版本,修复已知的bug和漏洞
  • 优化配置:根据业务需求和系统负载,优化Data Guard配置,提高切换性能

故障处理

常见切换故障及解决方法

  1. Switchover命令执行失败

症状:执行ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY命令失败,提示错误信息

解决方法

  • 检查主库和备库的状态,确保都处于正常状态
  • 检查Data Guard配置,确保配置完整
  • 查看告警日志,定位具体的错误原因
  • 尝试使用WITH SESSION SHUTDOWN选项
  1. Redo日志应用失败

症状:备库无法应用Redo日志,提示错误信息

解决方法

  • 检查Redo日志的完整性
  • 验证主库和备库的Oracle版本是否兼容
  • 查看备库的告警日志,定位具体的错误原因
  • 尝试重新启动Redo应用进程
  1. 切换后应用无法连接

症状:切换后,应用程序无法连接到新主库

解决方法

  • 检查新主库的监听器状态
  • 验证客户端的tnsnames.ora配置是否正确
  • 检查新主库的VIP状态
  • 测试数据库连接,验证连接字符串是否正确

常见问题(FAQ)

Q: Switchover和Failover有什么区别?

A: Switchover是计划内的主备切换,用于计划内的维护活动,数据零丢失,主库和备库都处于正常状态;Failover是计划外的主备切换,用于主库故障时的应急恢复,主库处于故障状态,可能会丢失少量数据。

Q: 如何选择合适的切换类型?

A: 对于计划内的维护活动,如软件升级、硬件维护等,应使用Switchover;对于主库故障时的应急恢复,应使用Failover。

Q: Switchover会导致数据丢失吗?

A: 正常情况下,Switchover不会导致数据丢失,因为Switchover是在主库和备库都处于正常状态时执行的,所有Redo日志都会被传输到备库并应用。

Q: Failover会导致数据丢失吗?

A: Failover可能会导致少量数据丢失,取决于Data Guard的配置。如果使用SYNC传输模式和Real-Time Apply,数据丢失的风险最小;如果使用ASYNC传输模式,可能会丢失少量未传输到备库的Redo日志。

Q: 如何提高Data Guard切换的速度?

A: 可以通过以下方式提高Data Guard切换的速度:

  • 使用高速存储设备,提高Redo日志的读写性能
  • 使用高速网络连接,提高Redo日志的传输速度
  • 优化Oracle参数,如LOG_BUFFER、DBWR_IO_SLAVES等
  • 配置合适的Redo传输模式和应用模式
  • 定期维护Data Guard配置,确保配置最优

Q: 切换后如何重新配置Data Guard?

A: 切换后,需要重新配置Data Guard,以便进行后续的切换。具体步骤:

  • 将原主库作为新备库添加到Data Guard配置中
  • 配置Redo日志传输路径
  • 启动Redo应用进程
  • 验证Data Guard配置的完整性

总结

Data Guard主备切换是保证Data Guard高可用性的关键操作,支持Switchover和Failover两种切换类型。Switchover用于计划内的维护活动,数据零丢失;Failover用于主库故障时的应急恢复,可能会丢失少量数据。在执行切换之前,需要进行充分的准备工作,包括制定详细的切换计划、进行充分的测试、备份数据库等。切换过程中需要实时监控,及时发现和解决问题。切换后需要进行全面的验证,确保Data Guard配置正常,数据一致性,应用连接正常。通过定期测试切换流程、监控Data Guard状态、更新软件版本等日常维护工作,可以提高Data Guard切换的可靠性和性能。Oracle 21c相比19c在Data Guard切换方面有显著增强,包括提高切换速度、增强自动诊断和修复能力、优化云集成等功能。