一、适用场景
本操作手册适用于 Oracle ODA RAC 环境中,发现 /u01 文件系统使用率偏高,需要排查是否由 Grid Infrastructure 监听日志长期累积导致的场景。
本 SOP 主要处理以下类型日志:
/u01/app/grid/diag/tnslsnr/<hostname>/listener
/u01/app/grid/diag/tnslsnr/<hostname>/listener_scan1
/u01/app/grid/diag/tnslsnr/<hostname>/asmnet1lsnr_asm
其中重点关注:
alert/log_数字.xml
trace/listener_数字.log
trace/listener_scan1_数字.log
二、用户和日志归属说明
在 Oracle RAC / ODA 环境中,oracle 用户和 grid 用户管理的日志不同。
oracle 用户主要管理数据库实例相关日志,例如数据库 alert 日志、trace 文件、CDB/PDB 诊断日志等,常见路径为:
/u01/app/oracle/diag/rdbms/...
grid 用户主要管理 Grid Infrastructure 相关组件,包括 ASM、Clusterware、LISTENER、SCAN Listener 等。监听日志通常位于:
/u01/app/grid/diag/tnslsnr/<hostname>/
因此,如果排查的是 RAC / ODA 监听日志,应在 grid 用户下执行清理操作。
三、处理流程总览
遇到 /u01 使用率高时,按以下顺序处理:
1. root 用户查看 /u01 使用率
2. 判断 /u01 空间主要占用来源
3. 确认是否为 grid 用户监听日志占用
4. 切换 grid 用户
5. 清理 listener / listener_scan1 的历史 alert 日志
6. 清理 listener / listener_scan1 的历史 trace 分段日志
7. 验证 /u01 空间、监听状态、集群资源状态
四、第一步:查看 /u01 空间
使用 root 用户执行:
df -h /u01
如果 /u01 使用率偏高,继续查看一级目录占用:
du -sh /u01/*
du -sh /u01/app/*
如果发现 /u01/app/grid 或 /u01/app/grid/diag 占用较大,继续按本 SOP 排查监听日志。
如果空间主要来自其他目录,例如 odaorahome、odaorabase、备份目录或其他业务目录,则需要按对应专项处理,不应直接套用本 SOP 清理。
五、第二步:确认监听进程归属
查看监听进程:
ps -ef | grep tnslsnr | grep -v grep
如果看到类似以下进程,并且属主为 grid:
tnslsnr LISTENER
tnslsnr LISTENER_SCAN1
tnslsnr ASMNET1LSNR_ASM
说明监听由 grid 用户管理,后续清理应切换到 grid 用户执行。
切换用户:
su - grid
确认当前环境:
hostname -s
echo $ORACLE_BASE
正常情况下:
ORACLE_BASE=/u01/app/grid
监听日志路径规则为:
$ORACLE_BASE/diag/tnslsnr/<hostname>/
例如节点 teimes1:
/u01/app/grid/diag/tnslsnr/teimes1
节点 teimes2:
/u01/app/grid/diag/tnslsnr/teimes2
六、第三步:定位监听日志占用
在 grid 用户下执行:
HOST=$(hostname -s)
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST 2>/dev/null
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/* 2>/dev/null
重点查看:
listener
listener_scan1
asmnet1lsnr_asm
继续查看明细:
for d in listener listener_scan1 asmnet1lsnr_asm
do
echo "===== $d ====="
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/$d 2>/dev/null
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/$d/alert 2>/dev/null
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/$d/trace 2>/dev/null
done
一般重点清理:
listener/alert
listener/trace
listener_scan1/alert
listener_scan1/trace
asmnet1lsnr_asm 如果占用较小,可以暂不处理。
七、第四步:清理 alert 历史日志
alert 目录主要是 ADR XML 日志,例如:
log.xml
log_数字.xml
其中:
log.xml 是当前日志
log_数字.xml 是历史分段日志
alert 日志优先使用 ADRCI 清理。
进入 ADRCI:
adrci
查看 ADR home:
show homes
清理当前节点 listener 的 7 天前 alert 日志:
set homepath diag/tnslsnr/<hostname>/listener
purge -age 10080 -type ALERT
清理当前节点 listener_scan1 的 7 天前 alert 日志:
set homepath diag/tnslsnr/<hostname>/listener_scan1
purge -age 10080 -type ALERT
退出:
exit
说明:
purge -age 的单位是分钟
10080 = 7 天 × 24 小时 × 60 分钟
验证 alert 清理结果:
find $ORACLE_BASE/diag/tnslsnr/$HOST/listener/alert -maxdepth 1 -type f -name "log_[0-9]*.xml" -mtime +7 -exec ls -lh {} \;
find $ORACLE_BASE/diag/tnslsnr/$HOST/listener_scan1/alert -maxdepth 1 -type f -name "log_[0-9]*.xml" -mtime +7 -exec ls -lh {} \;
如果没有输出,说明 7 天前 alert 历史分段已清理完成。
八、第五步:清理 trace 历史分段日志
trace 目录主要是监听访问日志,例如:
listener.log
listener_数字.log
listener_scan1.log
listener_scan1_数字.log
其中:
listener.log、listener_scan1.log 是当前日志
listener_数字.log、listener_scan1_数字.log 是历史分段日志
本环境中,ADRCI 对 alert 日志清理有效,但对 trace 下的监听历史分段日志未完全清理,因此 trace 历史分段采用受控 find 清理。
1. 清理 listener trace
进入 listener 目录:
cd $ORACLE_BASE/diag/tnslsnr/$HOST/listener
统计 7 天前历史分段数量:
find trace -maxdepth 1 -type f -name "listener_[0-9]*.log" -mtime +7 | wc -l
查看可释放空间:
find trace -maxdepth 1 -type f -name "listener_[0-9]*.log" -mtime +7 -exec du -ch {} + | tail -1
保存清理前清单:
find trace -maxdepth 1 -type f -name "listener_[0-9]*.log" -mtime +7 -exec ls -lh {} \; > /tmp/${HOST}_listener_trace_before7_$(date +%Y%m%d_%H%M%S).list
执行清理:
find trace -maxdepth 1 -type f -name "listener_[0-9]*.log" -mtime +7 -exec rm -f {} \;
验证:
du -sh trace
find trace -maxdepth 1 -type f -name "listener_[0-9]*.log" -mtime +7 -exec ls -lh {} \;
ls -lh trace/listener.log
如果 find 无输出,且 listener.log 仍存在,说明清理正常。
2. 清理 listener_scan1 trace
进入 listener_scan1 目录:
cd $ORACLE_BASE/diag/tnslsnr/$HOST/listener_scan1
统计 7 天前历史分段数量:
find trace -maxdepth 1 -type f -name "listener_scan1_[0-9]*.log" -mtime +7 | wc -l
查看可释放空间:
find trace -maxdepth 1 -type f -name "listener_scan1_[0-9]*.log" -mtime +7 -exec du -ch {} + | tail -1
保存清理前清单:
find trace -maxdepth 1 -type f -name "listener_scan1_[0-9]*.log" -mtime +7 -exec ls -lh {} \; > /tmp/${HOST}_listener_scan1_trace_before7_$(date +%Y%m%d_%H%M%S).list
执行清理:
find trace -maxdepth 1 -type f -name "listener_scan1_[0-9]*.log" -mtime +7 -exec rm -f {} \;
验证:
du -sh trace
find trace -maxdepth 1 -type f -name "listener_scan1_[0-9]*.log" -mtime +7 -exec ls -lh {} \;
ls -lh trace/listener_scan1.log 2>/dev/null
该命令只匹配 listener_scan1_数字.log,不会匹配当前日志 listener_scan1.log。
九、第六步:清理后空间验证
清理完成后执行:
df -h /u01
查看监听日志目录大小:
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/listener
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/listener/alert
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/listener/trace
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/listener_scan1
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/listener_scan1/alert
du -sh $ORACLE_BASE/diag/tnslsnr/$HOST/listener_scan1/trace
确认当前日志存在:
ls -lh $ORACLE_BASE/diag/tnslsnr/$HOST/listener/trace/listener.log
ls -lh $ORACLE_BASE/diag/tnslsnr/$HOST/listener_scan1/trace/listener_scan1.log 2>/dev/null
十、第七步:监听和集群状态验证
检查监听状态:
srvctl status listener
srvctl status scan_listener
检查监听进程:
ps -ef | grep tnslsnr | grep -v grep
检查 RAC 节点状态:
olsnodes -n -s
检查集群资源:
crsctl status res -t
重点确认:
两节点为 Active
LISTENER 为 ONLINE
SCAN Listener 为 ONLINE
ASM Listener 为 ONLINE
ASM、磁盘组、ACFS、VIP、SCAN VIP 为 ONLINE/STABLE
数据库资源为 ONLINE/STABLE
十一、是否影响数据库和后续切换
本 SOP 只清理历史日志分段,不修改数据库和集群配置。
清理对象是:
log_数字.xml
listener_数字.log
listener_scan1_数字.log
保留对象是:
log.xml
listener.log
listener_scan1.log
历史日志编号不连续不会影响后续日志分段。监听后续会继续写当前日志,达到分段条件后继续生成新的分段文件。
本操作不涉及:
listener.ora
CRS/GI 配置
VIP / SCAN VIP 配置
ASM 磁盘组
OCR / Voting Disk
数据库数据文件
控制文件
redo 日志
数据库参数
因此不会影响数据库稳定运行,也不会影响 RAC 节点切换、SCAN Listener 漂移或数据库资源切换。
十二、关于 ADRCI show control
在部分 listener ADR home 中执行:
show control
可能返回:
0 rows fetched
这表示当前 listener ADR home 没有可显示的 ADR control 策略记录。它不代表路径错误,也不代表没有日志。
本环境实际验证:
purge -age 10080 -type ALERT 可以清理 alert/log_数字.xml
但 trace/listener_数字.log 未完全依赖 ADRCI 清理
因此建议:
alert/log_数字.xml:使用 ADRCI purge 定期清理
trace/listener_数字.log:使用受控 find 定期清理
trace/listener_scan1_数字.log:使用受控 find 定期清理
十三、本次实际处理结果参考
teimes2 节点
/u01 使用率:68% → 25%
主要清理对象:listener、listener_scan1 历史 alert/trace 日志
清理后 LISTENER、SCAN Listener 状态正常
teimes1 节点
/u01 使用率:42% → 27%
tnslsnr 目录:18G → 2.7G
listener:3.0G → 745M
listener_scan1:14G → 1.6G
清理后 LISTENER、SCAN Listener、ASM Listener 状态正常
集群验证结果:
teimes1 Active
teimes2 Active
LISTENER ONLINE
SCAN Listener ONLINE
ASM、数据库、ACFS、VIP、SCAN VIP 均为 ONLINE/STABLE
十四、日常巡检建议
建议日常巡检关注:
df -h /u01
du -sh /u01/app/grid/diag/tnslsnr/$(hostname -s) 2>/dev/null
如果监听日志目录持续增长,可按本 SOP 清理 7 天前历史日志。
后续如需从源头控制 trace 日志增长,可单独评估 listener 日志滚动参数,例如:
LOG_FILE_SIZE_LISTENER
LOG_FILE_NUM_LISTENER
LOG_FILE_SIZE_LISTENER_SCAN1
LOG_FILE_NUM_LISTENER_SCAN1
该类参数属于监听配置调整,应单独评估,不建议在空间应急清理过程中同步修改。
十五、总结
当 Oracle ODA RAC 节点 /u01 使用率升高时,应先定位空间来源。如果确认是 grid 用户下监听 ADR 日志长期累积导致,可按照本 SOP 进行在线清理。
处理原则:
root 用户查看空间
grid 用户执行监听日志清理
alert 历史日志使用 ADRCI purge
trace 历史分段使用受控 find
当前日志不删除
清理后验证监听和集群资源状态
本次两节点实践验证,在线清理历史监听日志可以有效释放 /u01 空间,且不影响数据库运行、监听服务和 RAC 集群稳定性。