Oracle 数据库故障诊断

Oracle 数据库故障诊断

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

数据库故障诊断方法论[1]:

故障类型

  • 启动失败
  • 性能问题
  • 数据损坏
  • 连接问题
  • 空间不足

2. 启动失败

2.1 ORA-01078 / LRM-00109

-- 参数文件问题
-- 1. 检查 SPFILE
SHOW PARAMETER spfile

-- 2. 从 PFILE 启动
STARTUP PFILE='?/dbs/initorcl.ora'

-- 3. 重建 SPFILE
CREATE SPFILE FROM PFILE;

2.2 ORA-00205

-- 控制文件问题
-- 1. 检查控制文件
SHOW PARAMETER control_files

-- 2. 查 trace
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';

-- 3. 恢复控制文件
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;

2.3 ORA-01102

-- 不能 EXCLUSIVE mount
-- 1. 检查其他实例
-- 2. ipcs / ipcrm
ipcs -m | grep oracle
ipcrm -m <id>

-- 3. 重启

2.4 ORA-01113

-- 需要介质恢复
STARTUP MOUNT;
RECOVER DATABASE;
ALTER DATABASE OPEN;

2.5 ORA-01589

-- RESETLOGS / NORESETLOGS
-- 1. 不完全恢复
RECOVER DATABASE UNTIL CANCEL;
ALTER DATABASE OPEN RESETLOGS;

3. 性能问题

3.1 慢

-- AWR
@?/rdbms/admin/awrrpt.sql

-- ASH
@?/rdbms/admin/ashrpt.sql

详细见:Oracle 性能问题排查实战

3.2 CPU 高

-- Top SQL
SELECT sql_id, cpu_time / 1000000 AS sec FROM v$sql 
ORDER BY cpu_time DESC FETCH FIRST 10 ROWS ONLY;

详细见:Oracle 数据库 CPU 高排查

3.3 I/O 慢

-- 文件 I/O
SELECT file_name, phyrds, phywrts FROM v$filestat ...;

详细见:Oracle 数据库 I/O 优化


4. 数据损坏

4.1 ORA-01578

-- 数据块损坏
-- 1. 查损坏
SELECT * FROM v$database_block_corruption;

-- 2. RMAN 恢复
RMAN> RECOVER CORRUPTION LIST;

-- 3. DBMS_REPAIR
EXEC DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('SCOTT', 'TABLE_NAME');

详细见:Oracle DBMS_REPAIR 修复损坏块

4.2 ORA-00600

-- 内部错误
-- 1. 查 incident
SELECT * FROM v$diag_incident WHERE error_number = 600;

-- 2. 打包
adrci
ips create package incident <id>
ips generate package <pkg> in /tmp

-- 3. Oracle Support

4.3 ORA-07445

-- 进程崩溃
-- 类似 ORA-00600 处理

5. 连接问题

5.1 ORA-12541

TNS:no listener
1. 检查 listener
lsnrctl status
2. 启动
lsnrctl start
3. 端口防火墙

5.2 ORA-12154

TNS:could not resolve connect identifier
1. tnsnames.ora
2. TNS_ADMIN
3. tnsping 测试

5.3 ORA-12514

TNS:listener does not know of service
1. 检查服务注册
lsnrctl services
2. 强制注册
ALTER SYSTEM REGISTER;
3. LOCAL_LISTENER

5.4 ORA-12520

listener could not find available handler
1. PROCESSES 不足
2. 共享服务器
3. 连接池

详细见:Oracle 网络架构与监听器配置


6. 空间问题

6.1 ORA-01653

-- 表空间不足
ALTER TABLESPACE users ADD DATAFILE '...' SIZE 5G;
-- 或
ALTER DATABASE DATAFILE '...' RESIZE 10G;
ALTER DATABASE DATAFILE '...' AUTOEXTEND ON NEXT 1G;

6.2 ORA-19809

-- FRA 满
RMAN> DELETE OBSOLETE;
ALTER SYSTEM SET db_recovery_file_dest_size = 1T;

6.3 ORA-00257

-- 归档满
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE EXPIRED ARCHIVELOG ALL;

详细见:Oracle 归档日志管理


7. 内存问题

7.1 ORA-04031

-- Shared Pool 不足
-- 1. 增大
ALTER SYSTEM SET shared_pool_size = 4G;

-- 2. 绑定变量
-- 3. FLUSH(临时)
ALTER SYSTEM FLUSH SHARED_POOL;

7.2 ORA-04036

-- PGA 不足
ALTER SYSTEM SET pga_aggregate_limit = 16G;

7.3 ORA-00821

-- SGA 不足
-- 1. 检查物理内存
-- 2. 调整 sga_target

8. 锁问题

8.1 ORA-00060

-- 死锁
-- 1. 查 trace
-- 2. 调整事务顺序
-- 3. 减少 ITL 等待

详细见:Oracle 锁等待深度分析

8.2 锁阻塞

-- 1. 找阻塞
SELECT blocking_session, sid, event 
FROM v$session WHERE blocking_session IS NOT NULL;

-- 2. 杀会话
ALTER SYSTEM KILL SESSION 'sid,serial#';

9. ADR 工具

9.1 ADRCI

adrci

# 命令
show home
show problem
show incident
show alert
purge -age 1440 -type ALERT

详细见:Oracle 日志与诊断文件

9.2 Incident

SELECT * FROM v$diag_incident;
SELECT * FROM v$diag_problem;

9.3 HM

-- 健康检查
EXEC DBMS_HM.RUN_CHECK('Database Check Health', 'my_run');
SELECT DBMS_HM.GET_RUN_REPORT('my_run') FROM dual;

详细见:Oracle 数据库健康检查


10. 故障诊断流程

10.1 收集信息

1. 故障现象
2. 发生时间
3. 影响范围
4. 错误信息
5. 最近变更

10.2 定位

1. Alert log
2. Trace
3. ADR
4. 视图
5. OS 监控

10.3 处理

1. 临时方案
2. 根因
3. 永久方案
4. 验证
5. 文档

11. 常见错误速查

错误说明处理
ORA-01078参数文件检查 SPFILE
ORA-01578块损坏RMAN/DBMS_REPAIR
ORA-00600内部错误打包 Oracle
ORA-04031Shared Pool增大/绑定变量
ORA-12154TNStnsnames.ora
ORA-12514服务注册
ORA-00060死锁调整顺序
ORA-01653表空间增大
ORA-00257归档满清理

12. 最佳实践

  1. ADR 统一:管理
  2. ADRCI 工具:CLI
  3. Alert log 监控:及时
  4. Incident 打包:严重错误
  5. HM 健康检查:预防
  6. 方法论:系统化
  7. 根因分析:彻底
  8. 文档化:积累
  9. 监控告警:自动化
  10. 测试验证:可行

13. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Diagnosing” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/diagnosing.html