ریستور PostgreSQL و انتقال دیتابیس به سرور جدید

برای جابه‌جایی دیتابیس به سرور جدید یا بازگرداندن بکاپ، ابتدا نقش‌ها، سپس دیتابیس و بعد داده‌ها را وارد می‌کنید. ترتیب مراحل اهمیت دارد.

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

۱نصب همان نسخه یا جدیدتر روی سرور مقصد

ریستور به نسخهٔ جدیدتر معمولاً بدون مشکل است، اما به نسخهٔ قدیمی‌تر ممکن نیست. extension هایی که دیتابیس استفاده می‌کند (مثل postgis) را هم نصب کنید.

bash
sudo apt update && sudo apt install -y postgresql postgresql-contrib

۲انتقال نقش‌ها و کاربران

ابتدا فایل globals را که با pg_dumpall --globals-only ساخته‌اید روی مقصد اجرا کنید.

bash
sudo -u postgres psql -f globals.sql

۳ساخت دیتابیس خالی

دیتابیس را با مالک درست بسازید.

bash
sudo -u postgres createdb -O app appdb

۴ریستور فرمت custom

با -j چند رشتهٔ موازی استفاده کنید. --no-owner اگر مالک‌ها در سرور جدید فرق دارند مشکل را حل می‌کند.

bash
sudo -u postgres pg_restore -d appdb -j 4 --no-owner --role=app appdb_2026-09-29.dump

اگر دیتابیس مقصد از قبل داده دارد و --clean را اضافه کنید، اشیاء قبلی حذف می‌شوند.

۵ریستور فایل متنی SQL

فایل‌های .sql را با psql اجرا کنید. --set ON_ERROR_STOP=1 با اولین خطا متوقف می‌شود تا ریستور نیمه‌کاره ناشناخته نماند.

bash
zcat appdb.sql.gz | sudo -u postgres psql -v ON_ERROR_STOP=1 -d appdb

۶انتقال مستقیم بین دو سرور

بدون فایل میانی، خروجی pg_dump را مستقیم به pg_restore سرور مقصد بدهید.

bash
pg_dump -h old-server -U app -Fc appdb | pg_restore -h new-server -U app -d appdb --no-owner

۷به‌روزرسانی آمار و بررسی نهایی

بعد از ریستور، ANALYZE را اجرا کنید تا برنامه‌ریز کوئری آمار درست داشته باشد و تعداد رکوردها را بررسی کنید.

bash
sudo -u postgres psql -d appdb -c "ANALYZE;"
sudo -u postgres psql -d appdb -c "SELECT relname, n_live_tup FROM pg_stat_user_tables ORDER BY n_live_tup DESC LIMIT 10;"

پرسش‌های پرتکرار دربارهٔ ریستور PostgreSQL و انتقال دیتابیس به سرور جدید

خطای «role does not exist» می‌گیرم، چرا؟

کاربر مالک اشیاء در سرور مقصد ساخته نشده. ابتدا فایل globals را اجرا کنید یا از --no-owner در pg_restore استفاده کنید.

خطای extension چطور رفع می‌شود؟

بستهٔ extension را روی سرور مقصد نصب کنید (مثلاً postgresql-16-postgis-3) و سپس دوباره ریستور را اجرا کنید.