• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
记得承诺过
博客园    首页    新随笔    联系   管理    订阅  订阅

pgSQL备份

以下是备份脚本 backup.sh postgres执行
#stgreSQL 生产环境逻辑备份脚本
# 建议配合 WAL 归档(PITR)使用
# ============================================================

set -euo pipefail  # 遇到错误立即退出,未定义变量报错,管道错误传播

# ---------- 配置项 ----------
BACKUP_DIR="/data2/pg_backup"
SAVE_DAYS=30                           # 保留30天,不是7天
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="${BACKUP_DIR}/backup_$(date +%Y%m%d).log"
PG_HOST="127.0.0.1"
PG_PORT="5432"
PG_USER="postgres"

# 业务数据库,多个用空格隔开
DB_NAMES="pms_prod"

# ---------- 初始化 ----------
DAILY_DIR="${BACKUP_DIR}/${DATE}"
mkdir -p "${DAILY_DIR}"

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "${LOG_FILE}"
}

# 错误退出
error_exit() {
    log "ERROR: $*"
    exit 1
}

log "========== 备份开始 =========="
log "备份目录: ${DAILY_DIR}"

# 检查磁盘空间(至少保留20%或5G,防止撑爆磁盘)
AVAIL_KB=$(df -k "${BACKUP_DIR}" | awk 'NR==2 {print $4}')
if [ "${AVAIL_KB}" -lt 5242880 ]; then
    error_exit "备份目录磁盘空间不足,剩余小于5G(当前: $((AVAIL_KB/1024))M)"
fi

# ---------- 1. 全局对象备份(角色、表空间、权限) ----------
# 注意:pg_dumpall --globals-only 只备份角色等全局对象,不备份业务数据,恢复更快
log "备份全局对象(角色/表空间)..."
pg_dumpall --globals-only \
  | gzip > "${DAILY_DIR}/globals_${DATE}.sql.gz" \
  || error_exit "全局对象备份失败"
log "全局对象备份完成"

# ---------- 2. 整实例全量逻辑备份(可选,数据量大建议关掉,只靠 pg_basebackup) ----------
# 如果数据量 < 50G 可以保留,否则建议注释掉,用 pg_basebackup 做物理备份
log "备份整实例..."
pg_dumpall \
  | gzip > "${DAILY_DIR}/pg_all_${DATE}.sql.gz" \
  || error_exit "整实例备份失败"
log "整实例备份完成"

# ---------- 3. 逐个业务库二进制备份(自定义格式,支持单表/单库恢复) ----------
for db in ${DB_NAMES}; do
    log "备份数据库: ${db} ..."
    pg_dump \
      -d "${db}" \
      -Fc -Z6 \
      -f "${DAILY_DIR}/${db}_${DATE}.dump" \
      || error_exit "数据库 ${db} 备份失败"
    
    # 检查备份文件大小(不能为0)
    SIZE=$(stat -c%s "${DAILY_DIR}/${db}_${DATE}.dump")
    if [ "${SIZE}" -lt 1024 ]; then
        error_exit "数据库 ${db} 备份文件异常,大小: ${SIZE} bytes"
    fi
    log "数据库 ${db} 备份完成,大小: $((SIZE/1024/1024))M"
done

# ---------- 4. 清理过期备份 ----------
log "清理 ${SAVE_DAYS} 天前的备份..."
find "${BACKUP_DIR}" -maxdepth 1 -type d -name "20*" -mtime +${SAVE_DAYS} -print -exec rm -rf {} + \
  | tee -a "${LOG_FILE}"

# 清理7天前的日志
find "${BACKUP_DIR}" -maxdepth 1 -name "backup_*.log" -mtime +7 -delete

log "========== 备份完成 =========="

posted @ 2026-07-31 17:25  记得承诺过  阅读(6)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3