PG数据库 Docker 容器自动备份方案

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 天的备份"
相关推荐
catino20 分钟前
SQL调优
数据库·sql
flytalei23 分钟前
GitOps 实战:基于 Argo CD 的 Kubernetes 应用版本回滚
云原生·容器·kubernetes
猫咪很可爱26 分钟前
Oracle Data Pump 导入报错 ORA-02375:字符集不一致问题分析与处理
数据库·oracle
java1234_小锋36 分钟前
MySQL 宣布正式拥抱 AI
数据库·人工智能·mysql
SabrinaW71139 分钟前
基于 C++17 与 RTTR 的注册式对象工厂:配置驱动的动态对象创建
java·前端·数据库
pirateeee43 分钟前
在ubuntu中通过 docker 搭建 yocto 开发环境
ubuntu·docker·eureka
墨神谕1 小时前
Docker 数据卷(Volume)详解:Dockerfile 声明、Docker Compose 挂载宿主机目录及持久化实战
运维·docker·容器
NineData1 小时前
MySQL 迁移到 OceanBase 怎么做?NineData 全量迁移、CDC 实时同步与数据校验指南
数据库·mysql·oceanbase
zh73141 小时前
Docker Desktop docker_data.vhdx 使用时间长了过大,解决办法
运维·docker·容器
standxy1 小时前
索引设计实战:pgvector HNSW × JSONB GIN × 复合索引
数据库·开发