مهاجرت پایگاه داده یکی از حیاتیترین و پرریسکترین وظایف در مهندسی نرمافزار است. چه در حال ارتقا از نسخه 9.6 به 15 باشید، چه انتقال از سرورهای محلی (on-premise) به زیرساخت ابری مانند AWS RDS، یا جابجایی بین ارائهدهندگان میزبانی، یک مهاجرت ناموفق میتواند منجر به از دست رفتن دادهها و توقف قابل توجه سیستم شود. این راهنما روشهای مطمئنتر برای مهاجرت پایگاه دادههای PostgreSQL را بررسی میکند و تعادلی بین ایمنی، سرعت و حداقل اختلال ایجاد میکند.
انتخاب استراتژی مناسب
قبل از ورود به دنیای دستورات، باید بر اساس میزان تحمل توقف (downtime) و حجم دادهها، استراتژی مناسب را انتخاب کنید. دو رویکرد اصلی پشتیبانگیری و بازیابی منطقی و تکثیر فیزیکی/منطقی هستند.
- پشتیبانگیری منطقی (pg_dump): بهترین گزینه برای پایگاه دادههای کوچک تا متوسط یا زمانی که توقف حداقلی قابل قبول است. این روش دادهها را به صورت فایلهای SQL یا فرمت سفارشی خروجی میدهد.
- تکثیر منطقی: ایدهآل برای پایگاه دادههای بزرگ که نیاز به توقف نزدیک به صفر دارند. این روش تغییرات را تا لحظه جابجایی نهایی به صورت بلادرنگ (real-time) منتقل میکند.
روش 1: استفاده از pg_dump و pg_restore
ابزار pg_dump استاندارد صنعت برای پشتیبانگیری منطقی است. این ابزار آگاه از ساختار (schema-aware) است و میتواند با انواع دادههای پیچیده، توابع و تریگرها سروکار داشته باشد. برای محیطهای تولید، همیشه از فرمت سفارشی (-Fc) استفاده کنید تا امکان بازیابی موازی و بازیابی انتخابی جداول فراهم شود.
گام 1: ایجاد دامپ (Dump)
به پایگاه داده مبدأ متصل شوید و یک آرشیو فشرده با فرمت سفارشی ایجاد کنید.
# دامپ کردن تمام جداول، ساختارها و دادهها
pg_dump -h old-db-host -p 5432 -U postgres -Fc -f production_backup.dump mydb
# برای پایگاه دادههای بزرگ، از کارگران موازی (parallel workers) برای تسریع فرآیند استفاده کنید
pg_dumpall -h old-db-host -p 5432 -U postgres -Fc -f full_cluster_backup.dump
گام 2: انتقال و بازیابی
فایل دامپ را به صورت ایمن با استفاده از scp یا ذخیرهسازی ابری به سرور جدید منتقل کنید. سپس دادهها را در نمونه جدید بازیابی کنید. بازیابی موازی برای عملکرد حیاتی است.
# ایجاد یک پایگاه داده خالی در نمونه جدید
createdb -h new-db-host -U postgres mydb_new
# بازیابی با کارگران موازی
pg_restore -h new-db-host -p 5432 -U postgres -d mydb_new -j 4 --no-owner production_backup.dump
توجه: پرچم --no-owner اطمینان میدهد که کاربر فعلی مالک تمام اشیاء است و از مشکلات مجوز جلوگیری میکند، در صورتی که کاربر اصلی در سرور جدید وجود نداشته باشد.
روش 2: توقف صفر با تکثیر منطقی
برای پایگاه دادههای عظیم که توقف سیستم غیرقابل قبول است، تکثیر منطقی امکان میدهد نمونه جدید همگام با نمونه قدیمی باقی بماند. این روش نیازمند PostgreSQL نسخه 10 یا جدیدتر است.
مراحل پیکربندی
- پایگاه داده مبدأ: بایگانی WAL را فعال کنید یا اطمینان حاصل کنید که مقدار کافی برای
max_wal_sendersتنظیم شده است. - پایگاه داده مقصد: یک اسلات تکثیر (replication slot) ایجاد کنید.
- ایجاد اولیه: برای تنظیم فیزیکی از
pg_basebackupیا برای همگامسازی خالص منطقی از اسلاتهای تکثیر منطقی استفاده کنید.
در سرور مقصد، یک اسلات تکثیر ایجاد کنید تا رکوردهای WAL حفظ شوند:
CREATE REPLICATION SLOT my_rep_slot LOGICAL "pgoutput";
در سرور مبدأ، تمام جداول را برای تکثیر منتشر کنید:
CREATE PUBLICATION my_pub FOR ALL TABLES;
در مقصد، یک اشتراک (subscription) ایجاد کنید تا جریان داده شروع شود:
SUBSCRIBE my_sub TO my_pub
CONNECTION 'host=old-db-host port=5432 user=replicator password=secret'
WITH (copy_data = true);
پس از اینکه اشتراک به روز شد (با بررسی pg_stat_subscription اطمینان حاصل کنید)، میتوانید نوشتنها به پایگاه داده قدیمی را متوقف کنید، جابجایی نهایی را انجام دهید و اشتراک را حذف کنید.
اعتبارسنجی و بهترین روشها
هرگز بدون اعتبارسنجی به یک مهاجرت اعتماد نکنید. پس از بازیابی، کوئریهای چکسام (checksum) را اجرا کنید تا تعداد سطرها و نمونههای دادههای حیاتی را بین مبدأ و مقصد مقایسه کنید.
-- بررسی تعداد سطرهای یک جدول حیاتی
SELECT COUNT(*) FROM orders;
-- بررسی فقدان یکپارچگی کلید خارجی
SELECT COUNT(*) FROM child_table WHERE id NOT IN (SELECT id FROM parent_table);
مهمترین بهترین روشها عبارتند از:
- تست در محیط Staging: همیشه ابتدا مهاجرت را در محیطی شبیه به تولید تمرین کنید.
- پشتیبانگیری قبل از مهاجرت: اطمینان حاصل کنید که قبل از شروع، یک پشتیبان کامل از مبدأ دارید.
- مانیتورینگ I/O دیسک: دامپهای بزرگ میتوانند پهنای باند دیسک را اشباع کنند؛ در صورت استفاده از
pg_dump، برنامهریزی را در ساعات کمترافیک انجام دهید. - سازگاری ساختار (Schema): اگر در حال عبور از نسخههای اصلی هستید (مثلاً از 9.6 به 12)، برای بررسی ویژگیهای منسوخشده از حالت چک
pg_upgradeاستفاده کنید.
نتیجهگیری
انتخاب مسیر مهاجرت مناسب به محدودیتهای خاص شما بستگی دارد. برای اکثر برنامهها، pg_dump با فرمتبندی سفارشی یک راهحل مستحکم و ساده ارائه میدهد. با این حال، برای سیستمهای حیاتی با نیاز به در دسترس بودن بالا، تکثیر منطقی شبکهای ایمن از همگامسازی بلادرنگ فراهم میکند. با دنبال کردن این مراحل و اعتبارسنجی دقیق یکپارچگی دادهها، میتوانید پایگاه دادههای PostgreSQL را با اطمینان و ریسک حداقلی مهاجرت کنید.