Oracle RMAN 全量 + 增量备份 Shell 脚本(crontab 定时版,11g/12c/19c 通用)

策略:周日0级全备;周一~周六1级差异增量;自动归档备份+清理过期归档+清理过期备份;日志输出;错误判断;测试库先行,生产修改路径 备份策略说明:

  • 0级:INCREMENTAL LEVEL=0 基线全量增量
  • 1级:INCREMENTAL LEVEL=1 差异增量(默认RMAN增量就是差异,cumulative是累计增量)
  • 保留策略:RECOVERY WINDOW OF 7 DAYS,保留最近7天可恢复备份

rman_backup.sh

#!/bin/bash
##############################################################################
# Oracle RMAN 周日0级全备,工作日1级差异增量备份脚本
# 适用:Oracle 11g/12c/19c Linux
##############################################################################
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

# 配置区,请按现场修改
BACKUP_BASE=/backup/orcl
LOG_DIR=${BACKUP_BASE}/log
RMAN_LOG=${LOG_DIR}/rman_`date +%Y%m%d_%H%M`.log
RETENTION_DAYS=7
# 并行通道数
PARALLEL=2

# 创建目录
mkdir -p ${BACKUP_BASE}/{data,arch,ctl,log}

# 判断星期,周日0级,其余1级
WEEK_DAY=$(date +%w)
if [ ${WEEK_DAY} -eq 0 ];then
  BACKUP_LEVEL=0
  TAG_NAME="LEVEL0_FULL"
else
  BACKUP_LEVEL=1
  TAG_NAME="LEVEL1_DIFF"
fi

echo "=============================================" >> ${RMAN_LOG}
echo "RMAN Backup Start Time: `date` , Level:${BACKUP_LEVEL}" >> ${RMAN_LOG}
echo "=============================================" >> ${RMAN_LOG}

rman target / log=${RMAN_LOG} append << EOF
SET ECHO ON;
SHOW ALL;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '${BACKUP_BASE}/ctl/ctl_%F.bkp';
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF ${RETENTION_DAYS} DAYS;
CONFIGURE DEVICE TYPE DISK PARALLELISM ${PARALLEL};
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '${BACKUP_BASE}/data/rman_${TAG_NAME}_%U.bkp';
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO DISK;

RUN {
  ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
  ALLOCATE CHANNEL c2 DEVICE TYPE DISK;

  # 备份归档日志,备份成功后删除归档
  BACKUP AS COMPRESSED BACKUPSET
  TAG='ARCH_${TAG_NAME}'
  FORMAT '${BACKUP_BASE}/arch/arch_%U.bkp'
  ARCHIVELOG ALL DELETE ALL INPUT;

  # 增量备份数据库
  BACKUP AS COMPRESSED BACKUPSET
  TAG='${TAG_NAME}'
  INCREMENTAL LEVEL=${BACKUP_LEVEL}
  DATABASE;

  # 备份当前控制文件+spfile
  BACKUP CURRENT CONTROLFILE TAG='CTL_${TAG_NAME}' FORMAT '${BACKUP_BASE}/ctl/ctl_%F.bkp';
  BACKUP SPFILE TAG='SPFILE_${TAG_NAME}' FORMAT '${BACKUP_BASE}/ctl/spfile_%F.bkp';

  # 交叉校验备份,删除过期备份
  CROSSCHECK BACKUP;
  CROSSCHECK ARCHIVELOG ALL;
  DELETE NOPROMPT OBSOLETE;
  DELETE NOPROMPT EXPIRED BACKUP;

  RELEASE CHANNEL c1;
  RELEASE CHANNEL c2;
}
EOF

# 判断RMAN返回码
RC=$?
echo "=============================================" >> ${RMAN_LOG}
echo "RMAN Backup End Time: `date`" >> ${RMAN_LOG}
echo "RMAN Return Code: ${RC}" >> ${RMAN_LOG}
echo "=============================================" >> ${RMAN_LOG}

# 日志保留30天,自动清理旧日志
find ${LOG_DIR} -name "rman_*.log" -mtime +30 -delete

if [ ${RC} -ne 0 ];then
  echo "RMAN备份失败,请检查日志:${RMAN_LOG}"
  exit 1
else
  echo "RMAN备份完成,日志:${RMAN_LOG}"
  exit 0
fi

脚本部署

# 赋权
chmod 700 rman_backup.sh
# 放到oracle用户crontab,每日凌晨1点执行
crontab -e
# 添加
00 01 * * * /home/oracle/rman_backup.sh

注意:

  1. 库必须开启归档模式 archive log list;
  2. 磁盘空间提前评估,压缩备份会减少存储占用;
  3. 生产建议:备份完成后,增加异地拷贝备份集;
  4. 12c CDB库:备份语句改成 BACKUP PLUGGABLE DATABASE PDB1,PDB2;

二、RMAN异机完整恢复文档(控制文件丢失场景,完整操作步骤)

