当前位置: 首页 > news >正文

Oracle数据库:可直接复用的RMAN物理备份和归档日志清理脚本_20260225

本文创作时间:2026年 02月 25日 星期三 08:54:21 CST

稳、清晰、好复用、好排障、策略更保守。每天1 点做 RMAN备份+异地传输,5 点做归档清理,分离职责,方便排障。✅

1、rman_simple.sh(RMAN备份 + 异地传输)模板版(逻辑不变,增强注释)

#!/bin/bash # ============================================================ # Oracle RMAN 备份 + 异地传输脚本(生产可用模板) # 说明: # - 备份内容:全库 + 归档 + 控制文件 + spfile # - 本地先落地到中转目录(按时间建子目录) # - 再传输到异地服务器 # - 异地保留 N 天;本地中转保留若干天;本地日志保留若干天 # 复用到其他 Oracle 服务器时: # 只改“可配置区”变量(见下方),核心逻辑不要动 # ============================================================ set -euo pipefail # set -euo pipefail 说明: # -e 任意关键命令失败立即退出(防止误报成功) # -u 使用未定义变量时报错(防止变量写错) # -o pipefail 管道中任一命令失败即失败 # ========================= # 可配置区(迁移到新库时重点修改) # ========================= # [必改] Oracle 实例名(示例:yjxt2) # 注意:这是实例名(ORACLE_SID),不是 DB_NAME # RAC 环境下请指定你要执行备份的那个实例 SID(例如 yjxt1 / yjxt2) export ORACLE_SID="yjxt2" # [必改] Oracle 软件安装目录(ORACLE_HOME) # 常见示例: # /u01/app/oracle/product/19.3.0/db # /u01/app/oracle/product/19c/dbhome_1 export ORACLE_HOME="/u01/app/oracle/product/19.3.0/db" # [通常不改] PATH 追加 ORACLE_HOME/bin export PATH="$ORACLE_HOME/bin:$PATH" # [可不改] 日期格式(日志中显示更清晰) export NLS_DATE_FORMAT='YYYYMMDDHH24MISS' # ===== 本地中转与日志目录 ===== # [按需改] 本地中转根目录(脚本会在下面按时间建子目录) # 建议单独目录,避免混放其他文件 STAGE_BASE="/home/oracle_backup/rman_stage" # [按需改] 本地日志目录 LOGDIR="/home/oracle_backup/log" # ===== 异地服务器与目录(你确认该目录只放 RMAN 文件)===== # [必改] 异地备份服务器 IP/主机名 REMOTE_HOST="异地备份服务器 IP" # [必改] 异地备份目录(建议该目录只放本脚本传输的 RMAN 文件) # 注意:当前逻辑是“平铺传输文件到此目录”,不是按日期建远端子目录 REMOTE_DIR="/home/XXXX_oracle" # [按需改] 异地文件保留天数(单位:天) # 会在远端执行 find -mtime +N 删除旧文件 REMOTE_RETENTION_DAYS=14 # [按需改] 本地中转保留策略(当前是 +1,偏紧,约保留近2天用于观察空间) # 如果以后要改回“近3天”,把下面 find 里的 -mtime +1 改成 +2 # (保留说明写在脚本末尾实际清理命令处) # ========================= # 运行时变量(通常不改) # ========================= DATE="$(date +%Y%m%d_%H%M%S)" # 本次运行的本地中转目录,例如 /home/oracle_backup/rman_stage/20260225_010001 STAGE="${STAGE_BASE}/${DATE}" # 创建本次中转目录和日志目录 mkdir -p "$STAGE" "$LOGDIR" # 本次日志文件(按实例名+时间命名) LOG="$LOGDIR/rman_${ORACLE_SID}_${DATE}.log" # 将后续标准输出/错误统一写入日志 exec >>"$LOG" 2>&1 echo "=== $(date '+%F %T') START rman_simple.sh ===" echo "USER=$(id -un) HOST=$(hostname)" # 退出时记录返回码:rc=0 表示成功,非0表示失败 trap 'echo "=== $(date "+%F %T") EXIT rc=$? ==="' EXIT # ===== 低优先级(有 ionice 就用)===== # 目的:尽量降低对业务 IO/CPU 的影响 if command -v ionice >/dev/null 2>&1; then NICE="ionice -c2 -n7 nice -n 15" else NICE="nice -n 15" fi # ============================================================ # RMAN 备份:全库 + 归档 + 控制文件 + spfile(单通道) # 说明: # - 单通道:资源占用更稳,速度相对慢一些 # - archive log current:先切换当前日志,确保最近归档被纳入备份 # - archivelog all not backed up 1 times:只备份尚未备份过1次的归档 # ============================================================ $NICE rman target / <<EOF_RMAN run{ allocate channel c1 device type disk; # [通常不改] 触发日志切换,生成新的归档,便于纳入本次备份 sql 'alter system archive log current'; # [通常不改] 全库备份 # 输出到本次运行目录 \$STAGE 下 backup database format '${STAGE}/database_%d_%T_%U.bkp'; # [通常不改] 归档日志备份(只备份未备份过1次的归档) backup archivelog all not backed up 1 times format '${STAGE}/archivelog_%d_%T_%s_%U.arc'; # [通常不改] 当前控制文件备份 backup current controlfile format '${STAGE}/controlfile_%d_%T_%U.ctl'; # [通常不改] spfile 备份 backup spfile format '${STAGE}/spfile_%d_%T_%U.spf'; release channel c1; } exit; EOF_RMAN # ===== 传输到异地(要求 oracle -> root 免密)===== # [前置条件] 需提前配置 SSH 免密: # oracle 用户 -> root@REMOTE_HOST # [通常不改] 先确保异地目录存在 $NICE ssh -o BatchMode=yes -o ConnectTimeout=10 "root@${REMOTE_HOST}" "mkdir -p '$REMOTE_DIR'" # [通常不改] 仅传输本次运行目录下的文件(不会重复传历史子目录) $NICE scp -o BatchMode=yes -o ConnectTimeout=10 "$STAGE"/* "root@${REMOTE_HOST}:${REMOTE_DIR}/" # ===== 异地保留14天:按日期删除旧文件(目录只放 RMAN 文件)===== # [按需改] 修改 REMOTE_RETENTION_DAYS 即可,无需改命令逻辑 # 注意:这里失败不会让主流程失败(|| true),避免“清理失败影响备份成功” $NICE ssh -o BatchMode=yes -o ConnectTimeout=10 "root@${REMOTE_HOST}" \ "find '$REMOTE_DIR' -type f -mtime +$REMOTE_RETENTION_DAYS -delete" || true echo "OK: RMAN backup + transfer done at $(date)" # ===== 本地中转保留(按运行子目录清理)===== # [按需改] 当前 -mtime +1:约保留近2天(你现在用于观察空间占用) # 如果要改为“近3天”,这里改成 -mtime +2 # 如果要更久,自行上调(如 +3 约近4天) # 注意:这里是“直接删除整个子目录”(rm -rf 目录) find "$STAGE_BASE" -mindepth 1 -maxdepth 1 -type d -mtime +1 -exec rm -rf {} \; 2>/dev/null || true # ===== 本地日志保留14天 ===== # [按需改] 如果日志保留周期要调整,改 +14 find "$LOGDIR" -type f -name "rman_${ORACLE_SID}_*.log" -mtime +14 -delete

