Oracle 警报日志 alert.log 与跟踪文件

Oracle 警报日志 alert.log 与跟踪文件

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


1. 概述

警报日志(alert.log)跟踪文件(.trc) 是 Oracle 最重要的诊断文件[1]:

文件作用
alert.log实例级关键事件日志
后台进程跟踪后台进程错误诊断
服务器进程跟踪SQL/会话级诊断
事件跟踪10046/10053 等事件

2. 警报日志

2.1 文件位置

-- 查询警报日志位置
SELECT value 
FROM v$diag_info 
WHERE name IN ('Diag Trace', 'Default Trace File');

-- 警报日志路径:
-- $diagnostic_dest/diag/rdbms/<db_unique_name>/<sid>/trace/alert_<sid>.log

示例路径

/u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log

2.2 XML 格式警报

11g+ 同时生成 XML 格式:

$ORACLE_BASE/diag/rdbms/orcl/orcl/alert/log.xml

2.3 警报日志记录内容

事件类型示例
启动/关闭Starting ORACLE instance
检查点Beginning global checkpoint
日志切换Thread 1 advanced to log sequence 245
错误ORA-00600: internal error code
参数修改ALTER SYSTEM SET sga_target=8G
表空间变更Created tablespace users
DDLCREATE TABLE
RMANRMAN backup completed

2.4 监控警报日志

# 实时监控
tail -f $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log

# 查找错误
grep "ORA-" alert_orcl.log | tail -50

# 查找 ORA-00600 / ORA-07445
grep -E "ORA-00600|ORA-07445" alert_orcl.log

# 按日期查找
grep "Jul 21" alert_orcl.log | grep "ORA-"

2.5 ADRCI 命令

# 进入 ADRCI
adrci

# 查看警报日志
adrci> show alert

# 查看最近 100 行
adrci> show alert -tail 100

# 实时监控
adrci> show alert -tail -f

# 查看 incident
adrci> show incident

# 查看 problem
adrci> show problem

# 清理过期文件
adrci> set control (SHORTP_POLICY=168)
adrci> purge

3. 跟踪文件

3.1 类型

类型触发命名
后台进程跟踪后台进程错误<sid>_<process>_<pid>.trc
服务器进程跟踪SQL_TRACE<sid>_ora_<pid>.trc
事件跟踪10046/10053<sid>_ora_<pid>.trc
Incident 跟踪严重错误incdir_<n>/...

3.2 位置

$diagnostic_dest/diag/rdbms/<db_unique_name>/<sid>/trace/

3.3 启用 SQL 跟踪

-- 会话级
ALTER SESSION SET SQL_TRACE=TRUE;
-- 或
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE;

-- 其他会话
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(
  session_id => 123,
  serial_num => 456,
  waits => TRUE,
  binds => TRUE
);

-- 查找当前会话 trace 文件
SELECT value FROM v$diag_info WHERE name='Default Trace File';

3.4 10046 事件

-- Level 1: 标准 SQL Trace
ALTER SESSION SET EVENTS '10046 trace name context forever, level 1';

-- Level 4: + 绑定变量
ALTER SESSION SET EVENTS '10046 trace name context forever, level 4';

-- Level 8: + 等待事件
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

-- Level 12: + 绑定 + 等待(最详细)
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';

-- 关闭
ALTER SESSION SET EVENTS '10046 trace name context off';

3.5 tkprof 格式化

# 转换 trace 为可读格式
tkprof input.trc output.txt 
  explain=username/password
  sys=no
  sort=execnt

# 常用参数:
# explain: 执行计划
# sys=no: 排除 SYS 用户 SQL
# sort=fchela: 按耗时排序

4. ADR(Automatic Diagnostic Repository)

4.1 目录结构

$ORACLE_BASE/diag/rdbms/<db_unique_name>/<sid>/
├── alert/                ← XML 格式警报
├── trace/                ← 文本警报 + .trc
├── incident/             ← Incident 文件
├── cdump/                ← Core dump
├── hm/                   ← Health Monitor
├── lck/                  ← 锁文件
├── metadata/             ← 元数据
└── stage/                ← 暂存

4.2 查看 ADR 信息

SELECT * FROM v$diag_info;

4.3 清理策略

