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 是恢复前校验,不是真恢复。

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

相关推荐
Yvonne爱编码2 小时前
数据库---Day5 数据表的增删改查
数据库
赵优秀一一2 小时前
对课上SQL使用技巧示例补充
数据库·sql
小陈工2 小时前
Python Web开发入门(三):配置文件管理与环境变量最佳实践
开发语言·jvm·数据库·python·oracle·性能优化·开源
数据库小组2 小时前
Oracle 到 PostgreSQL 迁移,2026 年如何实现平滑切换?
数据库·postgresql·oracle·数据同步·数据库迁移·oracle迁移·postgresql迁移
Agent产品评测局2 小时前
集团型企业自动化落地,如何实现多分支统一管控?——企业级智能体架构与选型深度实测
运维·人工智能·ai·chatgpt·架构·自动化
xiaomo22492 小时前
javaee-网络编程(基础)
运维·服务器·网络
charlie1145141912 小时前
2026年正点原子开发板移植方案——从0开始的Rootfs之路(4)Rootfs 目录结构创建:Linux 文件系统的“骨架“
linux·驱动开发·学习·嵌入式开发·嵌入式linux
ANii_Aini2 小时前
mysql数据库保姆级安装教程-mac(一站式服务,提供资源)
数据库·sql·mysql·navicat
REDcker2 小时前
C++ new、堆分配与 brk / mmap
linux·c++·操作系统·c·内存