外观
Oracle 应急计划制定
生产场景案例
金融核心系统数据库崩溃应急处理
背景:某银行核心系统数据库在交易高峰期突然崩溃,导致所有柜台和网上银行交易无法进行,影响大量客户。
应急响应过程:
- 故障检测:监控系统自动触发告警,显示数据库实例状态异常
- 故障报告:DBA 立即通知应急响应负责人,启动应急响应流程
- 诊断故障:通过 ADRCI 查看告警日志,发现错误:
ORA-00600: internal error code, arguments: [12345], [67890], [a], [b], [c], [], [], [] - 尝试恢复:尝试重启数据库实例,但失败,出现相同错误
- 启动备用方案:切换到 Data Guard 备库,将其提升为主库
- 恢复业务:更新应用连接字符串,业务系统恢复正常
- 根因分析:后续分析发现是 Oracle 19c 的一个已知 bug,应用最新补丁后问题解决
- 回切主库:在业务低峰期,将主库恢复并回切
结果:业务中断时间控制在 15 分钟以内,符合 RTO 要求,数据零丢失
应急计划概述
什么是应急计划
Oracle 数据库应急计划是一份详细的文档,用于指导 DBA 和相关人员在数据库发生重大故障或灾难时的应对措施。其目标是最大限度地减少数据库故障对业务的影响,确保数据库能够快速恢复,保障业务连续性。
应急计划的重要性
- 减少业务停机时间:快速、有序的应急响应可显著减少业务停机时间
- 降低数据丢失风险:合理的应急计划可最大限度地减少数据丢失
- 提高团队协作效率:明确的职责分工和流程可提高团队协作效率
- 符合合规要求:许多行业法规要求企业制定和维护应急计划
- 增强信心:完善的应急计划可增强管理层和业务部门对 IT 系统的信心
应急计划的范围
Oracle 数据库应急计划应涵盖以下场景:
- 数据库故障:数据库崩溃、实例故障、数据文件损坏、控制文件丢失等
- 硬件故障:服务器故障、存储故障、网络故障、电源故障等
- 自然灾害:地震、火灾、洪水、台风等
- 人为错误:误删除数据、误操作数据库、配置错误等
- 安全事件:黑客攻击、数据泄露、勒索软件等
应急计划制定流程
风险评估
目标:识别可能影响 Oracle 数据库的风险和威胁
实施步骤:
- 识别风险:列出所有可能影响数据库的风险,包括技术风险、自然风险和人为风险
- 评估影响:评估每个风险对业务的影响程度,包括停机时间、数据丢失、财务损失等
- 评估概率:评估每个风险发生的概率
- 确定优先级:根据风险影响和概率,确定风险的优先级
输出:风险评估报告,包含风险清单、影响评分、概率评分和优先级
业务影响分析
目标:评估数据库故障对业务的具体影响
实施步骤:
- 识别关键业务流程:确定哪些业务流程依赖于 Oracle 数据库,以及依赖程度
- 确定 RTO 和 RPO:
- RTO (Recovery Time Objective):业务可接受的最大停机时间
- RPO (Recovery Point Objective):业务可接受的最大数据丢失量
- 评估业务损失:量化不同停机时间对业务造成的损失
输出:业务影响分析报告,包含关键业务流程、RTO/RPO 要求和业务损失评估
制定应急策略
目标:根据风险评估和业务影响分析,制定相应的应急策略
常见应急策略:
| 策略类型 | 具体措施 | 适用场景 |
|---|---|---|
| 高可用性架构 | Oracle RAC、Data Guard、GoldenGate | 关键业务系统,要求高可用性 |
| 备份与恢复 | 每日全备、每小时增量备、实时归档 | 所有数据库,作为最后一道防线 |
| 灾难恢复站点 | 异地灾备中心,同步或异步复制 | 核心业务系统,防止区域性灾难 |
| 冗余设计 | 电源冗余、存储冗余、网络冗余 | 所有关键组件,防止单点故障 |
| 多云部署 | 跨云部署,实现云间容灾 | 对可用性要求极高的系统 |
制定应急响应流程
目标:制定详细的应急响应流程,确保在发生故障时能够快速、有序地响应
应急响应流程:
- 故障检测:通过监控系统或用户报告发现数据库故障
- 故障报告:通过电话、邮件或告警系统通知相关人员
- 故障评估:初步评估故障的严重程度和影响范围
- 分级响应:根据故障级别,启动相应的应急响应方案
- 恢复操作:执行具体的恢复步骤,恢复数据库和业务
- 验证恢复:验证数据库和业务功能是否正常
- 恢复后处理:清理环境、记录事件、分析根因
故障分级:
- 一级故障:核心业务系统完全不可用,影响大量用户
- 二级故障:核心业务系统部分功能不可用,影响部分用户
- 三级故障:非核心业务系统不可用,影响范围有限
- 四级故障:单个组件故障,不影响业务运行
明确职责分工
目标:明确应急响应团队成员的职责和权限,避免职责不清
应急响应团队组成:
| 角色 | 职责 |
|---|---|
| 应急响应负责人 | 负责整体应急响应的协调和决策,决定是否启动应急计划 |
| 数据库管理员 | 负责数据库的故障诊断、恢复操作和验证 |
| 系统管理员 | 负责服务器、存储、网络等基础设施的故障诊断和恢复 |
| 应用管理员 | 负责应用系统的故障诊断、配置更新和验证 |
| 业务代表 | 负责评估故障对业务的影响,参与恢复决策 |
| 通信协调员 | 负责内外部通信和信息发布,保持信息透明 |
| 供应商支持 | 负责提供产品支持,如 Oracle 技术支持 |
制定恢复方案
目标:制定不同故障场景的详细恢复方案,确保恢复操作有章可循
常见故障场景恢复方案:
数据库崩溃恢复方案
适用场景:数据库实例突然崩溃,无法正常启动
恢复步骤:
- 尝试重启数据库实例:
sqlplus / as sysdba→startup - 如果重启失败,查看告警日志和跟踪文件,分析故障原因
- 根据故障原因采取相应措施,如应用补丁、恢复数据文件等
- 如果无法在 RTO 内恢复,启动备用方案,如切换到 Data Guard 备库
- 恢复后验证数据一致性:
ANALYZE DATABASE VALIDATE STRUCTURE; - 通知业务部门验证业务功能
数据文件损坏恢复方案
适用场景:单个或多个数据文件损坏,数据库无法正常运行
恢复步骤:
- 确定损坏的数据文件:
SELECT name, status FROM v$datafile WHERE status != 'ONLINE'; - 将数据库置于 mount 状态:
sqlplus / as sysdba→shutdown immediate→startup mount - 从备份恢复损坏的数据文件:
RMAN> RESTORE DATAFILE '<datafile_path>'; - 执行介质恢复:
RMAN> RECOVER DATAFILE '<datafile_path>'; - 打开数据库:
sqlplus / as sysdba→alter database open; - 验证数据文件状态:
SELECT name, status FROM v$datafile;
Data Guard 切换方案
适用场景:主库无法正常运行,需要切换到备库
恢复步骤:
- 确认主库状态:
sqlplus / as sysdba→SELECT status FROM v$instance; - 在备库上验证同步状态:
SELECT apply_delay, state FROM v$archive_dest_status WHERE dest_id=2; - 将备库提升为主库:sql
sqlplus / as sysdba ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN; ALTER DATABASE OPEN; - 更新应用连接字符串,指向新的主库
- 验证业务功能正常
制定通信计划
目标:确保应急响应期间信息及时、准确地传递给相关人员
通信计划内容:
- 内部通信渠道:建立专门的应急响应微信群、电话会议等
- 外部通信流程:与管理层、业务部门、供应商、客户的沟通流程
- 信息发布模板:标准化的故障通知、进展更新和恢复通知模板
- 沟通频率:根据故障级别确定沟通频率,一级故障每 15 分钟更新一次
故障通知模板示例:
【故障通知】Oracle 核心数据库故障
- 故障时间:2025-12-26 14:30:00
- 故障描述:核心数据库实例崩溃,所有交易无法进行
- 影响范围:所有柜台、网上银行、手机银行
- 应急状态:已启动一级应急响应
- 负责人:张三(13800138000)
- 最新进展:正在尝试重启数据库实例制定测试计划
目标:确保应急计划的有效性和可执行性
测试类型和频率:
| 测试类型 | 测试频率 | 测试内容 |
|---|---|---|
| 桌面演练 | 每季度一次 | 团队成员通过讨论模拟应急响应过程 |
| 功能测试 | 每半年一次 | 测试单个故障场景的恢复方案 |
| 全面测试 | 每年一次 | 模拟真实故障场景,测试完整应急响应流程 |
| 灾难恢复演练 | 每两年一次 | 测试异地灾备站点的切换过程 |
| 随机抽查 | 不定期 | 随机抽取团队成员,测试其对职责和流程的熟悉程度 |
测试评估指标:
- 恢复时间是否符合 RTO 要求
- 数据丢失是否符合 RPO 要求
- 团队响应是否及时有序
- 沟通是否顺畅有效
- 文档是否完整准确
制定维护计划
目标:确保应急计划的时效性和准确性
维护内容:
- 定期更新:每季度评审一次,每年全面更新一次
- 变更同步:当数据库环境发生重大变更时,及时更新应急计划
- 培训计划:每季度组织一次应急响应培训
- 文档管理:使用版本控制工具管理应急计划,确保可追溯性
- 多副本存储:将应急计划存储在本地和远程多个位置
应急计划关键内容
应急响应团队联系方式
| 角色 | 姓名 | 电话 | 邮箱 | 负责系统 |
|---|---|---|---|---|
| 应急响应负责人 | 张三 | 13800138000 | zhangsan@example.com | 所有系统 |
| 数据库管理员 | 李四 | 13800138001 | lisi@example.com | 核心系统、报表系统 |
| 系统管理员 | 王五 | 13800138002 | wangwu@example.com | 所有服务器和存储 |
| 应用管理员 | 赵六 | 13800138003 | zhaoliu@example.com | 核心业务系统 |
| 业务代表 | 孙七 | 13800138004 | sunqi@example.com | 业务部门 |
| 通信协调员 | 周八 | 13800138005 | zhouba@example.com | 内外部通信 |
| Oracle 支持 | Oracle Support | 400-810-3939 | support@oracle.com | 技术支持 |
关键系统信息
| 系统 | 核心业务系统 | 报表系统 |
|---|---|---|
| 数据库版本 | Oracle 19c Enterprise Edition | Oracle 21c Enterprise Edition |
| 数据库实例名 | COREDB | REPORTDB |
| 数据库 SID | COREDB | REPORTDB |
| 监听端口 | 1521 | 1522 |
| 服务器信息 | Linux x86_64, 32 CPU, 128 GB RAM | Linux x86_64, 16 CPU, 64 GB RAM |
| 存储类型 | SAN 存储,10 TB 可用空间 | NAS 存储,5 TB 可用空间 |
| 高可用架构 | Data Guard + RAC | Data Guard |
| 备份策略 | 每日全备,每 15 分钟增量备 | 每日全备,每小时增量备 |
| RTO | 15 分钟 | 4 小时 |
| RPO | 0 数据丢失 | 1 小时 |
关键资源位置
| 资源类型 | 位置 | 访问方式 |
|---|---|---|
| 数据库备份 | /backup/oracle/core | NFS 共享 |
| 归档日志 | /archivelog/oracle/core | NFS 共享 |
| 告警日志 | $ORACLE_BASE/diag/rdbms/coredb/core/trace/alert_coredb.log | SSH |
| 跟踪文件 | $ORACLE_BASE/diag/rdbms/coredb/core/trace/ | SSH |
| 监听器日志 | $ORACLE_BASE/diag/tnslsnr/server1/listener/trace/listener.log | SSH |
| 应急计划文档 | //shared/it/oracle/emergency_plan/ | SMB 共享 |
| 恢复脚本 | //shared/it/oracle/scripts/recovery/ | SMB 共享 |
| 监控系统 | http://monitor.example.com | Web 访问 |
常用恢复脚本
数据库状态检查脚本
sql
-- 检查实例状态
SELECT instance_name, status, database_status FROM v$instance;
-- 检查数据库状态
SELECT name, open_mode, log_mode FROM v$database;
-- 检查数据文件状态
SELECT name, status FROM v$datafile;
-- 检查控制文件状态
SELECT name, status FROM v$controlfile;
-- 检查日志文件状态
SELECT member, status FROM v$logfile;
-- 检查归档日志状态
SELECT dest_name, status, error FROM v$archive_dest_status;Data Guard 状态检查脚本
sql
-- 检查备库应用状态
SELECT process, status, thread#, sequence#, block# FROM v$managed_standby;
-- 检查主备库同步差距
SELECT name, value FROM v$dataguard_stats WHERE name IN ('transport lag', 'apply lag');
-- 检查归档日志应用情况
SELECT sequence#, applied FROM v$archived_log ORDER BY sequence# DESC;备份状态检查脚本
sql
-- 检查 RMAN 备份状态
SELECT session_key, start_time, end_time, status, input_type, output_bytes/1024/1024/1024 AS output_gb
FROM v$rman_backup_job_details
ORDER BY start_time DESC;
-- 检查最近的备份完成时间
SELECT completion_time, type, status
FROM v$backup_set
ORDER BY completion_time DESC;Oracle 19c vs 21c 应急计划差异
| 特性 | Oracle 19c | Oracle 21c |
|---|---|---|
| 高可用性架构 | RAC、Data Guard、GoldenGate | 增强的 RAC (Flex Cluster)、Data Guard (Automatic Failover)、GoldenGate (Microservices) |
| 备份恢复 | 传统 RMAN 备份恢复 | 增强的 RMAN (Incremental Merge Backup)、支持 OCI 备份 |
| 自动诊断 | 有限的自动诊断能力 | AI 驱动的自动诊断 (Oracle Diagnostics Pack),提供更精准的故障定位 |
| 自动恢复 | 基本的自动恢复功能 | 增强的自动恢复 (Auto Recovery),支持更多故障类型的自动修复 |
| 云集成 | 基本的云集成 | 增强的云集成,支持混合云和多云环境,可自动同步到 OCI |
| 多租户支持 | 支持多租户 | 增强的多租户支持,支持 PDB 级别的故障隔离和恢复 |
| 机器学习 | 有限的机器学习支持 | 增强的机器学习支持,可预测潜在故障 |
| 补丁管理 | 传统的补丁应用 | 增强的补丁管理 (Zero Downtime Patching),支持滚动应用和自动回滚 |
常见问题(FAQ)
如何确定是否需要启动应急计划?
当发生以下情况时,应启动应急计划:
- 数据库故障影响核心业务运行
- 故障无法在短时间内修复
- 故障符合预设的故障分级标准
- 管理层要求启动应急计划
应急计划应如何存储和访问?
应急计划应存储在多个位置,包括:
- 本地文件服务器(共享目录)
- 云端存储(如 OCI Object Storage、AWS S3)
- 打印版本(存放在安全位置)
- 团队成员的个人设备(加密存储)
确保在发生灾难时,至少有一个位置的应急计划可以访问。
如何处理超出应急计划范围的故障?
- 立即通知应急响应负责人和 Oracle 技术支持
- 尝试使用现有的知识和经验进行诊断和恢复
- 记录所有操作和结果
- 事后更新应急计划,将新的故障场景纳入范围
如何确保团队成员熟悉应急计划?
- 定期组织应急响应培训和演练
- 制作简洁的应急响应卡片,方便团队成员随身携带
- 不定期进行知识抽查和模拟演练
- 将应急计划作为新员工培训的重要内容
如何评估应急计划的有效性?
- 通过定期演练评估恢复时间和数据丢失情况
- 收集团队成员的反馈,找出计划中的不足之处
- 分析实际故障处理过程,对比计划和实际执行的差异
- 定期邀请外部专家进行评审
如何处理跨时区的应急响应?
- 建立 24x7 的值班制度
- 确保每个时区都有熟悉应急计划的人员
- 使用全球化的通信工具,如 Slack、Microsoft Teams
- 明确不同时区人员的职责和响应流程
如何处理涉及多个系统的复杂故障?
- 成立跨系统的应急响应团队
- 确定故障的根本原因和影响范围
- 制定优先级,先恢复核心系统
- 确保各系统之间的协调和沟通
应急计划最佳实践
制定原则
- 简明扼要:应急计划应简明扼要,易于理解和执行
- 详细具体:包含确切的命令和步骤,确保在紧急情况下可以直接使用
- 可测试性:计划应可测试,确保其有效性
- 灵活性:计划应具有一定的灵活性,能够适应不同的情况
- 持续改进:根据实际经验和新的技术发展,持续改进应急计划
实施建议
- 多副本存储:将应急计划存储在多个位置,确保在发生灾难时可以访问
- 定期测试:定期进行应急演练,提高团队的应急响应能力
- 培训优先:确保团队成员熟悉应急计划和各自的职责
- 文档化:详细记录应急响应过程和结果,便于后续分析和改进
- 与业务对齐:确保应急计划符合业务的 RTO 和 RPO 要求
- 自动化工具:使用自动化工具,如 Ansible、Chef 等,提高恢复效率
- 模拟演练:定期进行模拟演练,模拟真实的故障场景
- 持续优化:根据应急响应的经验教训,持续优化应急计划
恢复后行动
- 根因分析:对故障进行深入的根因分析,找出根本原因
- 修复根本问题:采取措施修复根本问题,防止类似故障再次发生
- 更新应急计划:根据故障处理经验,更新应急计划
- 培训和分享:组织培训和分享会,将经验教训分享给团队成员
- 向管理层汇报:向管理层提交故障报告,包括故障原因、处理过程、恢复时间和改进措施
总结
Oracle 数据库应急计划是保障数据库高可用性和业务连续性的重要组成部分。制定完善的应急计划需要进行风险评估、业务影响分析、制定应急策略和响应流程、明确职责分工、制定恢复方案和通信计划等步骤。
应急计划应定期测试和更新,确保其有效性和时效性。通过制定和执行完善的应急计划,可以最大限度地减少数据库故障对业务的影响,保障业务的连续性和数据的安全性。
随着 Oracle 数据库版本的演进,特别是 Oracle 21c 引入的 AI 驱动的诊断工具和自动恢复功能,应急计划的制定和执行也在不断发展。DBA 应关注这些新特性,持续优化应急计划,提高数据库的可用性和可靠性。
