實作 Oracle 自動備份 Shell 腳本並納入 crontab 排程,過程中遇到三個典型錯誤,記錄解決過程供參考。
Message file RMAN<LANG>.msb not found
Verify that Oracle_HOME is set properly
原因: crontab 執行環境不繼承使用者環境變數。
解決: 在 Shell 腳本中顯式宣告 ORACLE_HOME、ORACLE_SID、NLS_LANG 等變數。
原因: crontab 中直接使用 su 或管道導致無終端機。
解決: 將 su 切換使用者的動作移入 Shell 腳本內部,crontab 僅呼叫該腳本。
RMAN-00556: could not open CMDFILE "backup_ar.rcv"
原因: RMAN cmdfile 參數需指定絕對路徑,不可使用相對路徑或 ./。
解決: 在腳本中使用完整路徑,如 /home/oracle/bak_sh/backup_ar.rcv。
# 每天 12:00、18:00 備份歸檔日誌
0 12,18 * * * /home/oracle/bak_sh/backup_ar.sh
#!/bin/sh
export ORACLE_HOME=/home/u01/app/oracle/product/10.2.0/db_1
export ORACLE_SID=test
export LANG=en_US.UTF-8
$ORACLE_HOME/bin/rman cmdfile=/home/oracle/bak_sh/backup_ar.rcv
connect target /
connect catalog rman/rman@rman
run {
allocate channel d1 device type disk;
sql 'alter system archive log current';
backup archivelog all delete input format '/opt/rmanback/full_%u_%p_%c.ac' filesperset = 3;
release channel d1;
}
# /etc/crontab
59 23 * * * root run-parts /etc/cron.daily
# /etc/cron.daily/backup.sh
su - oracle -c "/home/oracle/bak_sh/backup_ar.sh"
並在 backup_ar.sh 內完整 export 環境變數。
ORACLE_HOME、ORACLE_SID、NLS_LANG、PATH、LD_LIBRARY_PATHcmdfile 必須用絕對路徑su、管道、重導向等需要 tty 的操作