Skip to content

手动切换流程

概述

手动切换是指在没有自动切换机制或自动切换失败时,由管理员手动执行的主备切换操作。手动切换适用于计划内的维护活动(如软件升级、硬件维护等)或计划外的故障恢复。手动切换需要管理员具备丰富的经验和专业知识,严格按照切换流程执行,确保切换过程的顺利进行和数据的安全性。

切换类型

手动切换支持以下两种类型:

1. 计划内手动切换

计划内手动切换是指在主库和备库都处于正常状态时,为了进行计划内的维护活动(如软件升级、硬件维护等)而执行的切换操作。计划内手动切换的数据零丢失,切换过程可控。

2. 计划外手动切换

计划外手动切换是指在主库发生故障时,为了快速恢复业务而执行的切换操作。计划外手动切换可能会丢失少量数据,切换过程需要谨慎执行。

切换前准备

在执行手动切换之前,需要进行以下准备工作:

1. 文档准备

  • Data Guard配置文档:包括主库和备库的配置信息、网络配置、参数设置等
  • 切换流程文档:详细的切换步骤、命令和预期输出
  • 回滚计划:切换失败时的回滚步骤和命令
  • 测试报告:之前在测试环境中执行切换的测试报告

2. 环境准备

  • 验证主库和备库状态:确保主库和备库都处于正常状态(计划内切换)
  • 检查Data Guard配置:确保Data Guard配置完整,没有任何警告或错误
  • 备份数据库:备份主库和备库的数据库,以便在切换失败时可以快速恢复
  • 验证网络连接:确保主库和备库之间的网络连接正常
  • 关闭不必要的应用:在切换期间关闭不必要的应用,减少对切换的影响

3. 团队准备

  • 成立切换小组:包括DBA、系统管理员、应用管理员等
  • 明确分工:为每个团队成员分配具体的职责和任务
  • 制定时间窗口:选择业务低峰期进行切换,减少对业务的影响
  • 通知相关人员:提前通知业务团队、管理层等相关人员,确保业务影响最小化
  • 准备沟通工具:准备切换过程中的沟通工具,如即时通讯工具、电话等

计划内手动切换流程

1. 切换前验证

步骤1:验证主库状态

在主库上执行以下命令,验证主库状态:

sql
-- 查看数据库状态
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

-- 查看Switchover状态
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
-- 输出应为:TO STANDBY或SESSIONS ACTIVE

-- 查看Redo传输状态
SELECT DEST_ID, DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE TARGET='STANDBY';

步骤2:验证备库状态

在备库上执行以下命令,验证备库状态:

sql
-- 查看数据库状态
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

-- 查看Switchover状态
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
-- 输出应为:TO PRIMARY或SESSIONS ACTIVE

-- 查看Redo应用状态
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY;

-- 查看应用延迟
SELECT NAME, VALUE FROM V$DATAGUARD_STATS WHERE NAME IN ('transport lag', 'apply lag');

2. 执行切换

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

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

sql
-- 验证主库可以切换
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

-- 如果有活动会话,终止所有会话
ALTER SYSTEM ENABLE RESTRICTED SESSION;

-- 将主库转换为备库
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;

-- 关闭并重启原主库
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

-- 启动Redo应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

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

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

sql
-- 验证备库可以切换
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

-- 将备库转换为主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

-- 打开新主库
ALTER DATABASE OPEN;

-- 启用所有会话
ALTER SYSTEM DISABLE RESTRICTED SESSION;

3. 切换后验证

步骤1:验证新主库状态

在新主库上执行以下命令,验证新主库状态:

sql
-- 查看数据库状态
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

-- 查看Redo传输状态
SELECT DEST_ID, DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE TARGET='STANDBY';

-- 查看数据库服务状态
srvctl status database -d <dbname>

步骤2:验证新备库状态

在新备库上执行以下命令,验证新备库状态:

sql
-- 查看数据库状态
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

-- 查看Redo应用状态
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY;

-- 查看应用延迟
SELECT NAME, VALUE FROM V$DATAGUARD_STATS WHERE NAME IN ('transport lag', 'apply lag');

