بکاپ خودکار PostgreSQL با اسکریپت، cron و حذف بکاپهای قدیمی
با یک اسکریپت کوچک و cron بکاپ روزانه از PostgreSQL میگیرید و بکاپهای قدیمی را خودکار حذف میکنید. اسکریپت بکاپ را ابتدا در فایل موقت مینویسد تا بکاپ ناقص هرگز بهعنوان بکاپ معتبر باقی نماند.
۱آمادهسازی پوشه و دسترسی
پوشهٔ بکاپ را فقط برای root یا کاربر postgres قابل دسترسی کنید.
sudo mkdir -p /var/backups/postgres
sudo chown postgres:postgres /var/backups/postgres
sudo chmod 700 /var/backups/postgres۲اسکریپت بکاپ
اسکریپت را با کاربر postgres اجرا میکنیم تا نیازی به رمز نباشد (احراز هویت peer). همهٔ دیتابیسهای غیرقالب را جدا بکاپ میگیرد.
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 اسکریپت را یک بار اجرا کنید.
sudo -u postgres /usr/local/bin/pg-backup.sh
ls -lh /var/backups/postgres/۴زمانبندی با cron
cron کاربر postgres را ویرایش کنید تا هر شب اجرا شود.
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
۵ارسال بکاپ به سرور دیگر
بعد از بکاپ، پوشه را به سرور یا فضای ذخیرهٔ دیگری بفرستید تا با خرابی سرور از بین نرود.
rsync -az -e "ssh -i /var/lib/postgresql/.ssh/backup_key" \
/var/backups/postgres/ backup@203.0.113.20:/srv/backups/postgres/۶تست ریستور
هر چند وقت یک بکاپ را روی دیتابیس آزمایشی ریستور کنید.
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 میپذیرد و لازم نیست رمز در هیچ فایلی ذخیره شود؛ سادهترین و امنترین روش برای بکاپ محلی است.