2、arch_cleanup.sh(归档日志清理)模板版(逻辑不变,增强注释)

#!/bin/bash # ============================================================ # Oracle 归档日志清理脚本(生产可用模板) # 说明: # - 先 CROSSCHECK 最近一段时间归档记录 # - 删除 EXPIRED 归档记录(仅清RMAN仓库记录,不一定释放ASM空间) # - 删除满足条件的旧归档日志文件(已备份至少1次到磁盘) # # 复用到其他 Oracle 服务器时: # 只改“可配置区”变量和 RMAN_BLOCK 中保留策略参数 # 核心逻辑不建议改 # ============================================================ set -euo pipefail # ========================= # 可配置区(迁移到新库时重点修改) # ========================= # [必改] Oracle 实例名(ORACLE_SID) # RAC 环境下请选择要执行清理的实例 SID(如 yjxt1 / yjxt2) export ORACLE_SID=yjxt2 # [必改] Oracle 软件目录(ORACLE_HOME) export ORACLE_HOME=/u01/app/oracle/product/19.3.0/db # [通常不改] export PATH=$ORACLE_HOME/bin:$PATH # [按需改] 脚本目录(用于存放日志) 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 清理策略(按需改参数,不改结构) # ============================================================ # 当前策略说明: # 1) CROSSCHECK ARCHIVELOG FROM TIME "SYSDATE-14" # - 对最近14天归档做对账(校验记录与实际文件) # 2) DELETE NOPROMPT EXPIRED ARCHIVELOG ALL # - 删除 EXPIRED 的归档记录(通常不释放实际文件空间) # 3) DELETE ... COMPLETED BEFORE "SYSDATE-7" BACKED UP 1 TIMES TO DISK # - 删除 7 天前且已备份至少1次到磁盘的归档日志 # # 迁移到新库时常改项(按实际策略调整): # - SYSDATE-14 -> CROSSCHECK 窗口(例如 20) # - SYSDATE-7 -> 归档保留天数(例如 3 / 7 / 14) # - BACKED UP 1 TIMES TO DISK -> 已备份次数要求(通常保持1) RMAN_BLOCK=$(cat <<'RMAN' RUN{ CROSSCHECK ARCHIVELOG FROM TIME "SYSDATE-14"; DELETE NOPROMPT EXPIRED ARCHIVELOG ALL; DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE "SYSDATE-7" BACKED UP 1 TIMES TO DISK; } RMAN ) # ===== 低优先级执行(尽量降低对业务影响)===== # [通常不改] 使用 msglog "$LOG" append 将 RMAN 详细输出写入同一日志文件 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" # ===== 本地日志保留30天 ===== # [按需改] 如需缩短/延长日志保留天数,调整 +30 find "$LOGDIR" -type f -name "arch_cleanup_*.log" -mtime +30 -delete

