Oracle ASM归档日志自动清理:RMAN+crontab一键闭环(生产可用)

1. 背景:为什么要做归档自动清理

  • 归档日志(ARCHIVELOG)长期积累会把 ASM/FRA 顶满

  • 空间满了会引发:归档写不进去 → 业务卡顿/停摆 → 典型生产事故链

  • 最好的方式不是手工删,而是策略化 + 自动化 + 可审计日志

2. 目标与策略(本文采用)

  • 保留归档:14 天(RETENTION_DAYS=14)

  • 对账窗口:20 天(CROSSCHECK_DAYS=20,轻量但够用)

  • 每天低峰自动执行:05:00

  • 日志保留 30 天自动清理

提醒:如果有 ADG/备库/闪回还原点,清理口径要更谨慎(本文按"单库/不依赖备库追归档"场景写)。

3. 前置检查(只读,安全)

3.1 确认实例与环境

bash 复制代码
su - oracle
. ~/.bash_profile 2>/dev/null || true
echo $ORACLE_SID
echo $ORACLE_HOME
which rman

3.2(可选)确认归档模式

sql 复制代码
-- sqlplus / as sysdba
archive log list;

4. 落地步骤(从创建文件夹开始)

4.1 创建目录

sql 复制代码
su - oracle
mkdir -p /home/oracle/rman/log

4.2 创建"模板化"脚本(建议用这一版,改变量就行)

保存为:/home/oracle/rman/arch_cleanup.sh

  • ORACLE_SID:告诉 Oracle 客户端"你要连哪个实例"(RAC 时尤其重要)

  • ORACLE_HOME:告诉系统 Oracle 软件装在哪(rman/sqlplus 等命令在哪)

  • PATH :把 $ORACLE_HOME/bin 加到命令搜索路径里,保证脚本里直接执行 rman 能找到正确版本

bash 复制代码
cat > /home/oracle/rman/arch_cleanup.sh <<'EOF'
#!/bin/bash
set -euo pipefail

# ===== 可配置区:以后换库就改这里 =====
export ORACLE_SID="yjxt2"
export ORACLE_HOME="/u01/app/oracle/product/19.3.0/db"
export PATH="$ORACLE_HOME/bin:$PATH"

RETENTION_DAYS=14       # 保留天数:14
CROSSCHECK_DAYS=20      # 对账窗口:建议 >= RETENTION_DAYS
LOG_KEEP_DAYS=30        # 日志保留天数

BASE="/home/oracle/rman"
LOGDIR="$BASE/log"
mkdir -p "$LOGDIR"
LOG="$LOGDIR/arch_cleanup_$(date +%F_%H%M%S).log"

echo "=== $(date '+%F %T') START archivelog cleanup ===" | tee -a "$LOG"
echo "ORACLE_SID=$ORACLE_SID ORACLE_HOME=$ORACLE_HOME" | tee -a "$LOG"

RMAN_BLOCK=$(cat <<RMAN
RUN{
  CROSSCHECK ARCHIVELOG FROM TIME "SYSDATE-${CROSSCHECK_DAYS}";
  DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
  DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE "SYSDATE-${RETENTION_DAYS}";
}
RMAN
)

# 生产降噪:低 CPU/IO 优先级
if command -v ionice >/dev/null 2>&1; then
  ionice -c2 -n7 nice -n 15 rman target / msglog "$LOG" append <<<"$RMAN_BLOCK"
else
  nice -n 15 rman target / msglog "$LOG" append <<<"$RMAN_BLOCK"
fi

echo "=== $(date '+%F %T') END archivelog cleanup ===" | tee -a "$LOG"

# 日志自动清理(避免撑爆 /home)
find "$LOGDIR" -type f -name "arch_cleanup_*.log" -mtime +${LOG_KEEP_DAYS} -delete
EOF

chmod 750 /home/oracle/rman/arch_cleanup.sh

4.3 手工跑一次验证

bash 复制代码
/home/oracle/rman/arch_cleanup.sh
ls -t /home/oracle/rman/log/arch_cleanup_*.log | head -1
tail -n 120 "$(ls -t /home/oracle/rman/log/arch_cleanup_*.log | head -1)"

4.4 配置 crontab(每天 05:00)

bash 复制代码
crontab -e

加入:

bash 复制代码
0 5 * * * /home/oracle/rman/arch_cleanup.sh >/dev/null 2>&1

验证:

bash 复制代码
crontab -l

5. 验收方法

5.1 看日志是否每天生成

bash 复制代码
ls -ltr /home/oracle/rman/log/ | tail

5.2 看 ASM 归档目录是否在滚动保留

bash 复制代码
su - grid
asmcmd ls +ARCH/YJXT/ARCHIVELOG | head
asmcmd ls +ARCH/YJXT/ARCHIVELOG | tail

6. 常见坑

  1. RMAN 用 control file 当仓库会"失忆"

    归档记录被覆盖后,RMAN 可能列不出历史归档,导致"删不到 ASM 旧文件"。

    解决:尽量用自动化持续清理,必要时引入 recovery catalog。

  2. CROSSCHECK ALL 会越来越慢

    归档越多越慢,所以用 FROM TIME "SYSDATE-xx" 缩窗。

  3. 别把 asmcmd rm 当日常

    手工删适合救火;日常要走 RMAN 脚本闭环(可审计、可追踪)。

相关推荐
hz5678935 分钟前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC40 分钟前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday42 分钟前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
优橙教育44 分钟前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
IT研究所1 小时前
AI-ITR平台如何减少客户问题反复升级?
大数据·运维·人工智能·低代码·自然语言处理·安全架构·企微
BLUcoding1 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
半杯咖啡半行码1 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
AIgorithmGEEK1 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2081 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)1 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障