维护笔记:Oracle 启动失败 ORA-03113 + ORA-19809 实战排错全记录
今天分享一次Oracle启动故障 ——Oracle 12c 数据库启动失败,报 ORA-03113 和 ORA-19809 的处理实战。
一、故障现象
在尝试启动 Oracle 数据库时,提示如下错误:
同时,后台日志 alert_rac12c.log 显示如下内容:
tail -100 /data/u01/app/oracle/diag/rdbms/rac12c/rac12c/trace/alert_rac12c.log
二、问题分析
错误分析关键点如下:
- ORA-19815:FRA(Fast Recovery Area)已满;
- ORA-19809:无法创建新的归档日志;
- ORA-16038:当前 redo log 无法归档;
- ORA-03113:客户端与实例失联(其实是 Oracle 主动终止实例);
这是一种典型的因 FRA 空间不足导致 redo 无法归档,最终实例崩溃 的场景。
三、解决步骤
1. 清理日志
我们手动删除了一部分归档日志文件(这一步要谨慎,可以先备份):
rm -rf /data/u01/app/oracle/fast_recovery_area/rac12c/RAC12C/archivelog/*
但仅删除物理文件还不够,Oracle 控制文件中仍然记录了这些日志。
2. 使用 RMAN 进行同步
rman target /
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE EXPIRED ARCHIVELOG ALL;
这一操作可以同步控制文件和实际文件状态,释放空间并消除假归档记录。但是执行失败。
第二步尝试仍失败。
重新执行 startup 后仍然失败,说明当前 redo 日志已经“卡死”,无法被归档,也无法被覆盖。
3. 强制切换至非归档模式救急
为了解除当前 redo log 的归档限制,我们使用以下“强制解锁”方案:
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;
这一步成功打开数据库。
随后为了恢复正常备份策略,我们重新切回归档模式:
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
至此,问题成功解决。
四、总结与建议
故障根因:
主要问题是我们没有给日志归档设置自动回收,FRA 空间耗尽,导致 redo 无法归档,实例异常终止。
五、预防建议
项目 | 建议配置 |
FRA 空间 | 不小于数据库大小的 2 倍 |
RMAN 策略 |
|
定期清理 | 使用 |