模擬環境:雙 Sun Solaris 主機 (一主一備),使用 Oracle 原生 exp 邏輯備份,結合 .netrc 自動化 FTP 傳輸,crontab 排程實現全自動無人值守異地備份。
exp userid=username/password file=/path/exp_$(date +%m%d).dmp log=/path/exp_$(date +%m%d).log
# 參數說明:
# userid: 必須為第一參數,格式 user/pass[@tns]
# file: 匯出檔路徑 (含日期變數)
# log: 匯出日誌
# 預設模式:FULL=Y (整個資料庫),亦可指定 OWNER= / TABLES=
.netrc 放於執行 ftp 的用戶家目錄 ($HOME/.netrc),權限 600。
machine <備份主機IP>
login oraclebk
password testbk2
macdef init
bin
lcd /export/home/oracle/backup
cd /data/oradata/backup
mput *
bye
macdef init:定義自動執行的巨集 (連線成功後自動跑)。bin:二進位模式傳輸 (dmp 檔必須)。mput *:上傳本地備份目錄所有檔案。# 編輯 oracle 用戶的 crontab
crontab -e
# 內容:
10 23 * * * /export/home/oracle/testbackup.sh # 每日 23:10 執行備份腳本
30 23 * * * ftp -i <備份主機IP> # 每日 23:30 啟動 FTP 傳輸 (讀 .netrc 自動執行)
欄位:分 時 日 月 週 命令。* 表所有值。
testbackup.sh#!/bin/ksh
ORACLE_HOME=/export/home/oracle/815; export ORACLE_HOME
ORACLE_SID=ora815; export ORACLE_SID
# 清空舊備份 (視保留策略調整)
rm -f /export/home/oracle/backup/*
# 日期變數 (MMDD)
rq=$(date +"%m%d")
# 執行完整匯出
$ORACLE_HOME/bin/exp mistest/test \
file=/export/home/oracle/backup/exp${rq}.dmp \
log=/export/home/oracle/backup/exp${rq}.log
記得 chmod +x testbackup.sh。
| 項目 | 驗證方式 |
|---|---|
| Export 正常 | 手動跑腳本,檢查 .log 無錯誤,.dmp 大小合理 |
| .netrc 權限 | ls -l $HOME/.netrc → -rw------- (600) |
| FTP 自動化 | 手動 ftp -i 觀察是否自動登入、上傳、離開 |
| Crontab 生效 | crontab -l 確認內容;/var/spool/cron/crontabs/oracle 存在 |
| 備份主機磁碟空間 | 預留 ≥ 3 倍單次備份大小,配合輪替刪除腳本 |
| 網路連通性 | 主機互 Ping、FTP 埠 (21) 通、防火牆放行 |
sftp/scp (SSH Key 認證) 或 ftp over SSL/TLS。imp 還原測試 (或 RMAN VALIDATE),確保可用性。EXP-/ORA- 觸發告警。YYYYMMDD,配合 find /backup -mtime +7 -delete 自動清理。以 Oracle 內建工具 + OS 原生排程/傳輸,零授權成本即可建立可靠的異地自動備份。關鍵在於 .netrc 實現 FTP 全自動化、crontab 定時觸發、完整的驗證與監控閉環。隨業務增長,建議平滑升級至 RMAN + Data Guard 架構,獲得更強的 RPO/RTO 保證。