从0到可落地:Oracle RMAN异地NFS备份标准脚本(多实例通用)

知识点小结:

  1. 备份路径不要写死 IP

备份目录建议用逻辑名字(如 `backup_server01_CDB`),真实 IP 只出现在 `/etc/fstab` 或挂载命令里,方便迁移与脱敏。

  1. RMAN 备份内容要齐全

一套标准备份至少包含:`database`、`archivelog`、`controlfile`、`spfile`,缺一项,恢复时就可能掉坑。

  1. 多通道备份要结合磁盘性能

`allocate channel c1~c4` 能提高备份速度,但通道越多越吃 IO/CPU,需要根据实际磁盘能力调优。

  1. 保留策略要写死在脚本里

例如统一用 "恢复窗口 7 天",`archivelog` 和 `backup` 的清理条件保持一致,避免库里堆积一堆历史垃圾备份。

  1. 和系统层配合好 NFS

RMAN 只是往文件系统写文件,异地能力全靠 NFS 挂载和网络链路,挂载稳定性、权限与监控同样关键。

  1. 脚本只是开始,恢复演练才是终点

有了备份脚本,至少做一次从这套备份里恢复测试(最好在测试环境),验证能不能完整拉起库。

bash 复制代码
#!/bin/bash
# Oracle RMAN 本地→NFS 全库+归档+控制文件+spfile 备份脚本示例
# 使用前请根据自己环境修改:ORACLE_SID、备份路径、保留天数等

# 加载 Oracle 环境变量(ORACLE_HOME/ORACLE_SID 等)
. ~/.bash_profile

# 统一日期格式,方便 RMAN 日志和备份文件命名
export NLS_DATE_FORMAT='YYYYMMDDHH24MISS'

################################################################################
# 挂载到本机的 NFS 备份目录(示例)
# 说明:
#   1)假设已在操作系统层面完成 NFS 挂载,例如:
#      mount -t nfs backup-server:/backup/oracle /ODACDBbackup_nfs
#   2)下面的 "backup_server01_CDB" 只是一个标识,不是 IP,
#      可以改成公司内部约定的备份服务器名称或代号。
################################################################################
BACKUP_NFS_BASE="/ODACDBbackup_nfs/backup_server01_CDB/rman"

################################################################################
# 一、MES CDB 实例备份(请按实际实例名修改 ORACLE_SID)
################################################################################
export ORACLE_SID=mescdb1    # MES 库实例名,按自己环境修改

rman target / >> /home/oracle/rman/log/mescdb_$(date +"%Y%m%d").log << EOF
run{
        # 分配多个磁盘通道,提高备份并行度(可根据服务器 IO、CPU 能力调整通道数量)
        allocate channel c1 device type disk;
        allocate channel c2 device type disk;
        allocate channel c3 device type disk;
        allocate channel c4 device type disk;

        # 校验备份片状态,清理失效的备份记录
        crosscheck backup;
        crosscheck archivelog all;
        delete noprompt expired backup;

        # 切换一次联机日志,确保当前 redo 也能进入归档并被本次备份覆盖
        sql 'alter system switch logfile';

        # 1)备份数据库数据文件(全库)
        backup database
          format '${BACKUP_NFS_BASE}/mes_%d_%T_%U';

        # 2)备份所有归档日志
        backup archivelog all
          format '${BACKUP_NFS_BASE}/mes_%T_%s_%U';

        # 3)备份当前控制文件
        backup current controlfile
          format '${BACKUP_NFS_BASE}/mescntrl_%T_%p_%s_%U';

        # 4)备份 spfile 参数文件
        backup spfile
          format '${BACKUP_NFS_BASE}/messp_%d_%U_%T.sp';

        # 5)清理 7 天前的归档和备份(保留策略,可按需调整)
        delete noprompt archivelog until time 'sysdate-7';
        delete noprompt backup of database completed before 'sysdate - 7';
        delete noprompt backup of archivelog until time 'sysdate - 7';
        delete noprompt obsolete recovery window of 7 days;

        # 释放通道
        release channel c1;
        release channel c2;
        release channel c3;
        release channel c4;
}
exit;
EOF

################################################################################
# 二、UTF8 CDB 实例备份(第二个实例示例,按需保留或删除)
################################################################################
export ORACLE_SID=UTF8CDB1   # 另一个 CDB 实例名,根据实际环境修改

rman target / >> /home/oracle/rman/log/u8db_$(date +"%Y%m%d").log << EOF
run{
        # 同样分配 4 个磁盘通道
        allocate channel c1 device type disk;
        allocate channel c2 device type disk;
        allocate channel c3 device type disk;
        allocate channel c4 device type disk;

        crosscheck backup;
        crosscheck archivelog all;
        delete noprompt expired backup;

        sql 'alter system switch logfile';

        # 全库备份
        backup database
          format '${BACKUP_NFS_BASE}/u8_%d_%T_%U';

        # 归档日志备份
        backup archivelog all
          format '${BACKUP_NFS_BASE}/u8_%T_%s_%U';

        # 控制文件备份
        backup current controlfile
          format '${BACKUP_NFS_BASE}/u8cntrl_%T_%p_%s_%U';

        # spfile 备份
        backup spfile
          format '${BACKUP_NFS_BASE}/u8sp_%d_%U_%T.sp';

        # 同样保留 7 天的恢复窗口
        delete noprompt archivelog until time 'sysdate-7';
        delete noprompt backup of database completed before 'sysdate - 7';
        delete noprompt backup of archivelog until time 'sysdate - 7';
        delete noprompt obsolete recovery window of 7 days;

        release channel c1;
        release channel c2;
        release channel c3;
        release channel c4;
}
exit;
EOF
相关推荐
TDengine (老段)1 小时前
网络延时对 TDengine TSDB 写入性能的影响:实验解析与实践建议
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
黑客思维者1 小时前
嵌入式系统DevSecOps深度设计:构建固件级漏洞免疫体系的自动化管道
运维·自动化·devsecops·嵌入式系统
古城小栈1 小时前
吃透Cron表达式
linux·服务器·数据库
mpHH1 小时前
ivorysql 源码分析-双port兼容
数据库·学习·postgresql
真上帝的左手2 小时前
4. 关系型数据库-MySQL-架构
数据库·mysql·架构
haiyu柠檬2 小时前
迁移redis 集群从Ubuntu到Red Hat
数据库·redis·缓存
猫猫的小茶馆2 小时前
【ARM】BootLoader(Uboot)介绍
linux·汇编·arm开发·单片机·嵌入式硬件·mcu·架构
Yeliang Wu2 小时前
LLaMA-Factory 模型评估理论与实战:基于 Ubuntu 22.04 的系统化指南
linux·ubuntu·llama·评估·llamafactory