Postgresql数据库自动备份脚本
#!/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设置定时任务。
