外观
手动切换流程
概述
手动切换是指在没有自动切换机制或自动切换失败时,由管理员手动执行的主备切换操作。手动切换适用于计划内的维护活动(如软件升级、硬件维护等)或计划外的故障恢复。手动切换需要管理员具备丰富的经验和专业知识,严格按照切换流程执行,确保切换过程的顺利进行和数据的安全性。
切换类型
手动切换支持以下两种类型:
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 19c | Oracle 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在手动切换方面有显著增强,包括提高切换速度、增强错误处理、优化云集成等功能。
