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 |
| DDL | CREATE TABLE |
| RMAN | RMAN 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. 最佳实践
- 每天监控 alert log:检查 ORA- 错误
- 定期归档:避免文件过大
- 使用 ADRCI:统一管理诊断文件
- 设置清理策略:SHORTP=168h, LONGP=720h
- 关键错误存档:ORA-00600/ORA-07445 trace 文件保存
- 数据库监控告警:扫描 alert log 自动告警
- 保留 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/