rman+crontab稳定运行需解决环境变量、归档模式、保留策略、权限路径四大问题:必须显式加载oracle环境变量;数据库须为archivelog模式;配置recovery window保留策略并crosscheck;脚本与目录权限、绝对路径、format格式须严格规范。
rman + crontab 能稳定跑起来,但绝大多数失败不是因为 rman 本身,而是环境变量、权限、路径或归档状态没对齐。
crontab 执行 RMAN 时找不到命令或报 ORA-01034: ORACLE not available
根本原因是 crontab 启动的 shell 是极简环境,ORACLE_HOME、ORACLE_SID、PATH 全都不继承。即使你用 oracle 用户执行 crontab -e,也一样。
- 必须在脚本开头显式
source /home/oracle/.bash_profile(注意路径要真实存在且可读) - 或者直接导出变量:
export ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1、export ORACLE_SID=orcl、export PATH=$ORACLE_HOME/bin:$PATH -
rman必须用绝对路径调用,比如/u01/app/oracle/product/12.1.0/dbhome_1/bin/rman,不能只写rman - 如果用
su - oracle -c "rman ..."方式,-表示加载登录 shell 环境,但依然要确保.bash_profile里有 Oracle 变量定义
RMAN 备份脚本中 backup database plus archivelog 报错 ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode
这是硬性前提错误:RMAN 的 plus archivelog 和所有热备能力,都依赖数据库处于归档模式。未开启归档,任何自动备份脚本都会卡在这里。
- 先确认:
sqlplus / as sysdba→ 执行archive log list,输出必须含Database log mode Archive Mode - 若为
No Archive Mode,需停库后启动到 mount 状态:shutdown immediate→startup mount→alter database archivelog→alter database open - 归档路径也要检查:
show parameter db_recovery_file_dest或log_archive_dest_1,确保目录存在、oracle 用户有读写权限
备份后磁盘空间爆满,delete noprompt obsolete 不生效
obsolete 的判定依赖 RMAN 的保留策略(retention policy),而默认策略是 REDUNDANCY 1,即只保留一份备份 —— 这在实际运维中几乎等于没设。
- 进 RMAN 后先查当前策略:
show all,重点关注CONFIGURE RETENTION POLICY TO ...行 - 推荐按时间窗口配置:
configure retention policy to recovery window of 7 days,这样delete obsolete才会删掉超过 7 天的备份 - 注意:
delete obsolete不删归档日志,归档需单独清理,例如:delete noprompt archivelog until time 'sysdate-2' - 脚本里务必加
crosscheck backup和crosscheck archivelog all,否则 RMAN 元数据和磁盘文件不同步,delete可能误删或漏删
备份脚本手动运行成功,但 crontab 定时执行后日志为空或报 permission denied
常见于路径权限、shell 类型、重定向写入失败三类问题,和 RMAN 无关,纯 Linux 权限链断裂。
- 脚本第一行必须是
#!/bin/bash(不是#!/bin/sh),否则source或数组语法会失败 - 备份目标目录(如
/backup)属主必须是oracle,且至少有drwxr-xr-x权限;chmod 755 /backup不够,要chown oracle:oinstall /backup - 日志重定向要指定完整路径,且确保该路径 oracle 可写:
> /home/oracle/logs/rman_`date +\%Y%m%d`.log 2>&1,注意%要转义 - crontab 中避免用波浪线
~,全部用绝对路径;测试阶段建议把 crontab 条目改成* * * * * /path/to/script.sh >> /tmp/cron-test.log 2>&1,看每分钟是否真触发
最易被忽略的一点:RMAN 脚本里的 format 字符串中不能出现空格或特殊字符(如中文、括号),哪怕路径名里有空格,也会导致备份中断且错误不明显;另外,allocate channel 分配的通道数别盲目设高,4 个通道在普通 SATA 盘上反而比 2 个更慢 —— 磁盘 I/O 是瓶颈,不是通道数。