# ADRCI 设置保留策略
adrci> set control (SHORTP_POLICY=168)   # 7 天
adrci> set control (LONGP_POLICY=720)    # 30 天

# 清理过期
adrci> purge

# 查看大小
du -sh $ORACLE_BASE/diag/

5. 警报日志关键内容

5.1 启动流程

Sun Jul 21 10:23:15 2026
Starting ORACLE instance (normal)
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
Initial number of CPU is 8
...
System parameters with non-default values:
  processes                = 300
  sga_target               = 4G
  control_files            = "/u01/oradata/orcl/control01.ctl"
  ...
PMON started with pid=2, OS id=1234
SMON started with pid=3, OS id=1235
DBW0 started with pid=4, OS id=1236
LGWR started with pid=5, OS id=1237
CKPT started with pid=6, OS id=1238

5.2 检查点

Sun Jul 21 10:23:25 2026
Beginning global checkpoint up to RBA [0x245.0x400.0x10], SCN: 1234567890
Completed checkpoint up to RBA [0x245.0x400.0x10], SCN: 1234567890

5.3 日志切换

Sun Jul 21 11:00:00 2026
Thread 1 advanced to log sequence 246 (LGWR switch)
  Current log# 2 seq# 246 mem# 0: /u01/oradata/orcl/redo02.log
  Current log# 2 seq# 246 mem# 1: /u02/oradata/orcl/redo02.log

5.4 错误

Sun Jul 21 14:30:15 2026
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_12345.trc:
ORA-00600: internal error code, arguments: [kcbls_1], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /u01/app/oracle/diag/rdbms/orcl/orcl/incident/incdir_1234/orcl_ora_12345_i1234.trc

6. 常见视图

-- 诊断信息
SELECT * FROM v$diag_info;

-- 严重错误
SELECT * FROM v$diag_incident 
WHERE status <> 'CLOSED';

-- 问题列表
SELECT * FROM v$diag_problem;

-- 警报日志中的错误(XML 格式)
SELECT 
  message_text, 
  originating_timestamp,
  message_level
FROM v$diag_alert_ext
WHERE message_text LIKE 'ORA-%'
ORDER BY originating_timestamp DESC
FETCH FIRST 20 ROWS ONLY;

7. 常见坑与排错

7.1 警报日志过大

现象:alert.log 文件几百 MB。

修复

# 定期归档
cd $ORACLE_BASE/diag/rdbms/orcl/orcl/trace
mv alert_orcl.log alert_orcl.log.$(date +%Y%m%d)

# Oracle 自动新建
# 或使用 logrotate

7.2 找不到 trace 文件

现象:开了 SQL_TRACE 但找不到文件。

排查

-- 查询当前会话的 trace 文件
SELECT tracefile 
FROM v$session 
WHERE sid = USERENV('SID');

-- 或
SELECT value FROM v$diag_info WHERE name='Default Trace File';

7.3 ADR 空间暴涨

现象$ORACLE_BASE/diag 目录占用几十 GB。

修复

# 设置清理策略
adrci> set control (SHORTP_POLICY=168)
adrci> set control (LONGP_POLICY=720)
adrci> purge

# 或手工删除
find $ORACLE_BASE/diag -name "*.trc" -mtime +30 -delete
find $ORACLE_BASE/diag -name "*.trm" -mtime +30 -delete

7.4 ORA-00600 跟踪文件

现象:alert log 报 ORA-00600。

排查

# 查找 trace 文件
grep "ORA-00600" alert_orcl.log | head

# 查看 trace 文件详情
cat /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_*.trc | head -100

# 查找 Oracle Support 上的解决方案
# 携带 trace 中的 arguments 信息

8. 最佳实践

  1. 每天监控 alert log:检查 ORA- 错误
  2. 定期归档:避免文件过大
  3. 使用 ADRCI:统一管理诊断文件
  4. 设置清理策略:SHORTP=168h, LONGP=720h
  5. 关键错误存档:ORA-00600/ORA-07445 trace 文件保存
  6. 数据库监控告警:扫描 alert log 自动告警
  7. 保留 AWR 报告:配合诊断

9. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Diagnostic and Tuning Features” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/diagnostic-and-tuning-features.html

[2] Oracle Database Troubleshooting 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/troub/