Shell脚本定时备份数据库目录到远程服务器,并保留指定数量的备份
1. 备份需求
Shell脚本每天定时复制数据库目录到远程服务器,但是复制的备份时间都是数据库目录创建的时间,不是执行脚本的时间,那如何保留最近7个备份。
2. 解决方案
核心思路是:在备份时主动为文件或目录打上当前时间戳,然后基于此时间戳实施保留策略。无需依赖文件系统的创建时间,而是通过脚本逻辑来管理。
3. 完整脚本
#!/bin/bash
# 数据库目录备份脚本(解决时间戳问题,保留最近7个备份)# --- 配置参数 ---
BACKUP_SRC="/mnt/postgresql/data" # 请修改为您的数据库实际目录
BACKUP_BASE="/mnt/pg_bak" # 本地备份存放的基目录
REMOTE_SERVER="root@192.168.0.149" # 远程服务器地址
REMOTE_PATH="/data/postgresql_bak_192.168.0.118" # 远程服务器上的备份路径
BACKUP_COUNT=7 # 要保留的备份份数
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="db_backup_${TIMESTAMP}"# --- 开始备份 ---
echo "$(date) 开始备份数据库..."# 创建本地带时间戳的备份目录
mkdir -p "${BACKUP_BASE}/${BACKUP_NAME}"
if [ $? -ne 0 ]; thenecho "错误:无法创建本地备份目录 ${BACKUP_BASE}/${BACKUP_NAME}"exit 1
fi# 复制数据(假设您有权限停止/锁定数据库后再复制,或数据库支持热备)
# 重要:为确保数据一致性,在复制前可能需要暂停数据库写入或使用数据库自带工具创建快照
cp -a "${BACKUP_SRC}"/* "${BACKUP_BASE}/${BACKUP_NAME}/" 2>/dev/null
if [ $? -eq 0 ]; thenecho "本地数据复制完成:${BACKUP_BASE}/${BACKUP_NAME}"
elseecho "错误:数据复制失败,请检查权限和路径"exit 1
fi# --- 同步到远程服务器 ---
echo "开始同步到远程服务器..."
rsync -avz --delete "${BACKUP_BASE}/${BACKUP_NAME}" "${REMOTE_SERVER}:${REMOTE_PATH}/"
if [ $? -eq 0 ]; thenecho "远程同步成功。"
elseecho "警告:远程同步可能存在问题。"
fi# --- 清理旧备份(保留最近7份)---
echo "清理本地旧备份(保留最新的 ${BACKUP_COUNT} 份)..."
cd "${BACKUP_BASE}"
# 列出所有备份目录并按时间倒序排序,删除第8个(含)之后的所有旧备份
ls -dt db_backup_*/ 2>/dev/null | tail -n +$((${BACKUP_COUNT} + 1)) | xargs -I {} rm -rf {}echo "清理远程旧备份..."
ssh "${REMOTE_SERVER}" "cd \"${REMOTE_PATH}\" && ls -dt db_backup_*/ 2>/dev/null | tail -n +$((${BACKUP_COUNT} + 1)) | xargs -I {} rm -rf {}"echo "$(date) 备份流程全部完成。当前备份:${BACKUP_NAME}"
4. 配置定时任务
vim /etc/crontab或
crontab -e