知识点小结:
- 备份路径不要写死 IP
备份目录建议用逻辑名字(如 `backup_server01_CDB`),真实 IP 只出现在 `/etc/fstab` 或挂载命令里,方便迁移与脱敏。
- RMAN 备份内容要齐全
一套标准备份至少包含:`database`、`archivelog`、`controlfile`、`spfile`,缺一项,恢复时就可能掉坑。
- 多通道备份要结合磁盘性能
`allocate channel c1~c4` 能提高备份速度,但通道越多越吃 IO/CPU,需要根据实际磁盘能力调优。
- 保留策略要写死在脚本里
例如统一用 "恢复窗口 7 天",`archivelog` 和 `backup` 的清理条件保持一致,避免库里堆积一堆历史垃圾备份。
- 和系统层配合好 NFS
RMAN 只是往文件系统写文件,异地能力全靠 NFS 挂载和网络链路,挂载稳定性、权限与监控同样关键。
- 脚本只是开始,恢复演练才是终点
有了备份脚本,至少做一次从这套备份里恢复测试(最好在测试环境),验证能不能完整拉起库。
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