步骤3:验证应用连接

测试应用程序是否可以正常连接到新主库:

bash
# 使用SQL*Plus测试连接
sqlplus scott/tiger@<new_primary_tns>

# 执行简单查询
SELECT COUNT(*) FROM employees;

步骤4:验证数据一致性

使用DBMS_COMPARISON包验证新主库和新备库的数据一致性:

sql
-- 创建比较任务
BEGIN
  DBMS_COMPARISON.CREATE_COMPARISON(
    comparison_name => 'EMPLOYEES_COMPARISON',
    schema_name => 'HR',
    object_name => 'EMPLOYEES',
    dblink_name => 'STANDBY_DB_LINK'
  );
END;
/

-- 执行比较
DECLARE
  l_result BOOLEAN;
BEGIN
  l_result := DBMS_COMPARISON.COMPARE(
    comparison_name => 'EMPLOYEES_COMPARISON',
    scan_mode => DBMS_COMPARISON.FULL
  );
END;
/

-- 查看比较结果
SELECT * FROM DBA_COMPARISON_RESULTS WHERE COMPARISON_NAME = 'EMPLOYEES_COMPARISON';

计划外手动切换流程

1. 切换前验证

步骤1:确认主库故障

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

bash
# 尝试连接主库
sqlplus scott/tiger@<primary_tns>

# 检查主库服务器状态
ping <primary_host>
ssh <primary_host> "ps -ef | grep ora_pmon"

步骤2:验证备库状态

在备库上执行以下命令,验证备库状态:

sql
-- 查看数据库状态
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

-- 查看Redo应用状态
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY;

-- 查看应用延迟
SELECT NAME, VALUE FROM V$DATAGUARD_STATS WHERE NAME IN ('transport lag', 'apply lag');

2. 执行切换

步骤1:准备备库

在备库上执行以下命令,准备备库接管主库角色:

sql
-- 停止Redo应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 尝试应用所有可用的Redo日志
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;

-- 如果上述命令失败,使用FORCING选项
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;

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

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

sql
-- 将备库转换为主库
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

-- 如果上述命令失败,使用Failover命令
ALTER DATABASE FAILOVER TO <db_unique_name>;

-- 打开新主库
ALTER DATABASE OPEN;

-- 启用所有会话
ALTER SYSTEM DISABLE RESTRICTED SESSION;

3. 切换后恢复

步骤1:验证新主库状态

在新主库上执行以下命令,验证新主库状态:

sql
-- 查看数据库状态
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

-- 查看数据库服务状态
srvctl status database -d <dbname>

步骤2:重新配置Data Guard

将原主库作为新备库添加到Data Guard配置中:

sql
-- 在新主库上配置Redo传输
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=<old_primary_tns> ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=<old_primary_db_unique_name>';

-- 启动Redo传输
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;

-- 在原主库上启动Redo应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

步骤3:验证新的Data Guard配置

验证新的Data Guard配置是否正常:

sql
-- 在新主库上查看Redo传输状态
SELECT DEST_ID, DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE TARGET='STANDBY';

-- 在原主库上查看Redo应用状态
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY;

回滚计划

在切换过程中,如果出现问题,需要执行回滚操作。回滚计划包括以下步骤:

1. 计划内切换回滚

如果在计划内切换过程中出现问题,可以执行以下回滚操作:

  • 如果主库已转换为备库,但备库未转换为主库

    sql
    -- 在原主库上执行
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
    ALTER DATABASE OPEN;
    ALTER SYSTEM DISABLE RESTRICTED SESSION;
  • 如果备库已转换为主库,但原主库未正常转换为备库

    sql
    -- 在新主库上执行
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
    SHUTDOWN IMMEDIATE;
    STARTUP MOUNT;
    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
    
    -- 在原主库上执行
    ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
    ALTER DATABASE OPEN;
    ALTER SYSTEM DISABLE RESTRICTED SESSION;

2. 计划外切换回滚

