_alert_sid.log 的实际路径由 diagnostic_dest 决定,位于 Diag Trace 目录下(非 Diag Alert),即 $DIAG_DEST/diag/rdbms/db_unique_name/instance_name/trace/;实例未启动时需查参数文件中的 diagnostic_dest 值并拼接路径。
如何定位和确认当前 _alert_<code>sid.log 的实际路径
oracle 并不直接暴露告警日志路径为一个独立参数,它由 diagnostic_dest + 子目录规则共同决定。很多人改了 background_dump_dest 就以为日志在那里,其实 11g 及以后版本这个参数已被废弃,真正生效的是诊断框架路径。
-
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';—— 这才是你要盯住的路径,_alert_<code>sid.log 就落在这个目录下(注意不是Diag Alert) - 如果实例没启起来,进不到数据库,就查初始化参数文件:
show parameter diagnostic_dest,再拼上/diag/rdbms/<code>db_unique_name/instance_name/trace/ - Linux 下可快速验证:
ls -l $ORACLE_BASE/diag/rdbms/*/sid*/trace/_alert_*.log,避免被多个实例或旧目录干扰
为什么 tail -f 看不到新日志,或日志内容“跳着写”
这不是磁盘满或权限问题,而是 Oracle 内部写入机制导致的:告警日志默认以“块缓冲”方式写入,且每次写入前会检查时间戳、进程号等字段,不是严格按行追加。尤其在高并发报错时,多进程可能同时写入同一文件,造成行序错乱或延迟可见。
- 不要用
tail -f做实时监控——改用tail -F(注意大写 F),它能处理日志轮转后文件 inode 变更的情况 - 真正想捕获所有错误,别依赖人工翻日志;用
DBMS_SCHEDULER或外部脚本定期grep "ORA-" <code>_alert_<code>sid.log,配合stat -c %Y检查 mtime 判断是否更新 - 如果发现日志里有大量重复的
Archived Log entry,说明归档压力大,但这类信息不触发 ORA- 错误,不会出现在 DBA_OUTSTANDING_ALERTS 中,容易被忽略
能否把 _alert_<code>sid.log 换到别的磁盘或压缩保存
不能直接改名或软链,Oracle 启动时硬编码写死文件名和打开方式;但可以控制其生成行为和生命周期。
- 禁止手动移动或重命名
_alert_<code>sid.log:实例运行中 mv 会导致写入失败,后续错误全丢进trace目录下的进程 trace 文件,反而更难排查 - 真正的可控点是
alter system set diagnostic_dest='/new/path' scope=spfile;,重启后整个diag目录迁移,包括 alert、trace、incident 等全部子树 - 压缩归档靠外部手段:比如每天凌晨
find $DIAG_TRACE -name "_alert_*.log" -mtime +7 -exec gzip {} \;,但注意保留至少一个未压缩的当前日志供 Oracle 使用
ORA-00600 / ORA-07445 出现在 _alert_<code>sid.log 里该怎么初步判断
这两类错误本身不说明具体原因,关键看紧随其后的“argument”字段和关联的 trace 文件路径。直接搜错误号意义不大,重点是定位上下文。
- ORA-00600 后面括号里的四个参数(如
[kcratr_scan_lastbwr])是内部函数名,去 MOS 搜完整字符串比只搜 ORA-00600 更有效 - ORA-07445 后面的
sigsegv或sigbus是信号类型,后面跟的地址和函数(如ksfd_skgfpwr)指向 IO 层,大概率是存储或 ASM 驱动问题 - 必须立刻检查同一时间点的
trace文件:alert 日志里会写See Note XXXX.X in Oracle Support,但更实用的是找*** DUMP FILE ***行,后面跟着的.trc路径才是分析起点
Oracle 告警日志不是“看一眼有没有 ORA-”就完事的东西;它的结构松散、写入异步、关联分散,真正棘手的问题往往藏在时间窗口对齐、trace 文件匹配、以及 diagnostic_dest 下多层子目录的权限一致性里。










