بکاپی که بازگردانیاش را تمرین نکردهاید، بکاپ نیست
pg_dump از یک دیتابیس در یک snapshot سازگار خروجی منطقی (دستورهای SQL یا معادل فشردهاش) میگیرد، بدون توقف و بدون قفل کردن نوشتن. برای دیتابیسهای تا چند ده گیگابایت و برای انتقال بین نسخهها و سرورها، ابزار اصلی همین است.
| قالب | گزینه | ویژگی |
|---|---|---|
| plain | -Fp | فایل SQL متنی؛ با psql بازگردانی میشود، انتخابی بازگرداندن سخت است |
| custom | -Fc | فشرده، بازگردانی انتخابی و موازی با pg_restore؛ انتخاب پیشفرض |
| directory | -Fd | یک فایل برای هر جدول؛ تنها قالبی که dump موازی (-j) دارد |
| tar | -Ft | کاربرد کم؛ بدون فشردهسازی و بازگردانی موازی |
# بکاپ روزانه با تاریخ
pg_dump -h localhost -U migrator -d carpet -Fc -Z 6 \
-f /backup/carpet_$(date +%F).dump
# roleها، رمزها و tablespaceها در pg_dump نیستند!
pg_dumpall -h localhost -U postgres --globals-only -f /backup/globals_$(date +%F).sql
# دیتابیس بزرگ: dump موازی با ۴ پروسه
pg_dump -d carpet -Fd -j 4 -f /backup/carpet_dir
بازگردانی
# ۱) roleها روی سرور جدید
psql -U postgres -f /backup/globals_2026-03-10.sql
# ۲) دیتابیس خالی و بازگردانی موازی
createdb -U postgres -O carpet_owner carpet
pg_restore -U postgres -d carpet -j 4 --exit-on-error /backup/carpet_2026-03-10.dump
# فقط یک جدول را از بکاپ برگردانید
pg_restore -d carpet_tmp -t orders /backup/carpet_2026-03-10.dump
# فهرست محتوا، ویرایش و بازگردانی گزینشی
pg_restore -l carpet.dump > toc.list
pg_restore -d carpet -L toc.list carpet.dump
اگر روی سرور مقصد roleهای مبدأ وجود ندارند (مثلاً بازگردانی روی لپتاپ)، --no-owner --no-privileges اشیا را به کاربر بازگرداننده میدهد و خطاهای GRANT را حذف میکند.
آزمودن بکاپ
pg_restore -l /backup/carpet_$(date +%F).dump > /dev/null && echo "فایل سالم است"
# بهتر: بازگردانی کامل هفتگی روی سرور تست و مقایسهی تعداد ردیفها
نکتههایی که کمتر کسی میداند
- همیشه با
pg_dumpنسخهی جدیدتر (برابر نسخهی مقصد) dump بگیرید؛ pg_dump 17 از سرور 12 بکاپ میگیرد، اما pg_dump 12 از سرور 17 امتناع میکند. -jدر pg_restore با--single-transaction(یا -1) سازگار نیست؛ یا موازی، یا اتمی.- بیشتر زمان restore صرف ساخت ایندکسها و قیدهای FK میشود؛
maintenance_work_memبزرگ در سرور مقصد آن را چند برابر سریعتر میکند. - در نسخههای 16 و 17، pg_dump آمار برنامهریز را منتقل نمیکند؛ بلافاصله بعد از restore یک
ANALYZE(یاvacuumdb --analyze-in-stages) بزنید، وگرنه ساعت اول همهی کوئریها پلن بد دارند. - با
--exclude-table-data='factory.loom_sensor_log*'ساختار جدولهای لاگ حجیم را نگه میدارید اما دادهشان را نه؛ بکاپ روزانه چند برابر کوچکتر میشود.