Linux环境下Oracle RMAN全量、增量备份与定时任务实践_20260331

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 的保留策略有两种互斥方式:REDUNDANCYRECOVERY 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 DAYS14 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 是恢复前校验,不是真恢复。

真正要完全确认备份可恢复,还是要做一次异机恢复测试。

相关推荐
考虑考虑8 小时前
docker compose V2版本新属性
运维·后端·自动化运维
风哥2号9 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
AlanBruce9 小时前
摩尔信使MThings功能综述与应用使用指南
linux·自动化·plc·mthings·摩尔信使
小小的木头人10 小时前
Ubuntu Samba修改端口绕过445封禁挂载
运维·ubuntu
YangYang9YangYan10 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
西安栈上月明软件科技11 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m11 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
wdfk_prog11 小时前
ROS教程:01 搭建 ROS1 Noetic Docker 开发环境
运维·缓存·docker·容器·ros
SEO_juper11 小时前
Java 并发编程实战:从线程基础到高并发架构
运维·人工智能·爬虫·chatgpt·seo
szephyr12 小时前
Docker + Compose 实战:把本地项目一键搬到云服务器,附完整配置
运维·docker·容器·部署·云服务器