بکاپ خودکار PostgreSQL با اسکریپت، cron و حذف بکاپ‌های قدیمی

با یک اسکریپت کوچک و cron بکاپ روزانه از PostgreSQL می‌گیرید و بکاپ‌های قدیمی را خودکار حذف می‌کنید. اسکریپت بکاپ را ابتدا در فایل موقت می‌نویسد تا بکاپ ناقص هرگز به‌عنوان بکاپ معتبر باقی نماند.

دیتابیس و بکاپمتوسط10 دقیقه

۱آماده‌سازی پوشه و دسترسی

پوشهٔ بکاپ را فقط برای root یا کاربر postgres قابل دسترسی کنید.

bash
sudo mkdir -p /var/backups/postgres
sudo chown postgres:postgres /var/backups/postgres
sudo chmod 700 /var/backups/postgres

۲اسکریپت بکاپ

اسکریپت را با کاربر postgres اجرا می‌کنیم تا نیازی به رمز نباشد (احراز هویت peer). همهٔ دیتابیس‌های غیرقالب را جدا بکاپ می‌گیرد.

bash
sudo tee /usr/local/bin/pg-backup.sh > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/var/backups/postgres"
KEEP_DAYS=14
STAMP=$(date +%F_%H-%M)

# نقش‌ها و کاربران
pg_dumpall --globals-only | gzip > "$BACKUP_DIR/globals_${STAMP}.sql.gz"

# هر دیتابیس جداگانه
for DB in $(psql -Atc "SELECT datname FROM pg_database WHERE NOT datistemplate AND datname <> 'postgres'"); do
  OUT="$BACKUP_DIR/${DB}_${STAMP}.dump"
  pg_dump -Fc "$DB" -f "$OUT.tmp"
  mv "$OUT.tmp" "$OUT"
  echo "$(date '+%F %T') OK  $OUT ($(du -h "$OUT" | cut -f1))"
done

find "$BACKUP_DIR" -type f \( -name '*.dump' -o -name 'globals_*.sql.gz' \) -mtime +"$KEEP_DAYS" -delete
EOF
sudo chmod 755 /usr/local/bin/pg-backup.sh

۳تست دستی

با کاربر postgres اسکریپت را یک بار اجرا کنید.

bash
sudo -u postgres /usr/local/bin/pg-backup.sh
ls -lh /var/backups/postgres/

۴زمان‌بندی با cron

cron کاربر postgres را ویرایش کنید تا هر شب اجرا شود.

bash
sudo -u postgres crontab -e

# هر شب ساعت 03:30
30 3 * * * /usr/local/bin/pg-backup.sh >> /var/log/pg-backup.log 2>&1

پیش از آن فایل لاگ را با دسترسی نوشتن برای postgres بسازید: sudo touch /var/log/pg-backup.log && sudo chown postgres /var/log/pg-backup.log

۵ارسال بکاپ به سرور دیگر

بعد از بکاپ، پوشه را به سرور یا فضای ذخیرهٔ دیگری بفرستید تا با خرابی سرور از بین نرود.

bash
rsync -az -e "ssh -i /var/lib/postgresql/.ssh/backup_key" \
  /var/backups/postgres/ backup@203.0.113.20:/srv/backups/postgres/

۶تست ریستور

هر چند وقت یک بکاپ را روی دیتابیس آزمایشی ریستور کنید.

bash
sudo -u postgres createdb restore_test
sudo -u postgres pg_restore -d restore_test /var/backups/postgres/appdb_2026-09-29_03-30.dump
sudo -u postgres psql -d restore_test -c "SELECT count(*) FROM users;"
sudo -u postgres dropdb restore_test

پرسش‌های پرتکرار دربارهٔ بکاپ خودکار PostgreSQL با اسکریپت، cron و حذف بکاپ‌های قدیمی

چرا از کاربر postgres استفاده می‌کنیم؟

PostgreSQL به‌صورت پیش‌فرض کاربر سیستمی postgres را با احراز هویت peer می‌پذیرد و لازم نیست رمز در هیچ فایلی ذخیره شود؛ ساده‌ترین و امن‌ترین روش برای بکاپ محلی است.