WIUNIX ACADEMY
بازیابی PostgreSQL تا پیش از حذف داده؛ تمرین با pgBackRest
با یک رکورد آزمایشی بررسی کنید که بکاپ و فایلهای WAL واقعاً شما را به لحظهٔ موردنظر میرسانند؛ بازیابی روی سروری جدا انجام میشود و اطلاعات سرویس اصلی جایگزین نمیشود.
محیطت را انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من7 مقدار قابلتغییر
از اینجا شروع کن
در پایان چه چیزی خواهی داشت؟
یک بکاپ مشخص را روی میزبان جدا بازیابی کنید، اجرای WAL را در نقطهٔ نامگذاریشده متوقف کنید و وجود رکوردِ پیش از حذف را بررسی کنید.
سیستمعاملها و نسخههای پوششدادهشده
مسیرهای مستند برای Ubuntu، Debian و خانوادهٔ Red Hat؛ محصول و کلاینت سازگار باید از قبل نصب باشند. محدودیت هر شاخه در گام نخست آمده است. فرمانها هنگام نگارش روی سرویس واقعی اجرا نشدهاند.
قبل از شروع
- کلاستر آزمایشی PostgreSQL 18 با آرشیو WAL سالم، مخزن قابلدسترسی pgBackRest و دیتابیسی که برای ایجاد و حذف دادهٔ آزمایشی مجوز دارد.
- میزبان جدا با همان نسخهٔ اصلی PostgreSQL، افزونههای سازگار و فضای کافی برای بازیابی؛ هیچ برنامهای نباید به آن متصل باشد.
- فایلهای postgresql.conf، pg_hba.conf و pg_ident.conf باید داخل پوشهٔ داده باشند. کلاسترهای معمول Debian و Ubuntu با تنظیمات بیرونی، بدون آمادهسازی جداگانه مشمول این تمرین نیستند.
آیا بکاپ واقعاً قابل بازیابی است؟
تمامشدن کار بکاپ فقط به معنی ساختهشدن نسخهٔ پشتیبان است. برای اطمینان از بازیابی، باید آن نسخه را روی میزبان جدا راهاندازی کنید و ببینید اطلاعات مورد انتظار در آن وجود دارد یا نه. در این تمرین یک رکورد آزمایشی میسازیم و آن را پس از ثبت نقطهٔ بازیابی حذف میکنیم؛ سپس بررسی میکنیم آیا میتوانیم به وضعیت پیش از حذف برگردیم.
دادههای برنامه و پوشهٔ فعال PostgreSQL دستنخورده میمانند. بخش مبدأ روی کلاستر مخصوص تمرین اجرا میشود و بازیابی روی میزبان دیگری انجام میگیرد. این کار با بازگرداندن یک رکورد پایان مییابد؛ بازیابی کامل برنامه، تغییر مسیر کاربران یا ارتقای دیتابیس را ثابت نمیکند.
پیش از کپی، نامها و مسیرهای خودتان را وارد کنید
تنظیمات بالای مطلب را باز کنید و نام stanza، دیتابیس آزمایشی، مسیر باینری و پوشهٔ تازهٔ بازیابی را با محیط خود تطبیق دهید. مسیر بازیابی نباید پوشهٔ دیتای سرویس اصلی باشد. پورت جدا هم بهتنهایی جلوی اتصال برنامهها را نمیگیرد؛ میزبان بازیابی باید از برنامه و کاربران اصلی جدا باشد.
فقط نشانی، نام و مسیر غیرمحرمانه وارد کنید. رمز دیتابیس، کلید مخزن و کلید SSH در این فرم جایی ندارند. مقدارهای فرم در همین تب و برای همین آموزش نگهداری میشوند. پس از انتخاب «اعمال»، متن و فرمانها همزمان بهروز میشوند؛ تا وقتی مقدار نامعتبر یا تغییر اعمالنشده دارید، کپی غیرفعال است.
قدم بعدی
پیش از شروع، مسیر ابزار و محل اجرای فرمانها را بررسی کنید
PostgreSQL نسخهٔ ۱۸ و pgBackRest باید از قبل روی مبدأ آزمایشی و میزبان جداگانهٔ بازیابی نصب باشند. مخزن رسمی PGDG برای Ubuntu نسخههای ۲۶٫۱۰ و ۲۶٫۰۴ و Debian نسخههای ۱۳ و ۱۲ بسته دارد؛ مسیر باینریها /usr/lib/postgresql/18/bin و نام بستهها postgresql-18 و postgresql-client-18 است. در نسخههای فرعیِ تحت پشتیبانی RHEL، Rocky Linux و AlmaLinux از شاخههای ۹ و ۱۰، بستههای PGDG با نام postgresql18-server و postgresql18 و مسیر /usr/pgsql-18/bin عرضه میشوند. انتخاب خانوادهٔ Red Hat، مسیر نسخهٔ بازیابیشده را به /var/lib/pgsql/academy-pitr-20261028 تغییر میدهد؛ هیچ کلاستر یا سرویس موجودی انتخاب یا مقداردهی اولیه نمیشود. مخازن PGDG مخصوص RHEL 9.6 و 10.0 بازنشسته شدهاند؛ از نسخهٔ فرعیِ همچنان تحت پشتیبانی استفاده کنید.
این مسیرها از مستندات استخراج شدهاند و آزمون عملی سازگاری محسوب نمیشوند. ابتدا /etc/os-release و نسخهٔ دقیق محصول را بررسی کنید. حسابها، دسترسی شبکه و اعتبارنامههای محافظتشده باید از قبل آماده باشند. برای آمادهکردن ابزارها، سرویس موجود را دوباره راهاندازی نکنید، دیتابیس تازه مقداردهی اولیه نکنید، پورتی روی فایروال باز نکنید و Python سیستم را تغییر ندهید.
محدودیت مهم: این تمرین فقط کلاستر آزمایشی با postgresql.conf، pg_hba.conf و pg_ident.conf داخل پوشهٔ داده را میپذیرد. کلاستر پیشفرض بستههای Debian و Ubuntu که تنظیماتش بیرون این پوشه است، با تغییر مسیر باینری سازگار نمیشود و در این راهنما پوشش داده نشده است. بررسی گام بعد باید این شرط را پیش از ساخت دادهٔ آزمایشی تأیید کند.
این بررسی را روی هر دو میزبان مبدأ آزمایشی و بازیابی، با حساب PostgreSQL انجام دهید؛ رایانهٔ مدیریتِ فاقد ابزار سرور محل اجرای آن نیست.
روی هر دو میزبان مبدأ آزمایشی و بازیابی، با حساب PostgreSQL
cat /etc/os-release
id
test -x /usr/lib/postgresql/18/bin/psql
/usr/lib/postgresql/18/bin/psql --version
test -x /usr/lib/postgresql/18/bin/pg_ctl
/usr/lib/postgresql/18/bin/pg_ctl --version
pgbackrest version
getent passwd postgresسیستمعامل، مسیر و نسخهٔ ابزار با محیط انتخابی سازگار است؛ در صورت تفاوت، پیش از تغییر داده توقف کنید.
قدم بعدی
مطمئن شوید مخزن به همین کلاستر مربوط است
با کاربر سیستمعامل PostgreSQL روی میزبان مبدأ اجرا کنید. نسخه، شناسهٔ کلاستر و محل واقعی فایلهای تنظیمات را با مخزن تطبیق دهید. وجود یک دیتابیس با نام مشابه کافی نیست؛ شناسهٔ کلاستر باید همان باشد که مخزن برای آن بکاپ دارد. بررسی مسیرها، کلاستر دارای تنظیمات بیرونی را پیش از ایجاد دادهٔ آزمایشی متوقف میکند.
فرمان check آرشیو را بررسی میکند و ممکن است برای این کار رکورد WAL بسازد؛ بنابراین کاملاً فقطخواندنی نیست. اگر آرشیو خاموش است یا check خطا دارد، ابتدا مشکل بکاپ را برطرف کنید. برای ادامهدادن تمرین، برنامهٔ نگهداری بکاپها را تغییر ندهید. نامهای قابلتنظیم این مثال فقط حروف کوچک لاتین، عدد و زیرخط را با آغاز حرف میپذیرند و حداکثر۳۲کاراکترند.
میزبان PostgreSQL مبدأ
for value in 'academy_lab' 'academy_pitr_probe' 'academy_before_change' 'academy'; do
printf '%s\n' "$value" | grep -Eq '^[a-z][a-z0-9_]{0,31}$' || exit 1
done
'/usr/lib/postgresql/18/bin/psql' -X -v ON_ERROR_STOP=1 -d 'academy_lab' -c "SELECT version(); SELECT system_identifier FROM pg_control_system(); SHOW data_directory; SHOW config_file; SHOW hba_file; SHOW ident_file; SHOW archive_mode; SHOW archive_command;"
pgbackrest --stanza='academy' check
pgbackrest --stanza='academy' info
data_dir=$('/usr/lib/postgresql/18/bin/psql' -X -At -d 'academy_lab' -c 'SHOW data_directory')
config=$('/usr/lib/postgresql/18/bin/psql' -X -At -d 'academy_lab' -c 'SHOW config_file')
hba=$('/usr/lib/postgresql/18/bin/psql' -X -At -d 'academy_lab' -c 'SHOW hba_file')
ident=$('/usr/lib/postgresql/18/bin/psql' -X -At -d 'academy_lab' -c 'SHOW ident_file')
test "$config" = "$data_dir/postgresql.conf" && test "$hba" = "$data_dir/pg_hba.conf" && test "$ident" = "$data_dir/pg_ident.conf" || exit 1
نسخه، شناسهٔ کلاستر، مسیر تنظیمات و نتیجهٔ موفق بررسی مخزن را ثبت کردهاید.
قدم بعدی
یک رکورد قابلشناسایی در دیتابیس آزمایشی بسازید
در دیتابیس دورریختنی یک schema تازه و یک جدول کوچک ساخته میشود. اگر نام schema از قبل وجود دارد، اجرا باید متوقف شود؛ آن را حذف یا جایگزین نکنید. ردیف before-change نشانهای است که بعداً باید در نسخهٔ بازیابیشده ببینید.
میزبان PostgreSQL مبدأ
'/usr/lib/postgresql/18/bin/psql' -X -v ON_ERROR_STOP=1 -d 'academy_lab' <<'SQL'
CREATE SCHEMA academy_pitr_probe;
CREATE TABLE academy_pitr_probe.marker (id integer PRIMARY KEY, note text NOT NULL);
INSERT INTO academy_pitr_probe.marker VALUES (1, 'before-change');
SELECT * FROM academy_pitr_probe.marker;
SQLجدول تازه دقیقاً یک ردیف با مقدار before-change دارد.
قدم بعدی
بکاپ کامل بگیرید و برچسب نسخهٔ موفق را ثبت کنید
پیش از ثبت نقطهٔ هدف، از همین کلاستر یک بکاپ کامل بگیرید. این کار روی دیسک و مخزن بار ایجاد میکند؛ ظرفیت و زمان آن باید با مسئول بکاپ هماهنگ باشد. برچسب بکاپ موفق را از خروجی info بردارید و در یادداشت خصوصی تمرین نگه دارید.
هدف بازیابی در مرحلهٔ بعد ساخته میشود و باید پس از پایان همین بکاپ باشد. هنگام بازیابی، همان برچسب را صریح انتخاب میکنیم؛ انتخاب خودکار یک بکاپ جدیدتر ممکن است ما را از لحظهٔ موردنظر جلوتر ببرد.
میزبان PostgreSQL مبدأ
pgbackrest --stanza='academy' --type=full backup
pgbackrest --stanza='academy' infoیک بکاپ کامل موفق با برچسب مشخص، پیش از نقطهٔ هدف، در مخزن ثبت شده است.