计划外切换后,如果需要回滚,需要重新配置Data Guard,将原主库恢复为主库角色。具体步骤:

  • 修复原主库的故障
  • 重新配置Data Guard,将原主库作为主库,新主库作为备库
  • 执行Switchover切换,将原主库恢复为主库角色

版本差异

Oracle 19c vs 21c手动切换差异

特性Oracle 19cOracle 21c
切换命令传统命令增强命令,支持更多选项
切换速度一般显著提升,优化了切换流程
错误处理基础错误处理增强错误处理,提供更详细的错误信息
自动验证基础自动验证增强自动验证,减少手动验证步骤
云集成基础云集成增强云集成,支持与OCI、AWS、Azure等云平台的手动切换
监控能力基础监控能力增强监控能力,提供更详细的切换状态和性能指标

最佳实践

1. 切换前

  • 制定详细的切换计划:包括切换步骤、命令、预期输出和时间窗口
  • 进行充分的测试:在测试环境中多次测试切换流程,验证切换的可行性
  • 备份数据库:备份主库和备库的数据库,以便在切换失败时可以快速恢复
  • 通知相关团队:提前通知业务团队、应用团队、运维团队等,确保业务影响最小化
  • 准备必要的工具和资源:准备好SQL*Plus、RMAN、Data Guard命令行工具等必要的工具

2. 切换过程中

  • 严格按照切换流程执行:不要跳过任何步骤,确保每个步骤的执行结果符合预期
  • 详细记录切换过程:记录每个步骤的执行命令、输出和时间,以便后续分析
  • 实时监控切换状态:监控主库和备库的状态,及时发现和解决问题
  • 保持沟通:切换过程中保持与相关团队的沟通,确保信息同步
  • 准备回滚计划:在切换过程中,如果出现问题,立即执行回滚计划

3. 切换后

  • 全面验证切换结果:验证新主库和新备库的状态、数据一致性、应用连接等
  • 更新文档:及时更新Data Guard配置文档,包括新的主库和备库信息
  • 测试业务功能:测试应用程序的核心业务功能,确保业务正常运行
  • 监控系统性能:监控新主库的性能,确保性能正常
  • 制定后续维护计划:制定后续的维护计划,包括原主库的恢复、Data Guard配置的优化等

常见问题及解决方法

1. 切换命令执行失败

症状:执行切换命令时,命令失败,提示错误信息

解决方法

  • 查看告警日志,定位具体的错误原因
  • 检查主库和备库的状态,确保状态正常
  • 验证Data Guard配置,确保配置完整
  • 尝试使用不同的切换选项,如WITH SESSION SHUTDOWN
  • 执行回滚操作,恢复到切换前的状态

2. 切换后应用无法连接

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

解决方法

  • 检查新主库的监听器状态
  • 验证客户端的tnsnames.ora配置是否正确
  • 检查新主库的VIP状态
  • 测试数据库连接,验证连接字符串是否正确
  • 检查新主库的会话限制,确保没有启用RESTRICTED SESSION

3. 切换后数据不一致

症状:切换后,新主库和新备库的数据不一致

解决方法

  • 使用DBMS_COMPARISON包验证数据一致性
  • 修复不一致的数据
  • 重新配置Data Guard,确保Redo日志正常传输和应用
  • 定期监控数据一致性,及时发现和解决问题

总结

手动切换是Oracle数据库高可用性的重要组成部分,适用于计划内的维护活动和计划外的故障恢复。手动切换需要管理员具备丰富的经验和专业知识,严格按照切换流程执行,确保切换过程的顺利进行和数据的安全性。在执行手动切换之前,需要进行充分的准备工作,包括文档准备、环境准备和团队准备。切换过程中需要严格按照切换流程执行,实时监控切换状态,保持与相关团队的沟通。切换后需要全面验证切换结果,更新文档,测试业务功能,监控系统性能。通过制定详细的切换计划、进行充分的测试、备份数据库等最佳实践,可以提高手动切换的可靠性和成功率。Oracle 21c相比19c在手动切换方面有显著增强,包括提高切换速度、增强错误处理、优化云集成等功能。