RMAN 是 Oracle 官方提供的备份恢复工具,支持数据库、归档日志、控制文件、SPFILE 的备份与恢复,也支持增量备份和备份校验。
在生产环境中,RMAN 是最常见、也最规范的备份方式之一。
这篇文章主要整理三件事:
-
如何部署 RMAN 本地备份脚本?
-
如何配置定时自动备份?
-
如何验证备份是否可用?
1、什么是 RMAN
RMAN(Recovery Manager)是 Oracle 官方备份恢复工具,主要用于:
-
备份数据库
-
备份归档日志
-
备份控制文件和 SPFILE
-
执行增量备份
-
校验备份是否可恢复
-
执行数据库恢复
相比手工拷贝数据文件,RMAN 更适合生产环境,因为它支持热备,也更方便后续恢复和管理。
2、执行用户说明
本文中的命令分为两类,执行前请先确认用户身份。
1)以 root 用户执行
主要用于系统层面的操作,例如:
-
创建目录
-
修改属主
-
调整权限
2)以 oracle 用户执行
主要用于 Oracle 数据库相关操作,例如:
-
执行
rman target / -
执行
sqlplus / as sysdba -
编写和执行 RMAN 脚本
-
配置 oracle 用户自己的定时任务
crontab -e
3)一句话记住
涉及系统目录和权限,用 root;涉及 Oracle 备份和数据库操作,用 oracle。
3、先确认数据库已开启归档模式
RMAN 热备的前提,是数据库处于 ARCHIVELOG 模式。
1)检查归档模式
以 oracle 用户登录服务器后,进入 SQL*Plus 执行:
archive log list;
如果看到类似下面内容,说明已开启:
Database log mode Archive Mode
Automatic archival Enabled
Archive destination ...
2)开启归档模式
注意:开启归档模式需要重启数据库,必须在维护窗口操作。
以 oracle 用户登录服务器后,进入 SQL*Plus 执行:
-- 可选:提前设置归档路径
alter system set log_archive_dest_1='LOCATION=/archivelog' scope=both;
-- 关闭数据库
shutdown immediate;
-- 启动到 mount
startup mount;
-- 开启归档模式
alter database archivelog;
-- 打开数据库
alter database open;
-- 再次确认
archive log list;
3)说明
开启归档后,数据库会不断生成归档日志。
所以备份之外,还要有归档清理策略,否则磁盘空间迟早会被占满。
4、归档日志清理脚本
生产环境中,不建议无条件强删归档日志 。
更稳妥的做法是:只删除已经备份过的归档日志。
1)创建脚本目录
以 root 用户执行:
mkdir -p /home/oracle/scripts
chown -R oracle:oinstall /home/oracle/scripts
chmod -R 750 /home/oracle/scripts
2)创建归档清理脚本
由于打开归档模式后会源源不断的产生归档日志,所以建议部署一个定期删除归档的任务。
📢 注意: 以下脚本直接复制粘贴即可使用,只需注意修改对应的备份路径即可!
切换到 oracle 用户后执行:
cat > /home/oracle/scripts/del_arch.sh <<'EOF'
#!/bin/bash
source ~/.bash_profile
deltime=$(date +"%Y%m%d%H%M%S")
rman target / nocatalog msglog /home/oracle/scripts/del_arch_${deltime}.log <<RMAN_EOF
crosscheck archivelog all;
delete noprompt expired archivelog all;
delete noprompt archivelog until time 'sysdate-7' backed up 1 times to disk;
# 如需启用空间兜底策略,取消下一行注释
# delete noprompt force archivelog until time 'SYSDATE-14';
RMAN_EOF
EOF
chmod +x /home/oracle/scripts/del_arch.sh
本脚本默认先清理 7 天前且已备份过 1 次的归档日志。再对 14 天前的归档日志执行强制删除,作为防止归档持续堆积、占满磁盘空间的兜底措施。
如遇归档持续堆积、磁盘空间紧张,可按需启用 delete noprompt force archivelog until time 'SYSDATE-14';作为空间兜底措施。
需要注意的是,FORCE 会忽略归档删除策略,因此更适合空间优先场景,不建议在未评估恢复需求的情况下长期默认启用。
3)配置定时任务
以 oracle 用户执行:
crontab -e
加入:
00 02 * * * /home/oracle/scripts/del_arch.sh
4)说明
这段脚本的逻辑是:
-
校验归档记录是否存在
-
删除失效记录
-
删除 7 天前且至少已备份过 1 次 的归档日志
-
再对 14 天前的归档日志执行强制删除(评估后再启用)
这样比直接强删安全得多,更适合正式环境。
5、本地 RMAN 备份方案
常见做法是:
-
周日执行 0 级增量备份(相当于全备)
-
周一到周六执行 1 级增量备份
-
同时备份归档日志
-
记录日志,方便排查
6、备份前先确认 RMAN 保留策略
可以,给你一版精简后的最终知识点,已经把"生产环境一般保留几天"加进去了,适合直接插到文章里。
在正式备份前,建议先确认 RMAN 保留策略。
因为后面脚本里的:
delete noprompt obsolete;
是否会删除旧备份,就是按这个策略来判断的。RMAN 的保留策略有两种互斥方式:REDUNDANCY 和 RECOVERY WINDOW。其中,RECOVERY WINDOW 表示必须保留足够的备份,保证数据库能恢复到过去指定天数内的任意时间点。(Oracle Docs)
6.1 查看当前保留策略
以 oracle 用户执行:
rman target /
进入 RMAN 后执行:
show retention policy;
或者:
show all;
如果看到:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
表示当前采用默认策略:保留 1 份可用备份 。(Oracle Docs)
6.2 修改保留策略
如果只是按份数保留,可以改成:
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
如果按恢复天数保留,可以改成:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
或者:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
如果想恢复默认值:
CONFIGURE RETENTION POLICY CLEAR;
CLEAR 会恢复为默认值,不是禁用策略。(Oracle Docs)
6.3 为什么有策略也可能不删除
因为 RMAN 保留策略只负责判断,不会自动删除。
真正执行删除的是:
delete noprompt obsolete;
也就是说:
-
只配置策略,不会自动删
-
脚本里加了
delete noprompt obsolete;才会按策略删除 -
如果当前没有 obsolete 备份,就算加了这句,也可能删不掉
可以先执行:
report obsolete;
看当前有没有可删除的旧备份。Oracle 文档明确说明,RMAN 不会自动删除因恢复窗口或保留策略而变成 obsolete 的备份,只有执行 DELETE OBSOLETE 才会删除。(Oracle Docs)
6.4 生产环境一般保留几天
正式生产环境里,通常更建议使用 RECOVERY WINDOW ,不要长期只用默认的 REDUNDANCY 1。
实战中常见的做法是:
-
普通生产库:7 天
-
重要生产库:14 天
例如:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
或者:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
Oracle 文档用 RECOVERY WINDOW OF 7 DAYS 作为标准示例;在 ODA 文档中,磁盘备份的恢复窗口也给出了 1 到 14 天 的范围,所以把 7 天或 14 天作为生产环境常见值,是比较稳的写法。(Oracle Docs)
6.5 一句话总结
RMAN 保留策略负责判断旧备份是否过时,delete noprompt obsolete; 负责真正删除。
如果脚本里没有这句,通常不会自动清理旧备份。生产环境中,一般更建议使用 RECOVERY WINDOW OF 7 DAYS 或 14 DAYS。
7、准备本地备份目录
📢 注意: 以下脚本直接复制粘贴即可使用,只需注意修改对应的备份路径即可!
以 root 用户执行:
mkdir -p /backup
chown -R oracle:oinstall /backup
chmod -R 775 /backup
建议提前确认 /backup 空间是否足够。
8、Linux 下 RMAN 备份脚本
1)0 级备份脚本(周日执行)
切换到 oracle 用户后执行:
cat > /home/oracle/scripts/dbbackup_lv0.sh <<'EOF'
#!/bin/bash
source ~/.bash_profile
backtime=$(date +"%Y%m%d%H%M%S")
rman target / log=/backup/level0_backup_${backtime}.log <<RMAN_EOF
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
crosscheck backup;
crosscheck archivelog all;
delete noprompt expired backup;
delete noprompt expired archivelog all;
sql 'alter system archive log current';
backup incremental level 0 database
include current controlfile
format '/backup/backlv0_%d_%T_%t_%s_%p';
backup archivelog all delete input
format '/backup/arch_%d_%T_%t_%s_%p';
delete noprompt obsolete;
release channel c1;
release channel c2;
}
RMAN_EOF
EOF
chmod +x /home/oracle/scripts/dbbackup_lv0.sh
2)1 级备份脚本(周一到周六执行)
切换到 oracle 用户后执行:
cat > /home/oracle/scripts/dbbackup_lv1.sh <<'EOF'
#!/bin/bash
source ~/.bash_profile
backtime=$(date +"%Y%m%d%H%M%S")
rman target / log=/backup/level1_backup_${backtime}.log <<RMAN_EOF
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
crosscheck backup;
crosscheck archivelog all;
delete noprompt expired backup;
delete noprompt expired archivelog all;
sql 'alter system archive log current';
backup incremental level 1 database
include current controlfile
format '/backup/backlv1_%d_%T_%t_%s_%p';
backup archivelog all delete input
format '/backup/arch_%d_%T_%t_%s_%p';
delete noprompt obsolete;
release channel c1;
release channel c2;
}
RMAN_EOF
EOF
chmod +x /home/oracle/scripts/dbbackup_lv1.sh
9、多实例环境补充说明
📢 注意: 如果有多个实例,每个实例对应的脚本需要手动指定实例 export ORACLE_SID。
如果一台服务器上有多个实例,脚本里要明确指定:
以 oracle 用户执行:
###示例:
export ORACLE_SID=HISCDB1
否则脚本可能连到错误的实例。
如果是 RAC 环境,还要结合节点、共享目录、通道数等实际情况调整。
10、配置定时任务
脚本创建完之后,记得给脚本赋予可执行权限:
cd /home/oracle/scripts
chmod +x dbbackup_lv0.sh
chmod +x dbbackup_lv1.sh
ls -lrth
Oracle RMAN 本地备份脚本一般是与定时任务(crontab)配合使用,选择合适的时间段进行备份很重要,建议尽量挑选业务空闲或者负载较低的时间段进行备份。假设凌晨是业务空闲时段,部署定时任务:
以 oracle 用户执行:
crontab -e
加入:
00 00 * * 0 /home/oracle/scripts/dbbackup_lv0.sh
00 00 * * 1-6 /home/oracle/scripts/dbbackup_lv1.sh
含义:
-
周日 00:00 执行 0 级备份
-
周一到周六 00:00 执行 1 级备份
建议放在业务低峰期执行。
11、如何验证备份是否成功
脚本写完不算完,至少要确认备份真的生成了。
1)手工执行一次 0 级备份
以 oracle 用户执行:
sh /home/oracle/scripts/dbbackup_lv0.sh
后台执行也可以:
nohup sh /home/oracle/scripts/dbbackup_lv0.sh >/dev/null 2>&1 &
2)通过 RMAN 查看备份记录
以 oracle 用户执行:
rman target /
执行:
list backup;
这一步可以查看:
-
是否生成备份集
-
数据文件是否已备份
-
控制文件、SPFILE 是否已备份
-
归档日志是否已备份
3)通过视图查看备份任务明细
以 oracle 用户登录服务器后,进入 SQL*Plus 执行:
set linesize 200
set pagesize 1000
col status for a12
col input_type for a20
col input_bytes_display for a12
col output_bytes_display for a12
col time_taken_display for a12
select input_type,
status,
to_char(start_time,'yyyy-mm-dd hh24:mi:ss') as start_time,
to_char(end_time,'yyyy-mm-dd hh24:mi:ss') as end_time,
input_bytes_display,
output_bytes_display,
time_taken_display,
compression_ratio
from v$rman_backup_job_details
order by start_time desc;
重点看:
-
STATUS是否为COMPLETED -
开始和结束时间是否正常
-
备份大小是否符合预期
12、如何验证备份是否可用
备份成功,不等于恢复一定没问题。
RMAN 也提供了备份集的验证功能,通过简单的几行命令即可验证备份是否可用:可以用 RMAN 做基础校验。
1)连接 RMAN
以 oracle 用户执行:
rman target /
2)执行验证命令
在 RMAN 提示符下执行:
restore validate spfile;
restore validate controlfile;
restore validate database;

这几条命令的作用是:
-
验证备份是否可读
-
验证 RMAN 是否能找到对应备份
-
检查备份片是否有损坏
3)说明
这几条命令不会真的把数据库、SPFILE、CONTROLFILE 恢复到当前生产环境 ,但会读取备份片,所以会有一定 I/O 开销。
尤其是:
restore validate database;
这条相对更重,建议放在业务低峰期执行。
一句话理解:
restore validate 是恢复前校验,不是真恢复。
真正要完全确认备份可恢复,还是要做一次异机恢复测试。