从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
相关推荐
咕噜企业分发小米35 分钟前
阿里云和华为云基因测序数据同步的审计日志如何查看?
阿里云·oracle·华为云
豆芽脚脚8 小时前
MongoDB 导出和导入完整指南
数据库·mongodb
烧饼Fighting8 小时前
Mysql替换为瀚高数据库部分函数转换V4.5版本
数据库·mysql
上善若水_厚德载物9 小时前
Centos7 Mysql 5.7 读写分离
数据库·mysql
张太行_9 小时前
Linux静态库:多模块高效管理
linux·运维·服务器
Mr__Miss9 小时前
Redis的持久化
数据库·redis·缓存
CCPC不拿奖不改名9 小时前
SQL基础(SQL小白教程):MySQL语句+环境一键搭建+面试习题
数据库·sql·计算机网络·mysql·oracle·面试·职场和发展
公子烨9 小时前
linux的斩杀线之OOM操控
linux
陈文锦丫9 小时前
JAVA面试
数据库·mysql
sunfove10 小时前
将 Python 仿真工具部署并嵌入个人博客
开发语言·数据库·python