从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
相关推荐
渣渣灰飞几秒前
MySQL 系统学习 第四阶段:MySQL 高级 第一节:索引(Index)
数据库·学习·mysql
山峰哥5 分钟前
数据库工程与SQL优化实战指南‌
数据库·sql·oracle·深度优先·宽度优先
Quincy_Freak43 分钟前
Python 轻量化数据存储实践:国产化环境下SQLite高效管理方案
数据库·sqlite·数据库管理·大数据分析·sqlitego
阿米亚波1 小时前
【EVE-NG 实战】防火墙基础(VLAN · VRRP · NAT · ACL · 静态路由)
运维·网络·笔记·网络协议·计算机网络·网络安全·运维开发
SelectDB技术团队2 小时前
Agent 场景动态 JSON 性能拆解:Apache Doris 比 ClickHouse 快 7 倍、比 Elasticsearch 快 2 倍
数据库·clickhouse·elasticsearch·json·apache·日志分析·apache doris
greasyfork2 小时前
多种数据库管理混乱?Navicat Premium 17 for Mac 统一解决
数据库·mysql·macos·mac
日取其半万世不竭2 小时前
云服务器迁移怎么少停机?DNS 切换前后的完整清单
运维·服务器
FREEDOM_X2 小时前
Linux 多线程编程——总结
java·linux·运维·ubuntu
Dream_fly_iboy2 小时前
系统架构设计师之数据库
数据库
名字还没想好☜2 小时前
Docker 多阶段构建:把镜像从 1.2GB 砍到 15MB
运维·docker·容器·多阶段构建·镜像优化