場景需求
- 源目錄:
/backup/oracledata/ts
- 本地備份目錄:
/backup/oracledata/tsbak
- 備份文件名:
TianShan_YYYYMMDD.tar.gz
- 保留策略:本地與遠程 FTP 僅保留最近 7 天備份。
- FTP 服務器:
192.168.148.121,用戶 dell,密碼 123,遠程目錄 /oraclebackup。
完整備份腳本 tianshanftp.sh
#!/bin/bash
# 配置區
FTP_IP="192.168.148.121"
FTP_USER="dell"
FTP_PASS="123"
FTP_BACKUP_DIR="/oraclebackup"
BK_DR="/backup/oracledata/tsbak"
DB_DR="/backup/oracledata/ts"
DAYS=7
LINUX_USER="root"
DATE=$(date +%Y%m%d)
DEL_DATE=$(date -d "-${DAYS} day" +%Y%m%d)
# 1. 打包壓縮
tar zcf "${BK_DR}/TianShan${DATE}.tar.gz" -C "${DB_DR}" .
# 2. 修正權限
chown -R "${LINUX_USER}:${LINUX_USER}" "${BK_DR}"
# 3. 本地清理舊備份
find "${BK_DR}" -name "TianShan*.tar.gz" -type f -mtime +${DAYS} -exec rm -f {} \;
# 4. FTP 上傳並清理遠程舊備份
ftp -n -v "${FTP_IP}" << EOF
user ${FTP_USER} ${FTP_PASS}
binary
cd ${FTP_BACKUP_DIR}
lcd ${BK_DR}
put TianShan${DATE}.tar.gz
delete TianShan${DEL_DATE}.tar.gz
bye
EOF
關鍵點解析
tar zcf:z gzip 壓縮,c 創建,f 文件。-C 切換目錄避免絕對路徑包含在壓縮包中。
find ... -mtime +7:修改時間超過 7 天 (即 8 天前) 的文件。-exec rm -f {} \; 安全刪除。
ftp -n:禁用自動登錄;-v 顯示過程。Here Document (<< EOF) 非交互式批量發送命令。
date -d "-7 day":GNU date 計算 7 天前日期,兼容性良好。
部署定時任務
# 1. 賦予執行權限
chmod +x /backup/oracledata/tsbak/tianshanftp.sh
# 2. 編輯 crontab (root)
crontab -e
# 每天凌晨 2:05 執行,日志輸出至文件
5 2 * * * /backup/oracledata/tsbak/tianshanftp.sh >> /backup/oracledata/tsbak/mylog.log 2>&1
# 3. 重啟 cron 服務 (如有修改系統級 crontab)
systemctl restart crond
恢復操作
# 解壓指定日期備份
tar zxf TianShan20240409.tar.gz -C /restore/target/path
健壯性增強建議
- 檢查
tar 返回碼,失敗時發送告警郵件/微信。
- FTP 命令檢查返回碼,或改用
lftp/curl 支持錯誤處理。
- 遠程目錄不存在時自動創建:
mkdir -p ${FTP_BACKUP_DIR} (需 FTP 寫權限)。
- 考慮使用
rsync over ssh 替代 FTP,支持增量、斷點續傳、加密。