Postgresql数据库自动备份脚本

来源:本站原创 点击数: 发布时间:2025年12月03日

#!/bin/bash


# -------------------------------------------------

# PostgreSQL 定时备份脚本

# 注意:密码明文存储,请严格控制文件权限!

# -------------------------------------------------


# 配置参数

DB_NAME="数据库名称"

DB_USER="数据库用户名"

DB_PASS="数据库密码"      

BACKUP_DIR="备份路径"

PG_DUMP="数据库安装路径 /data/postgresql/bin/pg_dump"

LOG_FILE="$BACKUP_DIR/backup.log"



# 设置 PGPASSWORD 环境变量(pg_dump 会自动读取)

export PGPASSWORD="$DB_PASS"


# 时间戳

TIMESTAMP=$(date +%Y%m%d_%H%M%S)

SQL_FILE="$BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql"

TAR_GZ_FILE="$SQL_FILE.tar.gz"


# 日志函数

log() {

    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"

}


log "开始备份数据库: $DB_NAME"


# 1. 执行 pg_dump 生成 SQL 文件

if ! $PG_DUMP -U "$DB_USER" -d "$DB_NAME" -F p > "$SQL_FILE"; then

    log "❌ pg_dump 失败,无法生成 SQL 文件"

    unset PGPASSWORD

    exit 1

fi


# 2. 使用 tar -zcvf 压缩为 .tar.gz

if ! tar -zcvf "$TAR_GZ_FILE" -C "$BACKUP_DIR" "$(basename "$SQL_FILE")" 2>/dev/null; then

    log "❌ tar 压缩失败"

    rm -f "$SQL_FILE"

    unset PGPASSWORD

    exit 1

fi


# 3. 删除原始 .sql 文件

rm -f "$SQL_FILE"


# 4. 清理敏感信息(立即清除环境变量)

unset PGPASSWORD


log "✅ 备份成功并压缩: $TAR_GZ_FILE"


# 5. 清理 30 天前的备份

log "正在清理 30 天前的旧备份..."

find "$BACKUP_DIR" -type f -name "${DB_NAME}_*.sql.tar.gz" -mtime +30 -delete


COUNT=$(find "$BACKUP_DIR" -type f -name "${DB_NAME}_*.sql.tar.gz" 2>/dev/null | wc -l)

log "🧹 清理完成,当前保留备份数量: $COUNT"


exit 0


保存为postgresql_backup.sh后添加执行权限,通过crontab设置定时任务。