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 "========== 备份完成 =========="
#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 "========== 备份完成 =========="
浙公网安备 33010602011771号