能删,但不能盲目删;需先用lsof确认文件未被进程占用,优先通过adrci purge -age 43200 -type TRACE安全清理,禁用rm直接删除,特别注意utl_file_dir或外部表可能复用trace路径导致业务异常。
ORA-00600 或空间告警后,trc 文件真能直接删?
能删,但不能盲目删。oracle 的 .trc 文件是会话级跟踪输出,默认不自动清理,长期积累可能占满 $oracle_base/diag/rdbms/ 下的 trace 目录,进而触发 ora-00600 内部错误或导致归档无法写入。关键不是“删不删”,而是“删哪些、谁在用、删完会不会断跟踪”。
常见错误现象:ls -lt *.trc | head -20 看到一堆 2022 年甚至更早的文件;df -h 显示 $ORACLE_BASE 所在文件系统使用率 >95%;adrci 中执行 show homes 后发现某个 diag home 的 trace 子目录大小异常(>10GB)。
- 必须确认文件未被当前 Oracle 进程打开:
lsof +D $ORACLE_BASE/diag/rdbms/*/trace 2>/dev/null | grep '\.trc$'—— 若有输出,说明仍有活跃会话在写该文件,此时删除会导致跟踪中断或日志错乱 - 优先通过
adrci清理,而非直接rm:它会检查 ADR 内部状态,避免破坏诊断目录结构 - 不要碰
aler*.log和cdump下的core文件,它们不属于trc范畴,误删会影响问题定位
用 adrci 安全批量清理过期 trc 文件
adrci 是 Oracle 官方推荐的 ADR(Automatic Diagnostic Repository)管理工具,比手动 rm 更安全,它会跳过正在被写的文件,并更新内部索引。
典型使用场景:数据库运行稳定,无紧急问题排查需求,需释放 trace 目录空间;或定期运维脚本中集成清理逻辑。
- 进入
adrci:adrci,然后执行show homes,找到目标diag rdbmshome(如diag/rdbms/orcl/ORCL) - 设置当前 home:
set homepath diag/rdbms/orcl/ORCL - 查看 trace 文件总量和时间分布:
show tracefile -last 7d(最近 7 天),或show tracefile -limit 100查看最新 100 个 - 清理 30 天前的 trace:
purge -age 43200 -type TRACE(单位是分钟,43200 = 30 天)。注意:-type TRACE不能省略,否则默认只清 alert 日志
find + rm 作为 adrci 的补充手段(慎用)
当 adrci 不可用(比如实例未启动、ADR 目录权限异常),或需要按更细粒度条件清理(例如只删某类 SQL 的 trace),才考虑 find。但它绕过 Oracle 状态检查,风险更高。
性能与兼容性影响:在大文件系统上 find /path -name "*.trc" -mtime +30 -delete 可能阻塞 I/O;某些老版本 Linux 的 find -delete 不支持,需改用 -exec rm {} \;。
- 务必加
-maxdepth 1,防止递归进cdump或incident目录误删其他类型文件 - 先用
-print预览:find $ORACLE_BASE/diag/rdbms/orcl/ORCL/trace -maxdepth 1 -name "*.trc" -mtime +30 -print | head -10 - 排除正在被打开的文件(需配合
lsof):find ... -mtime +30 -print0 | xargs -0 -I{} sh -c 'lsof {} >/dev/null || rm {}'
为什么 utl_file_dir 或 external_table 场景下要特别小心?
如果数据库启用了 utl_file_dir(已弃用但仍有遗留系统在用),或配置了外部表指向 trace 目录下的文件,直接删 trc 可能导致 PL/SQL 匿名块报 ORA-29283: invalid file operation,或外部表查询返回空结果——因为 Oracle 认为那些路径是“合法数据源”。
这不是跟踪文件本身的问题,而是路径复用引发的耦合。容易被忽略的点在于:DBA 清理时只关注 trace 目录用途,却忘了开发可能把这里当成临时数据交换区。
- 检查是否被用作外部表目录:
SELECT * FROM dba_directories WHERE directory_path LIKE '%$ORACLE_BASE/diag%trace%'; - 搜索代码中是否硬编码了
trace路径:grep -r "trace" $ORACLE_HOME/rdbms/admin/ 2>/dev/null | head -5(仅作示意,实际需查应用代码库) - 若确认存在路径复用,清理前应通知相关方,并改用独立目录存放业务临时文件










