Files
MathApp/ops/pgbackup/basebackup.sh

31 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
# نسخه‌ی کاملِ روزانه از Postgresِ ۲۴۹، روی ۲۴۷. هفت نسخه‌ی آخر می‌ماند و WALِ قدیمی‌تر از قدیمی‌ترینِ
# آن‌ها پاک می‌شود؛ پس بازیابی تا هر لحظه از هفت روزِ اخیر ممکن است و حجم محدود می‌ماند.
# --checkpoint=spread و --max-rate بار روی ۲۴۹ را کم نگه می‌دارند (آن‌جا سرورِ اصلی است).
# نسخه تا pg_verifybackup قبولش نکند جای قبلی‌ها را نمی‌گیرد و چیزی پاک نمی‌شود.
set -euo pipefail
# ROOT/BIN/PORT از یونیت می‌آیند؛ پیش‌فرض‌ها همان بکاپِ ۲۴۹ است (یونیت‌های zareian-pg216-* برای سرورِ جدید).
ROOT="${PGB_ROOT:-/home/administrator/zareian-pgbackup}"
BIN="${PGB_BIN:-/usr/lib/postgresql/14/bin}"
PORT="${PGB_PORT:-15440}"
KEEP=7
cd "$ROOT"
umask 077
ts=$(date +%Y%m%d-%H%M%S)
rm -rf base/.inprogress-*
tmp="base/.inprogress-$ts"
"$BIN/pg_basebackup" -h 127.0.0.1 -p "$PORT" -U zareian_replicator --no-password \
-D "$tmp" -Fp -X stream --checkpoint=spread --max-rate=20M
"$BIN/pg_verifybackup" "$tmp"
mv "$tmp" "base/$ts"
ls -1d base/2* | head -n -"$KEEP" | xargs -r rm -rf
oldest=$(ls -1d base/2* | head -1)
start_wal=$(sed -n 's/^START WAL LOCATION: .* (file \([0-9A-F]*\))$/\1/p' "$oldest/backup_label")
[ -n "$start_wal" ] || { echo "START WAL در $oldest/backup_label پیدا نشد" >&2; exit 1; }
"$BIN/pg_archivecleanup" wal "$start_wal"
echo "ok base/$ts ($(du -sh "base/$ts" | cut -f1)), kept $(ls -1d base/2* | wc -l), wal since $start_wal ($(du -sh wal | cut -f1))"