bash
#!/bin/bash
# ================= 配置区 =================
CONTAINER_NAME="postgres-st-postgis-1"
DB_USER="postgres"
DB_NAME="test_back" # 单库备份时使用
DB_PORT="5432"
BACKUP_DIR="/data/backup/postgres"
DATE=$(date +"%Y%m%d_%H%M%S")
KEEP_DAYS=7
# 备份模式:single | all
BACKUP_MODE="single"
# =========================================
mkdir -p "$BACKUP_DIR"
echo "[$(date)] 开始 PostgreSQL 备份(模式:$BACKUP_MODE)"
if [ "$BACKUP_MODE" = "single" ]; then
# ---------- 单库备份 ----------
BACKUP_FILE="$BACKUP_DIR/pg_${DB_NAME}_${DATE}.dump"
docker exec "$CONTAINER_NAME" \
pg_dump \
-h localhost \
-U "$DB_USER" \
-d "$DB_NAME" \
-p "$DB_PORT" \
-Fc \
-f "/tmp/$(basename "$BACKUP_FILE")"
docker cp "$CONTAINER_NAME:/tmp/$(basename "$BACKUP_FILE")" "$BACKUP_FILE"
docker exec "$CONTAINER_NAME" rm -f "/tmp/$(basename "$BACKUP_FILE")"
elif [ "$BACKUP_MODE" = "all" ]; then
# ---------- 全库备份 ----------
BACKUP_FILE="$BACKUP_DIR/pg_all_${DATE}.sql"
docker exec "$CONTAINER_NAME" \
pg_dumpall \
-U "$DB_USER" \
-p "$DB_PORT" \
> "$BACKUP_FILE"
else
echo "[$(date)] 未知的 BACKUP_MODE:$BACKUP_MODE"
exit 1
fi
# 校验备份结果
if [ $? -eq 0 ] && [ -s "$BACKUP_FILE" ]; then
echo "[$(date)] 备份成功:$BACKUP_FILE"
else
echo "[$(date)] 备份失败"
exit 1
fi
# 清理过期备份
find "$BACKUP_DIR" -type f \( -name "*.dump" -o -name "*.sql" \) -mtime +$KEEP_DAYS -delete
echo "[$(date)] 已清理超过 $KEEP_DAYS 天的备份"