3、给你一份“复用时只改这些地方”的速查表(非常实用)

3.1.rman_simple.sh迁移到新库时必看

必改项

  • ORACLE_SID

  • ORACLE_HOME

  • REMOTE_HOST

  • REMOTE_DIR

按需改项

  • STAGE_BASE(本地中转目录)

  • LOGDIR(本地日志目录)

  • REMOTE_RETENTION_DAYS

  • 本地中转保留天数(-mtime +1 / +7

  • 本地日志保留天数(-mtime +14

通常不改项(建议保持)

  • set -euo pipefail

  • archive log current

  • backup database

  • backup archivelog all not backed up 1 times

  • backup current controlfile

  • backup spfile

  • scp "$STAGE"/* ...(当前是平铺传输)


3.2.arch_cleanup.sh迁移到新库时必看

必改项

  • ORACLE_SID

  • ORACLE_HOME

按需改项(策略)

  • SYSDATE-14(crosscheck窗口)

  • SYSDATE-7(归档保留天数)

  • BACKED UP 1 TIMES TO DISK(一般保留 1,不建议随便改)

  • 日志保留天数-mtime +30

通常不改项(建议保持)

  • DELETE NOPROMPT EXPIRED ARCHIVELOG ALL

  • ionice + nice

  • msglog "$LOG" append

4、定时任务crontab配置(建议保留这种结构)

你当前这两条很合理:

0 1 * * * /home/oracle_backup/rman_simple.sh >/dev/null 2>&1 0 5 * * * /home/oracle/rman/arch_cleanup.sh >/dev/null 2>&1

说明(以后复用时也照这个思路)

  • 先备份(1点)

  • 后清理(5点)

  • 给备份和清理留出缓冲时间,避免“边备份边删归档”

5、精简注释版脚本,复制张贴修改使用

5.1rman_simple.sh(RMAN备份 + 异地传输)

#!/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" export NLS_DATE_FORMAT='YYYYMMDDHH24MISS' # [改] 本地中转/日志目录 STAGE_BASE="/home/oracle_backup/rman_stage" LOGDIR="/home/oracle_backup/log" # [改] 异地服务器/目录/保留天数 REMOTE_HOST="异地服务器IP" REMOTE_DIR="/home/XXXX_oracle" REMOTE_RETENTION_DAYS=14 DATE="$(date +%Y%m%d_%H%M%S)" STAGE="${STAGE_BASE}/${DATE}" mkdir -p "$STAGE" "$LOGDIR" LOG="$LOGDIR/rman_${ORACLE_SID}_${DATE}.log" exec >>"$LOG" 2>&1 echo "=== $(date '+%F %T') START rman_simple.sh ===" echo "USER=$(id -un) HOST=$(hostname)" trap 'echo "=== $(date "+%F %T") EXIT rc=$? ==="' EXIT # 低优先级执行 if command -v ionice >/dev/null 2>&1; then NICE="ionice -c2 -n7 nice -n 15" else NICE="nice -n 15" fi # RMAN 备份:全库 + 归档 + 控制文件 + spfile $NICE rman target / <<EOF_RMAN run{ allocate channel c1 device type disk; sql 'alter system archive log current'; backup database format '${STAGE}/database_%d_%T_%U.bkp'; backup archivelog all not backed up 1 times format '${STAGE}/archivelog_%d_%T_%s_%U.arc'; backup current controlfile format '${STAGE}/controlfile_%d_%T_%U.ctl'; backup spfile format '${STAGE}/spfile_%d_%T_%U.spf'; release channel c1; } exit; EOF_RMAN # 传输到异地(需 oracle -> root 免密) $NICE ssh -o BatchMode=yes -o ConnectTimeout=10 "root@${REMOTE_HOST}" "mkdir -p '$REMOTE_DIR'" $NICE scp -o BatchMode=yes -o ConnectTimeout=10 "$STAGE"/* "root@${REMOTE_HOST}:${REMOTE_DIR}/" # 异地保留天数清理(失败不影响主流程) $NICE ssh -o BatchMode=yes -o ConnectTimeout=10 "root@${REMOTE_HOST}" \ "find '$REMOTE_DIR' -type f -mtime +$REMOTE_RETENTION_DAYS -delete" || true echo "OK: RMAN backup + transfer done at $(date)" # [改] 本地中转保留天数(当前 +1:偏紧,约保留近2天;如要近7天把-mtime +1 改 +6) find "$STAGE_BASE" -mindepth 1 -maxdepth 1 -type d -mtime +1 -exec rm -rf {} \; 2>/dev/null || true # [改] 本地日志保留天数(当前14天) find "$LOGDIR" -type f -name "rman_${ORACLE_SID}_*.log" -mtime +14 -delete

5.2arch_cleanup.sh(归档日志清理)

#!/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 # [改] 脚本目录/日志目录 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" # [改] 清理策略: # CROSSCHECK窗口=14天;删除7天前且已备份1次到磁盘的归档 RMAN_BLOCK=$(cat <<'RMAN' RUN{ CROSSCHECK ARCHIVELOG FROM TIME "SYSDATE-14"; DELETE NOPROMPT EXPIRED ARCHIVELOG ALL; DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE "SYSDATE-7" BACKED UP 1 TIMES TO DISK; } RMAN ) # 低优先级执行 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" # [改] 清理日志保留天数(当前30天) find "$LOGDIR" -type f -name "arch_cleanup_*.log" -mtime +30 -delete
http://www.jsqmd.com/news/410777/

相关文章:

  • 导师推荐!风靡全网的降AI率工具 —— 千笔·专业降AIGC智能体
  • 消防探测系统选购要点,安徽鑫思诚这类靠谱品牌费用多少 - 工业设备
  • 谁还需要 Kafka 啊?我用两个 UNIX 信号手捏了一个消息队列!
  • 第九章(选学):字典——按名字找东西
  • 看完就会:8个AI论文平台测评,研究生写论文不再难!
  • 救命神器 8个AI论文网站测评:研究生毕业论文+学术写作必备工具推荐
  • 除妖建《层园》:李渔智破 “鬼宅” 迷局,把凶宅住成了杭州城的 “世外桃源”
  • 2026鲜牛肉市场:哪些供应商值得一试?白牦牛/新鲜牛肉/鲜牛肉/天祝白牦牛肉/牛肉/白牦牛肉,鲜牛肉厂家怎么选择 - 品牌推荐师
  • 收藏!今年最火行业薪资两极分化:顶尖年薪破亿,普通打工人仍月薪 6K
  • 改命篇】立 Flag 总倒?因为你姿势全错 新年啦,又到立flag的时候啦!
  • 面试官:公司项目中Java的多线程一般用在哪些场景?
  • JVM运行时数据区
  • 从零到一:基于STM32与云平台的多传感器火灾监测系统实战
  • 基于小波分解和ARMA预测附Matlab代码
  • SQL优化万能公式:5 大步骤 + 10 个案例
  • 基于蜻蜓算法优化Kmeans聚类分析附Matlab代码
  • 企业AI获客服务性价比怎么看,江西哪家供应商值得选? - myqiye
  • 【图像加密】基于行列像素加密和灰度加密算法研究附Matlab代码
  • 导师推荐! 降AIGC平台 千笔 VS PaperRed,MBA专属高效降重神器
  • LFU缓存算法详解:从零实现到面试应对
  • STM32 核心输入、输出模式
  • SS-31 ;D-Arg-Dmt-Lys-Phe-NH2
  • 看完就会:千笔ai写作,专科生论文神器
  • [项目]LNG接收站工艺设计平台(河北某石油研究院定制项目)
  • Java 常见常用算法详解
  • 变压器选购终极指南:五大核心场景解析与头部品牌深度推荐 - 博客湾
  • 运维不想干了,还能有什么工作能干的?
  • 开题卡住了?千笔,继续教育论文写作神器
  • Java IO流的核心概念与应用实践
  • 小区低压泵喷泉维护指南:附口碑服务公司参考,低压泵喷泉厂商综合实力与口碑权威评选 - 品牌推荐师