在Oracle数据库运维过程中,相信很多DBA和运维同学都会遇到一个共性问题:Oracle的诊断日志目录占用大量磁盘空间,轻则导致磁盘告警,重则影响数据库正常运行。本文针对实际运维中最常出现的4个高占用日志目录,详细讲解alert(告警日志)和trace(跟踪日志)的清理方法,包含ADRCI工具实操、手动清理、自动清理配置,以及常见问题排查,全程贴合实操场景,新手也能快速上手。
一、问题定位:4个高占用日志目录解析
在Oracle 11g及以上版本中,诊断日志默认存储在ADR(自动诊断信息库)中,ADR Base默认路径由Oracle环境变量指定,本文实操环境的ADR Base为/data/oracle,其中以下4个目录是磁盘占用的"重灾区",也是本文重点清理对象:
-
/data/oracle/diag/rdbms/orcl/orcl/trace:数据库实例(orcl)的跟踪日志目录,存储数据库后台进程、用户会话、SQL执行等产生的trace文件(以.trc为后缀),当数据库出现异常、开启SQL跟踪时,该目录文件会快速激增。 -
/data/oracle/diag/tnslsnr/x3dbyw/listener/trace:监听程序(listener)的跟踪日志目录,存储监听连接、会话建立与断开等相关的跟踪信息,高并发连接场景下会快速占用空间。 -
/data/oracle/diag/rdbms/orcl/orcl/alert:数据库实例的告警日志目录,以XML和文本格式存储数据库的关键事件,包括实例启动/关闭、参数修改、错误信息(如ORA-XXX)、死锁等,是排查数据库故障的核心日志来源,会持续累积且无法自动清理。 -
/data/oracle/diag/tnslsnr/x3dbyw/listener/alert:监听程序的告警日志目录,存储监听的启动/停止、连接异常等告警信息,虽体积增长速度慢于trace目录,但长期不清理也会占用大量空间。
提示:可通过du -sh 目录路径命令快速查看每个目录的实际占用空间,例如du -sh /data/oracle/diag/rdbms/orcl/orcl/trace,定位空间占用元凶。
二、核心清理工具:ADRCI工具详解
Oracle 11g及以上版本提供了专门的ADRCI(Automatic Diagnostic Repository Command Interpreter)工具,用于管理ADR中的诊断数据,包括日志查看、清理、打包等操作,相比手动删除更安全、高效,可避免误删正在使用的日志文件,是日志清理的首选方式。
2.1 ADRCI工具前置准备
-
切换至oracle用户(必须使用oracle用户操作,否则会提示权限不足):
[root@x3dbyw ~]# su - oracle -
启动ADRCI工具(无需额外配置,确保ORACLE_HOME和PATH环境变量正常即可):
[oracle@x3dbyw ~]$ adrci
启动成功后会显示如下信息(版本可能因Oracle版本不同略有差异)

