首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 資料庫自動備份腳本實作與排程疑難雜症

     編輯:Oracle 資料庫基礎

背景

實作 Oracle 自動備份 Shell 腳本並納入 crontab 排程,過程中遇到三個典型錯誤,記錄解決過程供參考。

錯誤一:RMAN 找不到訊息檔

Message file RMAN<LANG>.msb not found
Verify that Oracle_HOME is set properly

原因: crontab 執行環境不繼承使用者環境變數。
解決: 在 Shell 腳本中顯式宣告 ORACLE_HOME、ORACLE_SID、NLS_LANG 等變數。

錯誤二:standard in must be a tty

原因: crontab 中直接使用 su 或管道導致無終端機。
解決: 將 su 切換使用者的動作移入 Shell 腳本內部,crontab 僅呼叫該腳本。

錯誤三:RMAN-00556 could not open CMDFILE

RMAN-00556: could not open CMDFILE "backup_ar.rcv"

原因: RMAN cmdfile 參數需指定絕對路徑,不可使用相對路徑或 ./。
解決: 在腳本中使用完整路徑,如 /home/oracle/bak_sh/backup_ar.rcv。

正確實作範例

1. crontab 設定

# 每天 12:00、18:00 備份歸檔日誌
0 12,18 * * * /home/oracle/bak_sh/backup_ar.sh

2. 入口 Shell 腳本 (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

3. RMAN 備份腳本 (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;
}

替代方案:使用 root crontab 呼叫 su

# /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 環境變數。

關鍵點總結

  • cron 環境極簡,必須在腳本內完整設定 ORACLE_HOME、ORACLE_SID、NLS_LANG、PATH、LD_LIBRARY_PATH
  • RMAN cmdfile 必須用絕對路徑
  • 避免在 crontab 直接使用 su、管道、重導向等需要 tty 的操作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved