針對大型商業應用的異地容災需求,利用 Oracle 原生 `exp` 邏輯導出、標準 `ftp` 傳輸、作業系統 `crontab` 排程,在雙 Sun Solaris 主機 (主庫/備庫) 間建立每日自動化異地備份。全流程無第三方工具依賴,經實測穩定可靠。
exp userid=mistest/test file=/backup/exp_$(date +%m%d).dmp log=/backup/exp_$(date +%m%d).log full=y
建立 `$HOME/.netrc` (權限 `600`),內容:
machine backup-host.example.com
login oracle_bak
password bak_password
macdef init
binary
lcd /export/home/oracle/backup
cd /data/oradata/backup
mput *
bye
執行:`ftp -i backup-host.example.com` (`-i` 關閉互動提示)。
以 `oracle` 使用者編輯 (`crontab -e`):
# 分 時 日 月 週 命令
10 23 * * * /export/home/oracle/scripts/exp_full.sh
30 23 * * * ftp -i backup-host.example.com
#!/bin/ksh
# 環境變數 (crontab 非互動式 Shell 必須重新載入)
export ORACLE_HOME=/export/home/oracle/815
export ORACLE_SID=ora815
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
BACKUP_DIR=/export/home/oracle/backup
LOG_FILE=$BACKUP_DIR/exp_$(date +%Y%m%d).log
DMP_FILE=$BACKUP_DIR/exp_$(date +%Y%m%d).dmp
# 清理舊備份 (保留 7 天)
find $BACKUP_DIR -name "exp_*.dmp" -mtime +7 -delete
find $BACKUP_DIR -name "exp_*.log" -mtime +7 -delete
# 執行導出
exp mistest/test file=$DMP_FILE log=$LOG_FILE full=y consistent=y buffer=10485760
# 檢查返回碼
if [ $? -ne 0 ]; then
echo "$(date) EXPORT FAILED" >> $BACKUP_DIR/backup_status.log
exit 1
fi
echo "$(date) EXPORT SUCCESS" >> $BACKUP_DIR/backup_status.log
exit 0
此方案以標準工具鏈、極低維護成本,滿足中小型 Oracle 環境「每日異地備份」的基礎需求,是 DBA 入門異地容災的經典實作。