场景:原库硬件故障,备份集拷贝到新服务器,新主机安装同版本Oracle软件,SID保持一致;无恢复catalog,依赖控制文件自动备份。 前提准备:

  1. 新主机Oracle软件版本和原库一致;
  2. 备份文件全部拷贝到新主机,目录保持一致或记录路径;
  3. 拿到原库DBID(select dbid from v$database; 或从备份文件名%F获取);
  4. 准备密码文件 orapw${ORACLE_SID} 拷贝到新库$ORACLE_HOME/dbs

步骤1:环境变量+启动实例到NOMOUNT

export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

sqlplus / as sysdba
STARTUP NOMOUNT;
exit;

步骤2:RMAN设置DBID,还原SPFILE(可选,如果spfile丢失)

rman target /
SET DBID 123456789;
RESTORE SPFILE FROM '/backup/orcl/ctl/spfile_xxxx.bkp';
# 退出,重启nomount生效
exit
sqlplus / as sysdba
STARTUP NOMOUNT;

步骤3:RMAN还原控制文件

RMAN> SET DBID 123456789;
RMAN> RESTORE CONTROLFILE FROM '/backup/orcl/ctl/ctl_xxxxxxxx.bkp';
# 控制文件还原成功后,mount数据库
RMAN> ALTER DATABASE MOUNT;

步骤4:注册备份集(控制文件里没有新主机备份路径时执行)

如果备份路径和原机不一样,需要catalog备份片

RMAN> CATALOG START WITH '/backup/orcl/data/';
RMAN> CATALOG START WITH '/backup/orcl/arch/';
# 校验备份
RMAN> CROSSCHECK BACKUP;
RMAN> LIST BACKUP SUMMARY;

步骤5:还原数据库

RMAN> RUN {
ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
RESTORE DATABASE;
RELEASE CHANNEL c1;
RELEASE CHANNEL c2;
}

若数据文件路径和原机不一致,用SET NEWNAME脚本(下面示例)

RUN{
ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
SET NEWNAME FOR DATAFILE 1 TO '/oradata/orcl/system01.dbf';
SET NEWNAME FOR DATAFILE 2 TO '/oradata/orcl/undotbs01.dbf';
SET NEWNAME FOR DATAFILE 3 TO '/oradata/orcl/sysaux01.dbf';
SET NEWNAME FOR DATAFILE 4 TO '/oradata/orcl/users01.dbf';
RESTORE DATABASE;
SWITCH DATAFILE ALL;
RELEASE CHANNEL c1;
}

步骤6:执行数据库恢复(自动应用归档)

RECOVER DATABASE;

时间点不完全恢复示例(按需使用) RECOVER DATABASE UNTIL TIME "TO_DATE('2026-10-08 02:00:00','yyyy-mm-dd hh24:mi:ss')";

步骤7:打开数据库(不完全恢复必须加RESETLOGS)

ALTER DATABASE OPEN RESETLOGS;

✅ 如果是完整恢复,不需要RESETLOGS,直接 ALTER DATABASE OPEN;

步骤8:恢复后校验

-- 查看数据库状态
SELECT name,open_mode FROM v$database;
-- 检查所有数据文件状态
SELECT file#,name,status,enabled FROM v$datafile;
-- 检查表空间
SELECT tablespace_name,status FROM dba_tablespaces;
-- 临时表空间重建(恢复后临时文件丢失,需要重建)
ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata/orcl/temp01.dbf' SIZE 1G REUSE AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;

步骤9:RMAN配置重置,重新开启控制文件自动备份

CONFIGURE CONTROLFILE AUTOBACKUP ON;
SHOW ALL;

补充:常见故障场景快速命令集

  1. 单数据文件损坏恢复(库open状态)
SQL 'ALTER TABLESPACE USERS OFFLINE IMMEDIATE';
RESTORE TABLESPACE USERS;
RECOVER TABLESPACE USERS;
SQL 'ALTER TABLESPACE USERS ONLINE';
  1. 只恢复PDB(12c+)
ALTER PLUGGABLE DATABASE PDB1 CLOSE;
RESTORE PLUGGABLE DATABASE PDB1;
RECOVER PLUGGABLE DATABASE PDB1;
ALTER PLUGGABLE DATABASE PDB1 OPEN;
  1. RMAN恢复预览,提前确认需要哪些备份
RESTORE DATABASE PREVIEW;
RECOVER DATABASE PREVIEW;

⚠️ 生产重大提醒

  1. RESETLOGS后,RESETLOGS之前的所有备份不能再用于该库恢复,恢复完成立刻做一次全新0级备份;
  2. 异机恢复前,先在测试库完整演练一遍;
  3. 备份脚本建议增加邮件告警,备份失败自动发邮件通知DBA;
  4. 定期执行 VALIDATE DATABASE 校验备份可用性,不要等到故障才验证。
上一篇 Oracle RMAN 100 条备份恢复常用命令(11g/12c/19c 通用,分 7 大类)
易读格

易读格管理员

易读存知,格聚运维。

本月创作热力图

少
多
目录
最新评论
暂无评论