根本原因是crontab执行环境缺失ORACLE_HOME、ORACLE_SID及rman所在PATH,不自动加载.bash_profile;须在脚本中显式export变量或source配置,并使用rman绝对路径,同时确保脚本可执行、crontab调用绝对路径、输出重定向捕获stderr。
根本原因不是脚本写错了,而是 crontab 启动的 shell 环境里压根没有 oracle_home、oracle_sid 和 path 里的 rman。
crontab 不加载 .bash_profile 或 .bashrc
即使你用 crontab -e 在 oracle 用户下编辑,它也不会自动 source 任何 shell 配置文件。这意味着:
-
rman命令找不到——因为/u01/app/oracle/product/12.2.0/dbhome_1/bin/不在 PATH 里 -
ORACLE_SID为空,rman target /连不上实例 -
ORACLE_HOME未设,RMAN 无法定位 Oracle 内部库和配置
验证方法:在脚本开头加一行 env > /tmp/cron_env.log,跑一次 crontab,对比手动执行时的 env 输出,差异一目了然。
脚本里必须显式设置环境或 source 配置
两种可靠做法,任选其一即可:
- 在脚本顶部直接 export 变量(最轻量):
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1export ORACLE_SID=orclexport PATH=$ORACLE_HOME/bin:$PATH - 或者用
source加载用户环境(更贴近手动执行):if [ -f $HOME/.bash_profile ]; then . $HOME/.bash_profile; fi
注意:.bash_profile 必须可读,且其中确实设置了 Oracle 相关变量;如果用了 .bashrc,要确认它被 .bash_profile 调用了,否则单独 source .bashrc 可能无效。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
rman 必须用绝对路径调用
crontab 的默认 PATH 极其精简(通常只有 /usr/bin:/bin),rman 绝对不在里面。所以:
- ❌ 错误写法:
rman target / <<EOF - ✅ 正确写法:
$ORACLE_HOME/bin/rman target / <<EOF或硬编码路径/u01/app/oracle/product/12.2.0/dbhome_1/bin/rman target / <<EOF
同理,如果脚本里还调用了 sqlplus、expdp 等命令,也得用绝对路径或确保 PATH 已正确设置。
权限、日志与调试缺一不可
光改环境还不够,这三个点漏掉一个就白忙:
- 脚本必须有执行权限:
chmod +x /home/oracle/scripts/rman_full.sh - crontab 条目必须用绝对路径:
30 2 * * * /home/oracle/scripts/rman_full.sh(不能写~/scripts/...) - 务必重定向输出:
30 2 * * * /home/oracle/scripts/rman_full.sh >> /home/oracle/logs/rman_cron.log 2>&1,否则错误全丢进黑洞
真正容易被忽略的是:crontab 日志默认不记录 stderr,而 RMAN 失败往往只报在 stderr 里。没加 2>&1,等于没留证据。

















