Oracle RAC 日志清理脚本说明
该脚本适用于 Oracle 19c RAC 多实例、多数据库环境,自动清理以下类型的日志文件,防止日志文件无限增长导致磁盘空间不足。
支持功能
| 模块类型 | 支持内容 |
|---|---|
| 审计日志 | 清理各数据库实例的.aud / .xml 审计日志 |
| 监听器日志 | 包含 RDBMS 和 Grid listener 的日志和 trace 文件 |
| Trace/Diag 日志 | 所有 trace 文件.trc、转储 .trm、普通 .log |
| Alert 日志 | 清理 RDBMS / ASM / CRS / Listener 下 alert 目录 |
| 脚本运行日志 | 保留最近 30 天的执行日志,定期自动清理 |
文件结构
oracle_rac_log_cleanup.sh:主清理脚本/var/log/oracle_log_cleanup/cleanup_YYYY-MM-DD.log:每日运行日志
参数说明
在脚本顶部可配置如下变量:
ORACLE_BASE=/u01/app/oracle # Oracle 数据库主目录
GRID_BASE=/u01/app/19.0.0/grid # Grid Infrastructure 主目录
DB_NAMES=("orcl" "hrdb") # 所有数据库的 DB_UNIQUE_NAME
DAYS_TO_KEEP=7 # 日志保留天数脚本输出示例
=== Log cleanup started at Thu Apr 3 17:53:35 CST 2025 ===
--- Cleaning audit logs ---
Cleaning /u01/app/oracle/admin/hisdb/adump
Cleaning /u01/app/oracle/admin/emrdb/adump
--- Cleaning RDBMS listener logs ---
Cleaning /u01/app/oracle/diag/tnslsnr/rac2/listener/trace
--- Cleaning Grid listener logs ---
Cleaning /u01/app/grid/diag/tnslsnr/rac2/asmnet1lsnr_asm/trace
Cleaning /u01/app/grid/diag/tnslsnr/rac2/listener/trace
Cleaning /u01/app/grid/diag/tnslsnr/rac2/mgmtlsnr/trace
Cleaning /u01/app/grid/diag/tnslsnr/rac2/listener_scan1/trace
--- Cleaning Grid Infrastructure logs ---
--- Cleaning diag rdbms logs ---
--- Cleaning all alert log directories ---
Cleaning /u01/app/oracle/diag/rdbms/hisdb/hisdb2/alert
Cleaning /u01/app/oracle/diag/rdbms/emrdb/emrdb2/alert
Cleaning /u01/app/grid/diag/rdbms/_mgmtdb/-MGMTDB/alert
Cleaning /u01/app/grid/diag/asm/+asm/+ASM2/alert
Cleaning /u01/app/grid/diag/crs/rac2/crs/alert
Cleaning /u01/app/grid/diag/clients/user_root/host_349980017_110/alert
Cleaning /u01/app/grid/diag/clients/user_grid/host_349980017_110/alert
Cleaning /u01/app/grid/diag/tnslsnr/rac2/asmnet1lsnr_asm/alert
Cleaning /u01/app/grid/diag/tnslsnr/rac2/listener/alert
Cleaning /u01/app/grid/diag/tnslsnr/rac2/mgmtlsnr/alert
Cleaning /u01/app/grid/diag/tnslsnr/rac2/listener_scan1/alert
Cleaning /u01/app/grid/diag/asmtool/user_root/host_349980017_110/alert
Cleaning /u01/app/grid/diag/asmcmd/user_grid/rac2/alert
Cleaning /u01/app/grid/diag/asmcmd/user_root/rac2/alert
Cleaning /u01/app/grid/diag/kfod/rac2/kfod/alert
--- Cleaning script logs older than 30 days ---
=== Cleanup finished at Thu Apr 3 17:57:14 CST 2025 ===使用方式
1. 修改参数配置
根据你们的 Oracle 安装结构,修改脚本顶部的变量,如 ORACLE_BASE、GRID_BASE、数据库名等。
chmod +x oracle_rac_log_cleanup.sh2. 添加执行权限
crontab -e3. 加入 crontab 定时任务(建议每日凌晨 1 点运行)
crontab -e添加如下内容:
0 1 * * * /path/to/oracle_rac_log_cleanup.sh权限建议
- 单实例建议使用
oracle用户运行数据库相关日志清理 - rac群集建议使用
root用户运行 Grid Infrastructure/ASM/CRS 日志清理 - 或通过
sudo在脚本中区分执行段落(需要额外设置)
日志清理策略
| 文件类型 | 清理规则 |
|---|---|
.log | 超过$DAYS_TO_KEEP天 |
.trc/.trm | 超过$DAYS_TO_KEEP天 |
.aud/.xml | 超过$DAYS_TO_KEEP天 |
| 脚本日志 | 超过 30 天自动删除 |
脚本内容
#!/bin/bash
# ========== 参数配置 ==========
ORACLE_BASE=/u01/app/oracle
GRID_BASE=/u01/app/grid
DB_NAMES=("hisdb" "emrdb") # 多个数据库名
DAYS_TO_KEEP=7 # 日志保留天数
SCRIPT_LOG_DIR="/var/log/oracle_log_cleanup"
SCRIPT_LOG_FILE="$SCRIPT_LOG_DIR/cleanup_$(date +%F).log"
# ========== 初始化日志目录 ==========
mkdir -p "$SCRIPT_LOG_DIR"
echo "=== Log cleanup started at $(date) ===" >> "$SCRIPT_LOG_FILE"
# ========== 1. 清理审计日志 ==========
echo "--- Cleaning audit logs ---" >> "$SCRIPT_LOG_FILE"
for DB in "${DB_NAMES[@]}"; do
ADUMP_DIRS=$(find "$ORACLE_BASE/admin/"$DB* -type d -name adump 2>/dev/null)
for ADIR in $ADUMP_DIRS; do
echo "Cleaning $ADIR" >> "$SCRIPT_LOG_FILE"
find "$ADIR" \( -name "*.aud" -o -name "*.xml" \) -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
done
done
# ========== 2. 清理监听日志(RDBMS) ==========
echo "--- Cleaning RDBMS listener logs ---" >> "$SCRIPT_LOG_FILE"
LISTENER_LOG_BASE="$ORACLE_BASE/diag/tnslsnr/$(hostname)"
if [ -d "$LISTENER_LOG_BASE" ]; then
for TRACE_DIR in $(find "$LISTENER_LOG_BASE" -type d -name trace); do
echo "Cleaning $TRACE_DIR" >> "$SCRIPT_LOG_FILE"
find "$TRACE_DIR" \( -name "*.log" -o -name "*.trc" -o -name "*.trm" \) -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
done
fi
# ========== 3. 清理 Grid listener 日志 ==========
echo "--- Cleaning Grid listener logs ---" >> "$SCRIPT_LOG_FILE"
GRID_LISTENER_LOG_BASE="$GRID_BASE/diag/tnslsnr/$(hostname)"
if [ -d "$GRID_LISTENER_LOG_BASE" ]; then
for TRACE_DIR in $(find "$GRID_LISTENER_LOG_BASE" -type d -name trace); do
echo "Cleaning $TRACE_DIR" >> "$SCRIPT_LOG_FILE"
find "$TRACE_DIR" \( -name "*.log" -o -name "*.trc" -o -name "*.trm" \) -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
done
fi
# ========== 4. 清理 Grid/CRS/ASM trace/log ==========
echo "--- Cleaning Grid Infrastructure logs ---" >> "$SCRIPT_LOG_FILE"
GRID_TRACE_DIR="$GRID_BASE/diag"
if [ -d "$GRID_TRACE_DIR" ]; then
find "$GRID_TRACE_DIR" \( -name "*.log" -o -name "*.trc" -o -name "*.trm" \) -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \; >> "$SCRIPT_LOG_FILE"
fi
# ========== 5. 清理 RDBMS 诊断日志(diag/rdbms) ==========
echo "--- Cleaning diag rdbms logs ---" >> "$SCRIPT_LOG_FILE"
RDBMS_DIAG_DIR="$ORACLE_BASE/diag/rdbms"
if [ -d "$RDBMS_DIAG_DIR" ]; then
find "$RDBMS_DIAG_DIR" \( -name "*.log" -o -name "*.trc" -o -name "*.trm" \) -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \; >> "$SCRIPT_LOG_FILE"
fi
# ========== 6. 清理所有 alert 目录 ==========
echo "--- Cleaning all alert log directories ---" >> "$SCRIPT_LOG_FILE"
# RDBMS alert
RDBMS_ALERT_DIRS=$(find "$ORACLE_BASE/diag/rdbms" -type d -name alert 2>/dev/null)
for ALERT_DIR in $RDBMS_ALERT_DIRS; do
echo "Cleaning $ALERT_DIR" >> "$SCRIPT_LOG_FILE"
find "$ALERT_DIR" \( -name "*.xml" -o -name "*.log" -o -name "*.trc" -o -name "*.trm" \) -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
done
# Grid/ASM/CRS alert
GRID_ALERT_DIRS=$(find "$GRID_BASE/diag" -type d -name alert 2>/dev/null)
for ALERT_DIR in $GRID_ALERT_DIRS; do
echo "Cleaning $ALERT_DIR" >> "$SCRIPT_LOG_FILE"
find "$ALERT_DIR" \( -name "*.xml" -o -name "*.log" -o -name "*.trc" -o -name "*.trm" \) -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
done
# ========== 7. 清理脚本自身日志目录(保留30天) ==========
echo "--- Cleaning script logs older than 30 days ---" >> "$SCRIPT_LOG_FILE"
find "$SCRIPT_LOG_DIR" -name "cleanup_*.log" -type f -mtime +30 -exec rm -f {} \;
# ========== 完成 ==========
echo "=== Cleanup finished at $(date) ===" >> "$SCRIPT_LOG_FILE"
echo "" >> "$SCRIPT_LOG_FILE"