曾有同事誤在正式庫刪除資料,雖 Oracle 有閃回/備份機制,但無法 100% 復原。定期自動備份是資料庫生存底線。
orabak.sh#!/bin/bash
# ===== 參數區 =====
FILEPATH=/oracle/orabak # 備份根目錄
FILENAME=$(date +%Y%m%d_%H%M) # 檔名含時間戳
ORACLE_SID=orcl
ORACLE_HOME=/oracle/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$PATH
USER=oracle
# ===== 建立當日備份資料夾 =====
cd $FILEPATH
mkdir -p $FILENAME
chmod 775 $FILENAME
# ===== 匯出資料庫 (exp 傳統模式,可改 expdp) =====
exp scott/tiger@orcl file="$FILEPATH/$FILENAME.dmp" log="$FILEPATH/$FILENAME.log" owner=scott rows=y
# ===== 打包壓縮 =====
cd $FILEPATH
tar -cf $FILENAME.tar $FILENAME
rm -rf $FILENAME
gzip $FILENAME.tar
exit 0
關鍵點:
ORACLE_SID、ORACLE_HOME、PATH **必須在腳本內 export**,crontab 執行環境極簡。exp 參數:owner=scott 僅備份特定 Schema;生產環境建議改用 expdp 平行加速。tar 歸檔 → rm 原資料夾 → gzip 壓縮,節省空間。# 編輯 oracle 使用者的 crontab
crontab -e
# 每天 12:10 執行備份
10 12 * * * sh /oracle/orabak/orabak.sh >> /oracle/orabak/cron.log 2>&1
分 時 日 月 週 指令
* * * * * command
- - - - -
| | | | └─ 週 (0-7) (0/7=週日)
| | | └──── 月 (1-12)
| | └────── 日 (1-31)
| └──────── 時 (0-23)
└────────── 分 (0-59)
常用符號:* (所有)、1-5 (範圍)、1,3,5 (列舉)、*/10 (每 10 分鐘)。
find $FILEPATH -name "*.tar.gz" -mtime +7 -delete 自動清理 7 天前備份。rsync / scp 推送至遠端備份伺服器。impdp 還原測試,確保備份可用。orabak.sh + crontab 即可落實「每日自動備份、打包壓縮、自動清理」。腳本簡單可靠,適合中小型 Oracle 資料庫;大型系統建議升級 RMAN + Data Guard 架構。