PostgreSQL: النسخ الاحتياطي والاستعادة والتوفر العالي في…
آخر تحديث: 2026-08-26
1. ما ستتعلمه
- pg_dump / pg_dumpall نسخ احتياطي منطقي
- pg_restore استعادة
- أمر COPY استيراد/تصدير (CSV / ثنائي)
- مبدأ WAL (سجل الكتابة المسبقة)
- PITR استعادة لنقطة زمنية (تخصص PG)
- النسخ المتماثل المتدفق
- النسخ المتماثل المنطقي (تخصص PG: نسخ لكل جدول)
- pg_basebackup نسخ احتياطي مادي
- استراتيجية النسخ الاحتياطي: كامل + تدريجي
2. القصة
Bob هو مدير قاعدة بيانات لمنصة تجارة إلكترونية. في الساعة 3 صباحًا، قام مطور بتشغيل DELETE FROM products WHERE category = 'Electronics' عن طريق الخطأ، مما أدى إلى حذف بيانات منتجات بقيمة 2 مليون دولار.
يحتاج Bob للاستعادة إلى حالة الساعة 2:59 صباحًا — قبل دقيقة واحدة من الحذف الخاطئ — بدون فقدان أي بيانات. اختار حل PITR (الاستعادة لنقطة زمنية).
3. المفهوم: النسخ الاحتياطي المنطقي
(1) خيارات pg_dump
| الخيار | المعنى | مثال |
|---|---|---|
-Fc |
تنسيق مخصص (مضغوط، موصى به) | pg_dump -Fc db > db.dump |
-Fd |
تنسيق دليل (نسخ احتياطي متوازي) | pg_dump -Fd db -f dir/ |
-Fp |
نص SQL عادي | pg_dump -Fp db > db.sql |
-j N |
عدد المهام المتوازية (يحتاج -Fd) | pg_dump -Fd db -j 4 -f dir/ |
-t table |
نسخ احتياطي للجدول المحدد فقط | pg_dump -t products db > p.dump |
-n schema |
نسخ احتياطي للمخطط المحدد فقط | pg_dump -n public db > s.dump |
--exclude-table |
استبعاد جدول | pg_dump --exclude-table=logs db > d.dump |
-Z 0-9 |
مستوى الضغط | pg_dump -Fc -Z6 db > db.dump |
(1) ▶ مثال: نسخ احتياطي لقاعدة بيانات واحدة مع pg_dump
# تنسيق مخصص (موصى به، مضغوط، استعادة متوازية ممكنة)
pg_dump -h localhost -U postgres -Fc shop_db > /backup/shop_db_$(date +%Y%m%d).dump
# تنسيق دليل مع 4 عمال متوازيين
pg_dump -h localhost -U postgres -Fd shop_db -j 4 -f /backup/shop_db_dir/
# تنسيق SQL عادي (قابل للقراءة البشرية، قابل للتعديل قبل الاستعادة)
pg_dump -h localhost -U postgres -Fp shop_db > /backup/shop_db.sql
Output:
# تم تنفيذ الأمر بنجاح
(2) ▶ مثال: نسخ احتياطي لجداول محددة مع pg_dump
# نسخ احتياطي لجدولي orders و order_items فقط
pg_dump -h localhost -U postgres -Fc \
-t orders -t order_items \
shop_db > /backup/order_tables.dump
# نسخ احتياطي لجميع الجداول المطابقة للنمط
pg_dump -h localhost -U postgres -Fc \
-t 'order_*' \
shop_db > /backup/order_prefix_tables.dump
# استبعاد جداول السجلات الكبيرة
pg_dump -h localhost -U postgres -Fc \
--exclude-table='access_log_*' \
shop_db > /backup/shop_no_logs.dump
Output:
# تم تنفيذ الأمر بنجاح
(2) pg_dumpall مقابل pg_dump
| البعد | pg_dump | pg_dumpall |
|---|---|---|
| نطاق النسخ الاحتياطي | قاعدة بيانات واحدة | المجموعة الكاملة (جميع قواعد البيانات) |
| معلومات الأدوار | غير مضمنة | تتضمن تعريفات الأدوار/مساحات الجداول |
| تنسيق الإخراج | -Fc/-Fd/-Fp اختياري | SQL عادي فقط (-Fp) |
| متوازي | مدعوم (-j) | غير مدعوم |
| السيناريو الموصى به | نسخ احتياطي يومي لقاعدة واحدة | نسخ احتياطي للأدوار + ترحيل المجموعة الكاملة |
(3) ▶ مثال: نسخ احتياطي للمجموعة الكاملة مع pg_dumpall
# نسخ احتياطي لجميع قواعد البيانات والأدوار (SQL عادي فقط)
pg_dumpall -h localhost -U postgres > /backup/cluster_full_$(date +%Y%m%d).sql
# نسخ احتياطي للأدوار فقط (مفيد للترحيل)
pg_dumpall -h localhost -U postgres --roles-only > /backup/roles_only.sql
# نسخ احتياطي لتعريفات مساحات الجداول فقط
pg_dumpall -h localhost -U postgres --tablespaces-only > /backup/tablespaces.sql
Output:
# تم تنفيذ الأمر بنجاح
4. المفهوم: الاستعادة المنطقية
(1) خيارات pg_restore
| الخيار | المعنى | ينطبق على التنسيق |
|---|---|---|
-d db |
استعادة إلى قاعدة بيانات محددة | -Fc / -Fd |
-j N |
استعادة متوازية | -Fc / -Fd |
--clean |
DROP ثم CREATE أولاً | -Fc / -Fd |
--if-exists |
DROP IF EXISTS (مع --clean) | -Fc / -Fd |
-t table |
استعادة الجدول المحدد فقط | -Fc / -Fd |
--list |
سرد محتويات الأرشيف | -Fc / -Fd |
--section=pre-data |
استعادة ما قبل البيانات (الهيكل) فقط | -Fc / -Fd |
(4) ▶ مثال: استعادة من تنسيق مخصص مع pg_restore
# استعادة إلى قاعدة بيانات جديدة
createdb -h localhost -U postgres shop_db_restore
pg_restore -h localhost -U postgres -d shop_db_restore /backup/shop_db.dump
# استعادة متوازية (4 عمال، تنسيق دليل)
pg_restore -h localhost -U postgres -d shop_db -j 4 /backup/shop_db_dir/
# استعادة مع تنظيف (حذف الكائنات الموجودة أولاً)
pg_restore -h localhost -U postgres -d shop_db \
--clean --if-exists /backup/shop_db.dump
Output:
# تم تنفيذ الأمر بنجاح
(5) ▶ مثال: استعادة انتقائية
# سرد محتويات الأرشيف للعثور على أرقام إدخالات الجدول
pg_restore --list /backup/shop_db.dump
# استعادة جداول محددة فقط بالاسم
pg_restore -h localhost -U postgres -d shop_db \
-t products -t categories \
/backup/shop_db.dump
# استعادة الهيكل فقط (بدون بيانات)
pg_restore -h localhost -U postgres -d shop_db \
--section=pre-data /backup/shop_db.dump
Output:
# تم تنفيذ الأمر بنجاح
(2) pg_restore مقابل psql < file.sql
| البعد | pg_restore | psql < file.sql |
|---|---|---|
| تنسيق الإدخال | -Fc / -Fd | نص SQL عادي |
| متوازي | مدعوم (-j) | غير مدعوم |
| استعادة انتقائية | مدعومة (-t / --list) | غير مدعومة |
| تنظيف البيانات القديمة | --clean | يجب كتابة DROP يدويًا |
| السيناريو الموصى به | تنسيق مخصص / دليل | مخرجات pg_dumpall |
(6) ▶ مثال: استعادة من SQL عادي
# استعادة من مخرجات pg_dumpall
psql -h localhost -U postgres -f /backup/cluster_full_20250601.sql
# استعادة من تنسيق pg_dump العادي
createdb -h localhost -U postgres shop_db_new
psql -h localhost -U postgres -d shop_db_new -f /backup/shop_db.sql
Output:
# تم تنفيذ أمر psql بنجاح
5. المفهوم: COPY استيراد/تصدير
(1) COPY مقابل \copy
| الأمر | ينفذ عند | الوصول إلى الملف | الصلاحية المطلوبة |
|---|---|---|---|
COPY (SQL) |
جانب الخادم | يقرأ نظام ملفات الخادم | مستخدم مميز |
\copy (psql) |
جانب العميل | يقرأ ملف العميل | مستخدم عادي |
(7) ▶ مثال: تصدير إلى CSV مع COPY
-- تصدير إلى CSV مع رأس
COPY (SELECT order_id, customer_id, total_amount, order_date
FROM orders
WHERE order_status = 'completed'
ORDER BY order_date DESC)
TO '/tmp/completed_orders.csv'
WITH (FORMAT csv, HEADER true, DELIMITER ',');
-- تصدير جدول كامل
COPY products TO '/tmp/products.csv' WITH (FORMAT csv, HEADER true);
Output:
id | name | value
----+----------+-------
1 | example | 42
(1 row)
(8) ▶ مثال: استيراد CSV مع COPY
-- استيراد من CSV
COPY products(product_name, unit_price, category, stock_qty)
FROM '/data/new_products.csv'
WITH (FORMAT csv, HEADER true, DELIMITER ',');
-- استيراد مع معالجة الأخطاء (PG 17+)
COPY products(product_name, unit_price, category, stock_qty)
FROM '/data/new_products.csv'
WITH (FORMAT csv, HEADER true, ON_ERROR ignore);
Output:
-- تم تنفيذ عبارة SQL بنجاح
(2) خيارات تنسيق COPY
| الخيار | القيمة | الوصف |
|---|---|---|
| FORMAT | csv / text / binary | تنسيق الإخراج |
| HEADER | true / false | الصف الأول هو أسماء الأعمدة |
| DELIMITER | ',' / '\t' | الفاصل (فاصلة افتراضيًا لـ csv) |
| QUOTE | '"' | حرف الاقتباس |
| NULL | '' | السلسلة التي تمثل NULL |
| ENCODING | 'UTF8' | ترميز الملف |
(9) ▶ مثال: تصدير/استيراد بتنسيق ثنائي
-- تصدير ثنائي (أسرع، أصغر)
COPY orders TO '/tmp/orders.bin' WITH (FORMAT binary);
-- استيراد ثنائي
COPY orders FROM '/tmp/orders.bin' WITH (FORMAT binary);
Output:
-- تم تنفيذ عبارة SQL بنجاح
6. المفهوم: WAL و PITR
(1) مبدأ WAL (سجل الكتابة المسبقة)
WAL هو الآلية الأساسية التي تضمن PG سلامة البيانات وتدعم الاستعادة.
flowchart LR
A[العميل<br/>كتابة] --> B[مخزن WAL<br/>كتابة السجل أولاً]
B --> C[ملف WAL<br/>حفظ على القرص]
B --> D[مخزن مشترك<br/>كتابة البيانات لاحقًا]
D --> E[ملف بيانات<br/>نقطة التحقق تنقل إلى القرص]
style B fill:#ffcdd2
style C fill:#ff8a80
style D fill:#c8e6c9
style E fill:#a5d6a7
| المفهوم | الوصف |
|---|---|
| مقطع WAL | ملف WAL، 16 ميجابايت لكل منها افتراضيًا |
| LSN | رقم تسلسل السجل، يحدد موضع السجل |
| نقطة التحقق | نقل الصفحات المتسخة في الذاكرة إلى القرص، إعادة تدوير WAL |
| wal_level | مستوى تفصيل WAL: replica / logical |
| archive_mode | ما إذا كان سيتم أرشفة ملفات WAL |
| archive_command | أرشفة إلى مسار محدد |
(2) خطوات تكوين PITR
| الخطوة | العملية | الوصف |
|---|---|---|
| 1 | تمكين أرشفة WAL | archive_mode = on |
| 2 | تعيين أمر الأرشفة | archive_command = 'cp %p /archive/%f' |
| 3 | نسخ احتياطي أساسي | pg_basebackup |
| 4 | أرشفة مستمرة | أرشفة ملفات WAL تلقائيًا |
| 5 | استعادة إلى نقطة زمنية | recovery_target_time |
(10) ▶ مثال: تكوين أرشفة WAL
# إعدادات postgresql.conf
cat >> /etc/postgresql/16/main/postgresql.conf << 'EOF'
wal_level = replica
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/archive/%f'
archive_timeout = 300
max_wal_senders = 3
EOF
# إعادة تشغيل PostgreSQL
pg_ctlcluster 16 main restart
Output:
# تم تنفيذ الأمر بنجاح
▶ مثال: pg_basebackup نسخ احتياطي مادي أساسي
# نسخ احتياطي مادي كامل (أساس PITR)
pg_basebackup -h localhost -U replicator \
-D /backup/base_$(date +%Y%m%d) \
-Ft -z -P \
--checkpoint=fast
# -Ft: تنسيق tar
# -z: ضغط gzip
# -P: إظهار التقدم
# --checkpoint=fast: فرض نقطة تحقق قبل النسخ الاحتياطي
Output:
# تم تنفيذ الأمر بنجاح
(11) ▶ مثال: PITR استعادة لنقطة زمنية
يستعيد Bob إلى دقيقة واحدة قبل الحذف الخاطئ (2:59 صباحًا):
# الخطوة 1: إيقاف PostgreSQL
pg_ctlcluster 16 main stop
# الخطوة 2: مسح دليل البيانات الحالي
rm -rf /var/lib/postgresql/16/main/*
# الخطوة 3: استعادة النسخ الاحتياطي الأساسي
tar -xzf /backup/base_20250601/base.tar.gz \
-C /var/lib/postgresql/16/main/
# الخطوة 4: إنشاء تكوين الاستعادة
cat >> /var/lib/postgresql/16/main/postgresql.auto.conf << 'EOF'
restore_command = 'cp /var/lib/postgresql/archive/%f %p'
recovery_target_time = '2025-06-01 02:59:00'
recovery_target_action = 'promote'
EOF
# الخطوة 5: إنشاء ملف▶�شارة الاستعادة
touch /var/lib/postgresql/16/main/recovery.signal
# الخطوة 6: بدء PostgreSQL (سيستعيد إلى الوقت المستهدف)
pg_ctlcluster 16 main start
# سيقوم PostgreSQL بإعادة تشغيل WAL حتى 02:59:00 ثم الترقية
Output:
# تم تنفيذ الأمر بنجاح
(3) نسخ احتياطي منطقي مقابل مادي مقابل PITR
| البعد | نسخ منطقي (pg_dump) | نسخ مادي (pg_basebackup) | PITR |
|---|---|---|---|
| الدقة | جدول / قاعدة بيانات | المجموعة الكاملة | المجموعة الكاملة |
| دقة الاستعادة | لحظة النسخ الاحتياطي | لحظة النسخ الاحتياطي | أي نقطة زمنية |
| سرعة الاستعادة | بطيئة (SQL صف بصف) | سريعة (نسخ ملفات) | متوسطة (إعادة تشغيل WAL) |
| مساحة التخزين | صغيرة (مضغوطة) | كبيرة (نسخة كاملة) | متوسطة (أساسي + أرشيف) |
| بدون فقدان | لا | لا | نعم |
| نسخ احتياطي عبر الإنترنت | نعم | نعم | نعم |
7. المفهوم: النسخ المتماثل والتوفر العالي
(1) النسخ المتماثل المتدفق مقابل المنطقي
| البعد | النسخ المتماثل المتدفق | النسخ المتماثل المنطقي |
|---|---|---|
| مستوى النسخ | كتل WAL مادية | تغييرات منطقية (INSERT/UPDATE/DELETE) |
| الدقة | المجموعة الكام��ة | جدول محدد / منشور |
| متطلب الإصدا�� | يجب أن تتطابق إصدارات الرئيسي والاحتياطي | يمكن عبر الإصدارات الر��يسية |
| نسخ DDL | تلقائي | لا ينسخ DDL |
| الهدف قابل للكتابة | لا (احتياطي للقراءة فقط) | نعم |
| تخصص PG | — | نسخ منطقي أصلي في PG (10+) |
(12) ▶ مثال: تكوين النسخ المتماثل المتدفق
# على الرئيسي: postgresql.conf
wal_level = replica
max_wal_senders = 5
wal_keep_size = '1GB'
# على الرئيسي: pg_hba.conf
echo 'host replication replicator 192.168.1.0/24 md5' >> pg_hba.conf
# على الرئيسي: إنشاء مستخدم نسخ
psql -c "CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'RepP@ss';"
# على الاحتياطي: أخذ نسخ احتياطي أساسي
pg_basebackup -h primary_host -U replicator \
-D /var/lib/postgresql/16/main -Fp -Xs -P -R
# -R: إنشاء standby.signal وتكوين تلقائي
# سيتصل الاحتياطي تلقائيًا بالرئيسي عند بدء التشغيل
Output:
# تم تنفيذ أمر psql بنجاح
(13) ▶ مثال: تكوين النسخ المتماثل المنطقي
-- على الناشر (قاعدة البيانات المصدر)
CREATE PUBLICATION pub_orders FOR TABLE orders, order_items;
-- أو نشر جميع الجداول في مخطط
CREATE PUBLICATION pub_all FOR ALL TABLES;
-- على المشترك (قاعدة البيانات الهدف)
CREATE SUBSCRIPTION sub_orders
CONNECTION 'host=primary_host dbname=shop_db user=replicator password=RepP@ss'
PUBLICATION pub_orders;
-- التحقق من حالة النسخ
SELECT * FROM pg_stat_replication; -- على ا��ناشر
SELECT * FROM pg_stat_subscription; -- على المشترك
Output:
CREATE TABLE
(2) طرق عرض مراقبة النسخ المتماثل
| الطريقة | الموقع | المحتويات |
|---|---|---|
pg_stat_replication |
الرئيسي | حالة جميع الاحتياطيين المتصلين |
pg_stat_wal_receiver |
الاحتياطي | حالة استقبال WAL |
pg_stat_subscription |
المشترك | حالة اشتراك النسخ المنطقي |
pg_replication_slots |
الرئيسي | معلومات فتحة النسخ |
(14) ▶ مثال: مراقبة تأخر النسخ المتماثل المتدفق
-- التحقق من تأخر النسخ على الرئيسي
SELECT
client_addr,
state,
sent_lsn,
write_lsn,
flush_lsn,
replay_lsn,
(sent_lsn - replay_lsn) AS replication_lag
FROM pg_stat_replication;
-- التحقق مما إذا كان الاحتياطي في وضع الاستعادة
SELECT pg_is_in_recovery();
Output:
id | name | value
----+----------+-------
1 | example | 42
(1 row)
8. المفهوم: استراتيجية النسخ الاحتياطي
(1) مقرنة النسخ الكامل + التدريجي
| الاستراتيجية | ا��طريقة | وقت الاستعادة | تكلفة التخزين | بدون فقدان |
|---|---|---|---|---|
| كامل منطقي | pg_dump مجدول | بطيء | منخفض | لا |
| كامل مادي | pg_basebackup مجدول | سريع | مرتفع | لا |
| PITR | نسخ أساسي + أرشيف WAL | متوسط | متوسط | نعم |
| نسخ متدفق | مزامنة احتياطي في الوقت الفعلي | الأسرع | مرتفع | قريب من الصفر |
(15) ▶ مثال: سكريبت نسخ احتياطي آلي
#!/bin/bash
# سكريبت نسخ احتياطي يومي لـ shop_db
BACKUP_DIR="/backup/daily"
DATE=$(date +%Y%m%d_%H%M%S)
RETAIN_DAYS=7
# نسخ احتياطي منطقي كامل (pg_dump تنسيق مخصص)
pg_dump -h localhost -U postgres -Fc -Z6 \
shop_db > ${BACKUP_DIR}/shop_db_${DATE}.dump
# نسخ احتياطي للأدوار بشكل منفصل
pg_dumpall -h localhost -U postgres --roles-only \
> ${BACKUP_DIR}/roles_${DATE}.sql
# تنظيف النسخ الاحتياطية القديمة (الاحتفاظ بـ 7 أيام)
find ${BACKUP_DIR} -name "*.dump" -mtime +${RETAIN_DAYS} -delete
find ${BACKUP_DIR} -name "*.sql" -mtime +${RETAIN_DAYS} -delete
echo "تم إكمال النسخ الاحتياطي: shop_db_${DATE}.dump"
Output:
# تم تنفيذ الأمر بنجاح
(2) استراتيجية الإنتاج الموصى بها
| البيئة | الحل الموصى به | RPO | RTO |
|---|---|---|---|
| التطوير | pg_dump يوميًا | 24 ساعة | ساعات |
| الاختبار | pg_dump + نسخ متدفق | دقائق | دقائق |
| الإنتاج | PITR + نسخ متدفق | قريب من الصفر | دقائق |
| إنتاج حرج | PITR + نسخ متدفق + نسخ منطقي | صفر | ثواني |
(16) ▶ مثال: التحقق من سلامة النسخ الاحتياطي
# التحقق من أن نسخة pg_dump الاحتياطية قابلة للقراءة
pg_restore --list /backup/shop_db.dump > /dev/null
if [ $? -eq 0 ]; then
echo "تم التحقق من النسخ الاحتياطي - سليم"
else
echo "النسخ الاحتياطي تالف - تنبيه فريق العمليات!"
fi
# التحقق من أن أرشيف WAL لا يتأخر
psql -c "SELECT pg_current_wal_lsn(), pg_last_archive_lsn();"
Output:
# تم تنفيذ أمر psql بنجاح
9. مخطط التدفق: قرار النسخ الاحتياطي/الاستعادة
flowchart TD
A[هل تحتاج نسخ احتياطي/استعادة؟] --> B{سيناريو الاستعادة؟}
B -->|جدول/بيانات محذوفة| C{هل لديك نسخ احتياطي منطقي؟}
B -->|تعطل كامل لقاعدة البيانات| D{هل لديك PITR؟}
B -->|ترحيل مخطط| E{حجم البيانات؟}
C -->|نعم| F[pg_restore -t table]
C -->|لا| G{هل لديك احتياطي متدفق؟}
G -->|نعم| H[تصدير من الاحتياطي]
G -->|لا| I[البيانات غير قابلة للاستعادة]
D -->|نعم| J[PITR إلى الوقت المستهدف]
D -->|لا| K[pg_basebackup إلى وقت النسخ▶�لاحتياطي]
E -->|صغير| L[pg_dump/pg_restore]
E -->|كبير| M[pg_basebackup + متدفق]
J --> N{عبر الإصدارات؟}
N -->|نعم| O[ترحيل بالنسخ المنطقي]
N -->|لا| P[استعادة مادية]
style I fill:#ffcdd2
style J fill:#c8e6c9
style O fill:#bbdefb
10. مثال شامل
تدفق استعادة PITR الكامل لـ Bob — استعادة إلى 2:59 صباحًا بعد حذف المنتجات الخاطئ في 3 صباحًا:
-- الخطوة 1: تأكيد وقت الحادث وفقدان البيانات
SELECT pg_current_wal_lsn(); -- تسجيل LSN الحالي
SELECT COUNT(*) FROM products WHERE category = 'Electronics'; -- التحقق من الفقدان
-- الخطوة 2: التحقق من أن أرشيف WAL يحتوي على المقاطع المطلوبة
SELECT pg_last_archive_lsn();
-- يجب أن يكون >= LSN في 02:59 صباحًا
# الخطوة 3: إيقاف PostgreSQL فورًا للحفاظ على الحالة
pg_ctlcluster 16 main stop
# الخطوة 4: الحفاظ على ملفات WAL الحالية (لا تحذف!)
cp -r /var/lib/postgresql/16/main/pg_wal /tmp/pg_wal_backup/
# الخطوة 5: استعادة النسخ الاحتياطي الأساسي
rm -rf /var/lib/postgresql/16/main/*
tar -xzf /backup/base_20250531/base.tar.gz \
-C /var/lib/postgresql/16/main/
# الخطوة 6: نسخ WAL المحفوظ مرة أخرى للاستعادة الكاملة
cp /tmp/pg_wal_backup/* /var/lib/postgresql/16/main/pg_wal/
# الخطوة 7: تكوين هدف PITR
cat >> /var/lib/postgresql/16/main/postgresql.auto.conf << 'EOF'
restore_command = 'cp /var/lib/postgresql/archive/%f %p'
recovery_target_time = '2025-06-01 02:59:00'
recovery_target_action = 'promote'
EOF
touch /var/lib/postgresql/16/main/recovery.signal
# الخطوة 8: بدء التشغيل والتحقق
pg_ctlcluster 16 main start
# الخطوة 9: التحقق من الاستعادة
psql -c "SELECT COUNT(*) FROM products WHERE category = 'Electronics';"
-- الخطوة 10: بعد الاستعادة الناجحة، أخذ نسخة احتياطية جديدة
-- تشغيل في psql بعد التحقق من سلامة البيانات
SELECT pg_switch_wal(); -- فرض تبديل WAL لنقطة أرشيف نظيفة
# الخطوة 11: أخذ نسخة احتياطية أساسية جديدة لـ PITR المستقبلي
pg_basebackup -h localhost -U postgres \
-D /backup/base_$(date +%Y%m%d) -Ft -z -P
❓ أسئلة شائعة
recovery_target_xid تحديد معاملة معينة. لكن لا يمكنك تخطي بعض المعاملات والتراجع عن عمليات محددة فقط.hot_standby = on، يقبل الاحتياطي استعلامات القراءة فقط (SELECT)، ويسمى "نسخة قراءة"، وهو جيد لتخفيف حمل الاستعلامات التحليلية.📖 ملخص
- pg_dump نسخ احتياطي منطقي يدعم تنسيقات مخصص/دليل/SQL عادي؛ تنسيق -Fc المضغوط هو الأكثر شيوعًا
- pg_restore يستعيد من تنسيق مخصص/دليل، يدعم الاستعادة المتوازية والانتقائية وتنظيف --clean
- COPY / \copy استيراد/تصدير سريع لـ CSV؛ COPY يعمل على الخادم، \copy يعمل على العميل
- WAL هو أساس استعادة PG: كتابة السجل قبل البيانات، ضمان استعادة التعطل
- PITR (تخصص PG) يستعيد إلى أي نقطة زمنية عبر نسخ أساسي + أرشيف WAL، محققًا صفر فقدان بيانات
- النسخ المتدفق يزامن WAL المادي في الوقت الفعلي؛ يمكن للاحتياطي العمل كنسخة قراءة
- النسخ المنطقي (تخصص PG) ينسخ على مستوى الجدول، يدعم عبر الإصدارات وهدف قابل للكتابة
- pg_basebackup نسخ احتياطي مادي هو أساس PITR والنسخ المتدفق
- الإنتاج يوصى به PITR + نسخ متدفق، مع فحوصات دورية لسلامة النسخ الاحتياطي
📝 تمارين
-
⭐ قم بنسخ احتياطي لقاعدة بيانات
shop_dbباستخدامpg_dump -Fc، ثم تحقق من سلامة النسخ الاحتياطي باستخدامpg_restore --list، واستعدها إلى قاعدة بياناتshop_db_test. -
⭐⭐ اكتب سكريبت نسخ احتياطي آلي: نسخ احتياطي كامل يومي بـ pg_dump (تنسيق مخصص، مضغوط)، مع الاحتفاظ بـ 7 أيام، والتحقق بـ
pg_restore --listبعد النسخ الاحتياطي. أيضًا قم بتصدير جدولordersإلى CSV (مع رأس) باستخدامCOPY، مسمى بالتاريخ. -
⭐⭐⭐ قم بتكوين حل PITR كامل: تمكين أرشفة WAL (
archive_commandإلى دليل محدد)، تشغيل نسخ احتياطي أساسي بـpg_basebackup، محاكاة حذف البيانات عن طريق الخطأ، ثم الاستعادة إلى نقطة زمنية محددة. سجل LSN ووقت الاستعادة، وتحقق من سلامة البيانات. بالإضافة إلى ذلك، قم بتكوين احتياطي نسخ متدفق وتحقق من أن استعلامات القراءة تعمل.