策略:周日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
注意:
- 库必须开启归档模式
archive log list;- 磁盘空间提前评估,压缩备份会减少存储占用;
- 生产建议:备份完成后,增加异地拷贝备份集;
- 12c CDB库:备份语句改成
BACKUP PLUGGABLE DATABASE PDB1,PDB2;
二、RMAN异机完整恢复文档(控制文件丢失场景,完整操作步骤)
场景:原库硬件故障,备份集拷贝到新服务器,新主机安装同版本Oracle软件,SID保持一致;无恢复catalog,依赖控制文件自动备份。 前提准备:
- 新主机Oracle软件版本和原库一致;
- 备份文件全部拷贝到新主机,目录保持一致或记录路径;
- 拿到原库DBID(
select dbid from v$database;或从备份文件名%F获取);- 准备密码文件
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;
补充:常见故障场景快速命令集
- 单数据文件损坏恢复(库open状态)
SQL 'ALTER TABLESPACE USERS OFFLINE IMMEDIATE';
RESTORE TABLESPACE USERS;
RECOVER TABLESPACE USERS;
SQL 'ALTER TABLESPACE USERS ONLINE';
- 只恢复PDB(12c+)
ALTER PLUGGABLE DATABASE PDB1 CLOSE;
RESTORE PLUGGABLE DATABASE PDB1;
RECOVER PLUGGABLE DATABASE PDB1;
ALTER PLUGGABLE DATABASE PDB1 OPEN;
- RMAN恢复预览,提前确认需要哪些备份
RESTORE DATABASE PREVIEW;
RECOVER DATABASE PREVIEW;
⚠️ 生产重大提醒
- RESETLOGS后,RESETLOGS之前的所有备份不能再用于该库恢复,恢复完成立刻做一次全新0级备份;
- 异机恢复前,先在测试库完整演练一遍;
- 备份脚本建议增加邮件告警,备份失败自动发邮件通知DBA;
- 定期执行
VALIDATE DATABASE校验备份可用性,不要等到故障才验证。