2.2 常见ADRCI核心命令(必记)
-
show homes:查看当前ADR中的所有ADR Home,每个ADR Home对应一个数据库实例或监听程序,清理日志前必须指定具体的ADR Home(这是避免报错的关键)。 -
set homepath 路径:指定要操作的ADR Home路径,路径可通过show homes命令获取,例如set homepath diag/rdbms/orcl/orcl(指定数据库实例的ADR Home)。 -
purge -age 时间:清理指定时间之前的所有诊断文件(包括alert和trace文件),时间单位默认是小时 ,若需指定分钟,需结合-type参数(下文会讲),例如purge -age 720表示清理30天(720小时)前的日志。 -
purge -age 时间 -type 日志类型:针对性清理某类日志,日志类型支持ALERT(告警日志)、TRACE(跟踪日志)、INCIDENT(事件日志)等,例如purge -age 1440 -type ALERT表示清理24小时(1440分钟)前的告警日志(仅ALERT类型)。 -
purge -size 大小:按文件大小清理,清理后该ADR Home下的诊断文件总大小不超过指定值(单位:字节),例如purge -size 104857600表示清理至总大小不超过100MB(适合空间紧张场景)。 -
show alert:查看告警日志,可结合参数过滤,例如show alert -tail -f实时跟踪告警日志,show alert -p "message_text like '%ora-600%'"过滤特定错误日志。 -
quit:退出ADRCI工具。
三、实操:4个目录日志清理步骤(全程无坑)
核心原则:先指定ADR Home,再执行清理命令,避免因未指定ADR Home导致报错(如DIA-48448: This command does not support multiple ADR homes),以下步骤按目录逐一操作,可直接复制命令执行。
3.1 清理数据库实例相关日志(orcl实例)
对应目录:/data/oracle/diag/rdbms/orcl/orcl/trace 和 /data/oracle/diag/rdbms/orcl/orcl/alert,这两个目录属于同一个ADR Home(diag/rdbms/orcl/orcl),可统一指定Home后清理。
-
启动ADRCI工具:
[oracle@x3dbyw ~]$ adrci -
查看ADR Home,确认目标Home存在:
adrci> show homes输出结果(需包含diag/rdbms/orcl/orcl): ADR Homes: diag/rdbms/orcl/orcl diag/clients/user_oracle/host_2242828283_80 diag/clients/user_root/host_2242828283_80 diag/tnslsnr/x3dbyw/listener -
指定ADR Home为数据库实例的Home:
adrci> set homepath diag/rdbms/orcl/orcl -
清理30天前的所有诊断文件(含trace和alert,推荐日常维护):
adrci> purge -age 720提示:720小时=30天,可根据业务需求调整,例如168小时(7天)、24小时(1天)。 -
针对性清理alert日志(仅保留24小时,适合告警日志需频繁排查的场景):
adrci> purge -age 1440 -type ALERT说明:此处1440的单位是分钟(仅当指定-type ALERT时,age可支持分钟单位),表示保留最近24小时的告警日志,删除更早的日志。 -
清理完成后,退出ADRCI:
adrci> quit
3.2 清理监听相关日志(listener)
对应目录:/data/oracle/diag/tnslsnr/x3dbyw/listener/trace 和 /data/oracle/diag/tnslsnr/x3dbyw/listener/alert,这两个目录属于监听的ADR Home(diag/tnslsnr/x3dbyw/listener),单独指定Home清理。
-
启动ADRCI工具:
[oracle@x3dbyw ~]$ adrci -
查看ADR Home,确认监听的Home存在:
adrci> show homes输出结果需包含:diag/tnslsnr/x3dbyw/listener -
指定ADR Home为监听的Home:
adrci> set homepath diag/tnslsnr/x3dbyw/listener -
清理30天前的监听相关日志(含trace和alert):
adrci> purge -age 720 -
若需保留更短时间(如7天),可调整age值:
adrci> purge -age 168(168小时=7天) -
清理完成后,退出ADRCI:
adrci> quit
3.3 验证清理效果
清理完成后,可通过以下命令查看目录占用空间,确认清理生效: [oracle@x3dbyw ~]$ du -sh /data/oracle/diag/rdbms/orcl/orcl/trace [oracle@x3dbyw ~]$ du -sh /data/oracle/diag/tnslsnr/x3dbyw/listener/alert 若空间仍占用较大,可检查是否有近期生成的大量日志(如数据库异常导致的trace文件),可适当缩短age值重新清理。
四、补充:手动清理(应急场景)
当ADRCI工具无法正常使用(如工具异常、Oracle版本兼容问题),可采用手动清理方式,但需谨慎操作,避免删除正在使用的日志文件,步骤如下:
4.1 手动清理trace文件(推荐按时间过滤删除)
删除30天前的.trc和.trm(trace文件的元数据文件)文件,仅保留近期文件: [oracle@x3dbyw ~]$ find /data/oracle/diag/rdbms/orcl/orcl/trace -name "*.trc" -mtime +30 -delete [oracle@x3dbyw ~]$ find /data/oracle/diag/rdbms/orcl/orcl/trace -name "*.trm" -mtime +30 -delete [oracle@x3dbyw ~]$ find /data/oracle/diag/tnslsnr/x3dbyw/listener/trace -name "*.trc" -mtime +30 -delete
4.2 手动清理alert日志(避免直接删除,建议清空)
alert日志是故障排查的重要依据,不建议直接删除,可清空内容(保留文件本身,避免Oracle报错): [oracle@x3dbyw ~]$ > /data/oracle/diag/rdbms/orcl/orcl/alert/alert_orcl.log [oracle@x3dbyw ~]$ > /data/oracle/diag/tnslsnr/x3dbyw/listener/alert/log.xml
提示:监听日志手动清理前,建议先停止监听服务,清理完成后重启,避免日志文件被占用无法清空: [oracle@x3dbyw ~]$ lsnrctl stop(停止监听) [oracle@x3dbyw ~]$ > /data/oracle/diag/tnslsnr/x3dbyw/listener/trace/listener.log(清空监听trace日志) [oracle@x3dbyw ~]$ lsnrctl start(重启监听)。
五、进阶:自动清理(解放双手,推荐运维配置)
日常运维中,手动清理日志繁琐且易遗漏,可通过Linux的crontab定时任务,结合ADRCI命令实现自动清理,无需人工干预,步骤如下:
5.1 创建自动清理脚本
-
创建脚本文件(路径可自定义,例如/home/oracle/scripts/clean_oracle_log.sh):
[oracle@x3dbyw ~]$ vi /home/oracle/scripts/clean_oracle_log.sh -
写入以下内容(脚本功能:每天凌晨3点,清理30天前的所有日志,包含数据库和监听):
#!/bin/bash# 清理数据库实例(orcl)的日志adrci exec="set homepath diag/rdbms/orcl/orcl; purge -age 720; quit"# 清理监听(listener)的日志adrci exec="set homepath diag/tnslsnr/x3dbyw/listener; purge -age 720; quit"echo "Oracle日志清理完成,时间:$(date)" >> /home/oracle/scripts/clean_log.log -
给脚本添加执行权限:
[oracle@x3dbyw ~]$ chmod +x /home/oracle/scripts/clean_oracle_log.sh
5.2 配置crontab定时任务
-
编辑crontab任务(使用oracle用户编辑,避免权限问题):
[oracle@x3dbyw ~]$ crontab -e -
加入以下内容(每天凌晨3点执行清理脚本):
0 3 * * * /home/oracle/scripts/clean_oracle_log.sh -
查看crontab任务是否生效:
[oracle@x3dbyw ~]$ crontab -l
提示:脚本中的日志清理时间(720小时)可根据业务需求调整,同时可通过查看/home/oracle/scripts/clean_log.log文件,确认定时任务是否正常执行。
六、常见问题排查(避坑指南)
6.1 报错:DIA-48448: This command does not support multiple ADR homes
原因:未指定ADR Home,ADRCI工具无法确定要操作的日志目录(存在多个ADR Home时)。 解决方案:执行show homes查看所有ADR Home,再用set homepath 路径指定具体的Home,再执行purge命令。
6.2 清理后日志仍快速增长
原因:数据库存在异常(如频繁报错、死锁)、开启了SQL跟踪、后台任务频繁执行(如统计信息收集),或Flink CDC同步等场景导致日志激增。 解决方案: 1. 查看alert日志,排查数据库异常:adrci> show alert -p "message_text like '%ORA-%'"; 2. 检查是否开启了不必要的SQL跟踪,关闭无用跟踪; 3. 调整Oracle参数max_dump_file_size,限制单个trace文件大小(默认unlimited,可设置为具体值,如100M); 4. 优化Flink CDC配置(若使用),过滤无关表或缩短Checkpoint间隔,减少日志生成量。
6.3 手动删除日志后,Oracle报错
原因:删除了正在被Oracle进程使用的日志文件,或误删了Oracle必需的日志文件。 解决方案: 1. 避免直接删除日志文件,优先使用ADRCI工具清理; 2. 手动清理时,先通过lsof 日志文件路径查看文件是否被占用,若被占用,先停止对应进程(如监听)再清理; 3. 若已报错,重启Oracle实例或监听服务,恢复日志文件生成。
七、总结
Oracle的alert和trace日志是故障排查的核心依据,但长期不清理会导致磁盘空间紧张,影响数据库稳定性。本文围绕4个高占用日志目录,提供了"ADRCI工具清理(首选)+ 手动清理(应急)+ 自动清理(运维推荐)"的全场景方案,实操命令可直接复制使用,同时补充了常见问题排查,适合各类Oracle运维场景。
建议日常运维中,优先配置自动清理脚本,定期检查日志增长情况,结合业务需求调整日志保留时间;清理前建议备份重要日志(尤其是alert日志),避免误删导致故障排查无据可依。
如果觉得本文对你有帮助,欢迎点赞、收藏,关注我,后续分享更多Oracle运维实操技巧!