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

Oracle 資料庫異地自動備份實作:Export + FTP + Crontab

     編輯:Oracle 資料庫基礎

方案概覽

針對大型商業應用的異地容災需求,利用 Oracle 原生 `exp` 邏輯導出、標準 `ftp` 傳輸、作業系統 `crontab` 排程,在雙 Sun Solaris 主機 (主庫/備庫) 間建立每日自動化異地備份。全流程無第三方工具依賴,經實測穩定可靠。

核心命令介紹

1. exp - 邏輯導出

exp userid=mistest/test file=/backup/exp_$(date +%m%d).dmp log=/backup/exp_$(date +%m%d).log full=y
  • userid:`username/password`,必為第一參數。
  • file:Dump 檔路徑與名稱,建議含日期標籤。
  • full=y:完整資料庫模式 (需 `EXP_FULL_DATABASE` 權限)。
  • 其他常用:`owner=schema` (Schema 模式)、`tables=tab1,tab2` (表模式)、`consistent=y` (一致性)。

2. ftp - 自動化檔案傳輸 (.netrc)

建立 `$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
  • `machine`:目標主機 IP/主機名。
  • `macdef init`:定義自動執行巨集,連線成功即執行後續指令。
  • `binary`:二進位模式傳輸 (關鍵,ASCII 模式會損壞 Dump)。
  • `mput *`:上傳本地目錄所有檔案。

執行:`ftp -i backup-host.example.com` (`-i` 關閉互動提示)。

3. crontab - 排程自動執行

以 `oracle` 使用者編輯 (`crontab -e`):

# 分 時 日 月 週  命令
10 23 * * * /export/home/oracle/scripts/exp_full.sh
30 23 * * * ftp -i backup-host.example.com
  • 每日 23:10 執行導出腳本,23:30 啟動 FTP 傳輸。
  • 腳本需預先設定環境變數 (`ORACLE_HOME`, `ORACLE_SID`, `NLS_LANG`, `PATH`)。
  • 確認 `/var/spool/cron/crontabs/oracle` 檔案生成,且 `cron.allow` 包含 oracle 使用者。

完整導出腳本範例 (exp_full.sh)

#!/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

關鍵注意事項

  1. 一致性:生產庫務必加 `consistent=y`,確保跨表資料一致 (使用 Undo Segment)。
  2. 字元集:`NLS_LANG` 必須與資料庫字元集一致,避免導入亂碼。
  3. 網路可靠性:FTP 傳輸大檔案易中斷,建議改用 `scp`/`rsync` (SSH 金鑰認證) 或啟用 FTP 續傳 (`reget`)。
  4. 備份驗證:定期在備庫執行 `imp ... show=y` 或 `indexfile=...` 驗證 Dump 完整性;每季演練完整還原。
  5. 磁碟空間:主庫備份目錄需預留至少 2 倍資料庫大小空間 (Dump + 壓縮暫存)。
  6. 權限控管:`.netrc` 必須 `chmod 600`,僅擁有者可讀寫;腳本與日誌目錄權限最小化。

擴充建議

  • 改用 `expdp` (Data Pump) + `DBMS_DATAPUMP` API 實現並行導出、網路模式直傳備庫,無需中間檔案。
  • 引入 `RMAN` 物理備份 + `Data Guard` 實現即時異地容災 (RPO=0)。
  • 備份狀態整合至監控系統 (Zabbix/Prometheus),失敗即時告警。

此方案以標準工具鏈、極低維護成本,滿足中小型 Oracle 環境「每日異地備份」的基礎需求,是 DBA 入門異地容災的經典實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved