Oracle数据库的日志体系以**Automatic Diagnostic Repository (ADR)**为核心,统一管理数据库及集群相关的诊断日志与跟踪文件,替代了传统10g及之前版本的分散目录结构(如bdump、udump)。日志主要分为四类:
日志路径可通过以下SQL查询:
-- 查询诊断目的地(ADR基础路径)
SHOW PARAMETER diagnostic_dest;
-- 查询Alert日志路径
SELECT value FROM v$diag_info WHERE name = 'Diag Trace';
-- 查询归档日志路径
ARCHIVE LOG LIST;
Alert日志是数据库状态的“晴雨表”,可通过以下命令快速定位并查看最新内容:
# 方法1:通过ADR路径直接访问(推荐)
tail -f $(ls -td $ORACLE_BASE/diag/rdbms/*/*/trace/alert_*.log | head -1)
# 方法2:通过SQL查询路径后查看
SQL> SHOW PARAMETER diagnostic_dest;
# 输出类似/u01/app/oracle/diag/rdbms/orcl/orcl1/trace/alert_orcl1.log
tail -f /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/alert_orcl1.log
tail -f可实时监控日志新增内容,便于快速响应问题。
使用grep命令筛选Oracle错误码(如ORA-),快速定位问题根源:
# 查找所有ORA-错误(包含错误码及描述)
grep -i "ORA-" $ORACLE_BASE/diag/rdbms/orcl/orcl1/trace/alert_orcl1.log
# 统计ORA-00600错误出现次数(结合awk)
grep "ORA-00600" alert_orcl1.log | awk '{print $NF}' | sort | uniq -c
-i忽略大小写,NF表示行尾字段(通常为错误码),sort | uniq -c统计错误出现频率。
当Alert日志中出现ORA-00600、ORA-07445等严重错误时,需结合Trace文件深入分析。Trace文件路径通常在Alert日志中提及(如“ORA-00600: see trace file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_12345.trc”),可使用tkprof工具格式化(适用于SQL Trace)或直接查看堆栈信息:
# 直接查看Trace文件(重点关注“ORA-00600”后的参数及堆栈)
less /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_12345.trc
# 格式化SQL Trace文件(需提供用户名/密码)
tkprof /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_12345.trc output.txt sys=system/password
Trace文件中的“Call Stack Trace”部分可帮助定位错误发生的具体代码位置。
adrci是Oracle提供的ADR命令行工具,可高效查看、导出和管理日志:
# 查看Alert日志最新内容(实时更新)
adrci> show alert -tail 50 # 显示最后50行
# 导出特定时间段的Incident(故障)信息
adrci> export incident -p "incident_time > '2025-10-28 00:00:00'" -dir /tmp/export
# 清理旧的日志文件(保留最近7天)
adrci> purge -age 7d
show incident可列出未解决的故障,export incident便于将故障信息发送给Oracle支持。
若数据库无法启动,首先检查Alert日志中的启动阶段错误(如“ORA-01034: ORACLE not available”表示实例未启动,“ORA-00600: internal error”表示内部错误):
# 查找启动错误(通常在日志开头)
grep -i "ORA-" alert_orcl1.log | grep -A 10 "Starting ORACLE instance"
常见原因包括:参数文件(SPFILE/PFILE)路径错误、内存不足(ORA-00304)、控制文件损坏(ORA-00214)。
ORA-00600是Oracle内部错误,需重点查看Trace文件中的错误参数(如“ORA-00600: internal error code, arguments: [12345], [6], [7], [], [], [], [], []”):
# 在Trace文件中搜索ORA-00600
grep -A 20 "ORA-00600" orcl1_ora_12345.trc
参数含义可通过Oracle官方文档或My Oracle Support(MOS)的ORA-00600查找工具解读(如参数12345对应“kdsgrsblk: invalid block header”),进而采取修复措施(如重启数据库、应用补丁)。
表空间满会导致写入失败(ORA-01653/ORA-01654),需检查表空间使用情况并扩展:
# 查看表空间剩余空间(按使用率排序)
SELECT tablespace_name, ROUND((used_space/free_space)*100, 2) AS usage_rate
FROM dba_tablespace_usage_metrics
ORDER BY usage_rate DESC;
# 扩展表空间(添加数据文件或调整自动扩展)
ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/orcl/users02.dbf' SIZE 1G AUTOEXTEND ON MAXSIZE 10G;
若无法扩展,需清理无用数据(如归档旧表、删除临时数据)。
性能问题可通过AWR报告定位(需开启AWR收集):
-- 生成AWR报告(需SYSDBA权限)
@?/rdbms/admin/awrrpt.sql
报告中“Top 5 Timed Events”部分显示最耗时的事件(如“db file sequential read”表示索引扫描慢,“enq: TX - row lock contention”表示锁争用),结合Trace文件可进一步分析SQL执行计划(使用EXPLAIN PLAN)。
adrci purge命令或Linux的logrotate工具清理旧日志,避免占用过多磁盘空间;