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 天的备份"
相关推荐
l1t1 小时前
DeepSeek 4.1总结的Tom Lane 谈塑造 Postgres 三十年历程的架构决策
开发语言·数据库·postgresql·架构
星云API|微信接口开发2 小时前
企业微信二次开发实战笔记:如何用在线调试快速验证接口功能
数据库·笔记·企业微信
kuroomi3 小时前
Docker 与容器基础
linux·运维·docker
梦梦代码精7 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠8 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
samson_www8 小时前
Oracle数据泵拷贝表空间
数据库·dba
_itgo9 小时前
意图识别落地方案
运维·docker·容器
呆萌很9 小时前
MySQL 8.4 LTS 完整安装教程
数据库·mysql
天空'之城9 小时前
单片机基础核心知识点汇总(三十三)
数据库·单片机·嵌入式硬件
爱吃苹果的日记本11 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#