| 時間 | 任務 | 說明 |
|---|---|---|
| 23:00 | Export 邏輯備份 | 用戶模式導出 .dmp、.log 至 /backup |
| 02:00 | 磁帶備份 | tar 將 /backup 當日檔案寫入磁帶 (離線存儲) |
| 04:00 | 異地 FTP 傳輸 | 自動上傳至遠端備份主機 /pub (異地容災) |
ora_env.sh#!/bin/ksh
# ora_env.sh - Oracle 環境變數設定 (由其他腳本 source)
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=ORCL
export ORACLE_TERM=xterm
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export PATH=.:/usr/ccs/bin:/usr/ucb:$ORACLE_HOME/bin:$PATH
export DISPLAY=localhost:0
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
chmod 755 ora_env.sh
ora_backup.sh#!/bin/ksh
# ora_backup.sh - 每日 Export 備份
. $ORACLE_HOME/ora_env.sh
DATE_TAG=$(date +%m%d) # 如 0112
BACKUP_DIR=/backup
EXP_USER=scott/tiger # 實際建議用專用備份帳號 + 外部密碼檔
LOG_FILE=$BACKUP_DIR/exp_${DATE_TAG}.log
DMP_FILE=$BACKUP_DIR/exp_${DATE_TAG}.dmp
# 清理舊檔 (保留 7 天)
find $BACKUP_DIR -name "exp_*.dmp" -mtime +7 -exec rm {} \;
find $BACKUP_DIR -name "exp_*.log" -mtime +7 -exec rm {} \;
# 執行 Export (用戶模式)
exp $EXP_USER FILE=$DMP_FILE LOG=$LOG_FILE STATISTICS=NONE
# 檢查回傳碼
if [ $? -ne 0 ]; then
echo "EXPORT FAILED at $(date)" | mail -s "Oracle Export Alert" dba@company.com
exit 1
fi
echo "EXPORT SUCCESS at $(date)" >> $BACKUP_DIR/backup_history.log
chmod 755 ora_backup.sh
tar_backup.sh#!/bin/ksh
# tar_backup.sh - 將 /backup 當日檔案寫入磁帶
. $ORACLE_HOME/ora_env.sh
TAPE_DEV=/dev/rmt/0n # 不倒帶磁帶裝置
BACKUP_DIR=/backup
# 追加寫入 (-r)、顯示進度 (-v)、指定裝置 (-f)
tar -rvf $TAPE_DEV $BACKUP_DIR/exp_$(date +%m%d).dmp $BACKUP_DIR/exp_$(date +%m%d).log
if [ $? -ne 0 ]; then
echo "TAR BACKUP FAILED at $(date)" | mail -s "Oracle Tape Backup Alert" dba@company.com
exit 1
fi
echo "TAPE BACKUP SUCCESS at $(date)" >> $BACKUP_DIR/backup_history.log
參數說明:0n 表示第一台磁帶機、不倒帶;多檔案追加寫入時必須用 n 版裝置名。
.netrc + ftp_backup.sh~oracle/.netrc (權限 600)
machine backup-server.company.com
login oracle
password ********
macdef init
binary
lcd /backup
cd /pub
mput exp_$(date +%m%d).dmp exp_$(date +%m%d).log
bye
chmod 600 ~oracle/.netrc (僅擁有者讀寫,否則 FTP 拒絕使用)。
ftp_backup.sh#!/bin/ksh
# ftp_backup.sh - 呼叫 FTP 自動執行 .netrc 巨集
. $ORACLE_HOME/ora_env.sh
# -i 關閉互動提示,-n 關閉自動登入 (改用 .netrc)
ftp -in backup-server.company.com <> /backup/backup_history.log
以 oracle 用戶登入,執行 crontab -e:
# 分 時 日 月 周 命令
0 23 * * * /u01/app/oracle/ora_backup.sh > /dev/null 2>&1
0 2 * * * /u01/app/oracle/tar_backup.sh > /dev/null 2>&1
0 4 * * * /u01/app/oracle/ftp_backup.sh > /dev/null 2>&1
查看:crontab -l。
imp 還原至測試庫,驗證資料完整性。/backup 保留 7 天,磁帶/FTP 確認成功後可手動刪除較舊檔案釋放空間。BACKUP DEVICE TYPE SBT 整合媒體管理層 (NetBackup, Tivoli, CommVault)。rsync over SSH 或專用複寫軟體,支援斷點續傳、加密、壓縮。systemd timer、Ansible、Oracle Scheduler (DBMS_SCHEDULER) 集中管控。本文提供傳統 UNIX Shell + Export + tar + FTP 的完整自動化備份落地方案,涵蓋環境初始化、日期命名、保留策略、錯誤告警、Crontab 部署。雖技術棧較舊,但邏輯清晰、零額外軟體依賴,適合舊版 Oracle (9i/10g/11g) 且無 RMAN/媒體管理條件的環境。