从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
相关推荐
Coder_Boy_1 分钟前
基于SpringAI的智能平台基座开发-(六)
java·数据库·人工智能·spring·langchain·langchain4j
半壶清水14 分钟前
开源免费的在线考试系统online-exam-system部署方法
运维·ubuntu·docker·开源
热爱专研AI的学妹22 分钟前
数眼搜索API与博查技术特性深度对比:实时性与数据完整性的核心差异
大数据·开发语言·数据库·人工智能·python
hopsky26 分钟前
ShardingSphere功能简介
数据库·sql
QQ__176461982428 分钟前
Ubuntu系统创建新用户与删除用户
linux·运维·服务器
talenteddriver43 分钟前
mysql: MySQL索引和排序相关名词概念汇总
数据库·mysql
渣渣盟1 小时前
Linux邮件服务器快速搭建指南
linux·服务器·开发语言
6极地诈唬1 小时前
【PG漫步】DELETE不会改变本地文件的大小,VACUUM也不会
linux·服务器·数据库
ArrebolJiuZhou1 小时前
00 arm开发环境的搭建
linux·arm开发·单片机·嵌入式硬件
谷雨不太卷1 小时前
Linux_文件权限
linux·运维·服务器