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_BASEGRID_BASE、数据库名等。

chmod +x oracle_rac_log_cleanup.sh

2. 添加执行权限

crontab -e

3. 加入 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"
最后修改:2025 年 04 月 03 日
如果觉得我的文章对你有用,请随意赞赏