PostgreSQL: النسخ الاحتياطي والاستعادة والتوفر العالي في…

آخر تحديث: 2026-08-26

1. ما ستتعلمه


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

BASH
# تنسيق مخصص (موصى به، مضغوط، استعادة متوازية ممكنة)
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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

(2) ▶ مثال: نسخ احتياطي لجداول محددة مع pg_dump

BASH
# نسخ احتياطي لجدولي 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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

(2) pg_dumpall مقابل pg_dump

البعد pg_dump pg_dumpall
نطاق النسخ الاحتياطي قاعدة بيانات واحدة المجموعة الكاملة (جميع قواعد البيانات)
معلومات الأدوار غير مضمنة تتضمن تعريفات الأدوار/مساحات الجداول
تنسيق الإخراج -Fc/-Fd/-Fp اختياري SQL عادي فقط (-Fp)
متوازي مدعوم (-j) غير مدعوم
السيناريو الموصى به نسخ احتياطي يومي لقاعدة واحدة نسخ احتياطي للأدوار + ترحيل المجموعة الكاملة

(3) ▶ مثال: نسخ احتياطي للمجموعة الكاملة مع pg_dumpall

BASH
# نسخ احتياطي لجميع قواعد البيانات والأدوار (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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

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

BASH
# استعادة إلى قاعدة بيانات جديدة
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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

(5) ▶ مثال: استعادة انتقائية

BASH
# سرد محتويات الأرشيف للعثور على أرقام إدخالات الجدول
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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

(2) pg_restore مقابل psql < file.sql

البعد pg_restore psql < file.sql
تنسيق الإدخال -Fc / -Fd نص SQL عادي
متوازي مدعوم (-j) غير مدعوم
استعادة انتقائية مدعومة (-t / --list) غير مدعومة
تنظيف البيانات القديمة --clean يجب كتابة DROP يدويًا
السيناريو الموصى به تنسيق مخصص / دليل مخرجات pg_dumpall

(6) ▶ مثال: استعادة من SQL عادي

BASH
# استعادة من مخرجات 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:

TEXT 📖 للعرض فقط
# تم تنفيذ أمر psql بنجاح

5. المفهوم: COPY استيراد/تصدير

(1) COPY مقابل \copy

الأمر ينفذ عند الوصول إلى الملف الصلاحية المطلوبة
COPY (SQL) جانب الخادم يقرأ نظام ملفات الخادم مستخدم مميز
\copy (psql) جانب العميل يقرأ ملف العميل مستخدم عادي

(7) ▶ مثال: تصدير إلى CSV مع COPY

SQL
-- تصدير إلى 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:

TEXT 📖 للعرض فقط
 id | name     | value 
----+----------+-------
  1 | example  | 42
(1 row)

(8) ▶ مثال: استيراد CSV مع COPY

SQL
-- استيراد من 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:

TEXT 📖 للعرض فقط
-- تم تنفيذ عبارة SQL بنجاح

(2) خيارات تنسيق COPY

الخيار القيمة الوصف
FORMAT csv / text / binary تنسيق الإخراج
HEADER true / false الصف الأول هو أسماء الأعمدة
DELIMITER ',' / '\t' الفاصل (فاصلة افتراضيًا لـ csv)
QUOTE '"' حرف الاقتباس
NULL '' السلسلة التي تمثل NULL
ENCODING 'UTF8' ترميز الملف

(9) ▶ مثال: تصدير/استيراد بتنسيق ثنائي

SQL
-- تصدير ثنائي (أسرع، أصغر)
COPY orders TO '/tmp/orders.bin' WITH (FORMAT binary);

-- استيراد ثنائي
COPY orders FROM '/tmp/orders.bin' WITH (FORMAT binary);

Output:

TEXT 📖 للعرض فقط
-- تم تنفيذ عبارة SQL بنجاح

6. المفهوم: WAL و PITR

(1) مبدأ WAL (سجل الكتابة المسبقة)

WAL هو الآلية الأساسية التي تضمن PG سلامة البيانات وتدعم الاستعادة.

100%
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

BASH
# إعدادات 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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

▶ مثال: pg_basebackup نسخ احتياطي مادي أساسي

BASH
# نسخ احتياطي مادي كامل (أساس 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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

(11) ▶ مثال: PITR استعادة لنقطة زمنية

يستعيد Bob إلى دقيقة واحدة قبل الحذف الخاطئ (2:59 صباحًا):

BASH
# الخطوة 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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

(3) نسخ احتياطي منطقي مقابل مادي مقابل PITR

البعد نسخ منطقي (pg_dump) نسخ مادي (pg_basebackup) PITR
الدقة جدول / قاعدة بيانات المجموعة الكاملة المجموعة الكاملة
دقة الاستعادة لحظة النسخ الاحتياطي لحظة النسخ الاحتياطي أي نقطة زمنية
سرعة الاستعادة بطيئة (SQL صف بصف) سريعة (نسخ ملفات) متوسطة (إعادة تشغيل WAL)
مساحة التخزين صغيرة (مضغوطة) كبيرة (نسخة كاملة) متوسطة (أساسي + أرشيف)
بدون فقدان لا لا نعم
نسخ احتياطي عبر الإنترنت نعم نعم نعم

7. المفهوم: النسخ المتماثل والتوفر العالي

(1) النسخ المتماثل المتدفق مقابل المنطقي

البعد النسخ المتماثل المتدفق النسخ المتماثل المنطقي
مستوى النسخ كتل WAL مادية تغييرات منطقية (INSERT/UPDATE/DELETE)
الدقة المجموعة الكام��ة جدول محدد / منشور
متطلب الإصدا�� يجب أن تتطابق إصدارات الرئيسي والاحتياطي يمكن عبر الإصدارات الر��يسية
نسخ DDL تلقائي لا ينسخ DDL
الهدف قابل للكتابة لا (احتياطي للقراءة فقط) نعم
تخصص PG نسخ منطقي أصلي في PG (10+)

(12) ▶ مثال: تكوين النسخ المتماثل المتدفق

BASH
# على الرئيسي: 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:

TEXT 📖 للعرض فقط
# تم تنفيذ أمر psql بنجاح

(13) ▶ مثال: تكوين النسخ المتماثل المنطقي

SQL
-- على الناشر (قاعدة البيانات المصدر)
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:

TEXT 📖 للعرض فقط
CREATE TABLE

(2) طرق عرض مراقبة النسخ المتماثل

الطريقة الموقع المحتويات
pg_stat_replication الرئيسي حالة جميع الاحتياطيين المتصلين
pg_stat_wal_receiver الاحتياطي حالة استقبال WAL
pg_stat_subscription المشترك حالة اشتراك النسخ المنطقي
pg_replication_slots الرئيسي معلومات فتحة النسخ

(14) ▶ مثال: مراقبة تأخر النسخ المتماثل المتدفق

SQL
-- التحقق من تأخر النسخ على الرئيسي
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:

TEXT 📖 للعرض فقط
 id | name     | value 
----+----------+-------
  1 | example  | 42
(1 row)

8. المفهوم: استراتيجية النسخ الاحتياطي

(1) مقرنة النسخ الكامل + التدريجي

الاستراتيجية ا��طريقة وقت الاستعادة تكلفة التخزين بدون فقدان
كامل منطقي pg_dump مجدول بطيء منخفض لا
كامل مادي pg_basebackup مجدول سريع مرتفع لا
PITR نسخ أساسي + أرشيف WAL متوسط متوسط نعم
نسخ متدفق مزامنة احتياطي في الوقت الفعلي الأسرع مرتفع قريب من الصفر

(15) ▶ مثال: سكريبت نسخ احتياطي آلي

BASH
#!/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:

TEXT 📖 للعرض فقط
# تم تنفيذ الأمر بنجاح

(2) استراتيجية الإنتاج الموصى بها

البيئة الحل الموصى به RPO RTO
التطوير pg_dump يوميًا 24 ساعة ساعات
الاختبار pg_dump + نسخ متدفق دقائق دقائق
الإنتاج PITR + نسخ متدفق قريب من الصفر دقائق
إنتاج حرج PITR + نسخ متدفق + نسخ منطقي صفر ثواني

(16) ▶ مثال: التحقق من سلامة النسخ الاحتياطي

BASH
# التحقق من أن نسخة 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:

TEXT 📖 للعرض فقط
# تم تنفيذ أمر psql بنجاح

9. مخطط التدفق: قرار النسخ الاحتياطي/الاستعادة

100%
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 صباحًا:

SQL
-- الخطوة 1: تأكيد وقت الحادث وفقدان البيانات
SELECT pg_current_wal_lsn();  -- تسجيل LSN الحالي
SELECT COUNT(*) FROM products WHERE category = 'Electronics';  -- التحقق من الفقدان

-- الخطوة 2: التحقق من أن أرشيف WAL يحتوي على المقاطع المطلوبة
SELECT pg_last_archive_lsn();
-- يجب أن يكون >= LSN في 02:59 صباحًا
BASH
# الخطوة 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';"
SQL
-- الخطوة 10: بعد الاستعادة الناجحة، أخذ نسخة احتياطية جديدة
-- تشغيل في psql بعد التحقق من سلامة البيانات
SELECT pg_switch_wal();  -- فرض تبديل WAL لنقطة أرشيف نظيفة
BASH
# الخطوة 11: أخذ نسخة احتياطية أساسية جديدة لـ PITR المستقبلي
pg_basebackup -h localhost -U postgres \
  -D /backup/base_$(date +%Y%m%d) -Ft -z -P

❓ أسئلة شائعة

س هل يقفل pg_dump الجدول عند النسخ الاحتياطي؟
ج يستخدم pg_dump لقطة (MVCC)، لذا لا يقفل الجداول ولا يحجب القراءة/الكتابة. لكنه ينسخ لقطة البيانات في لحظة البداية؛ البيانات الجديدة المكتوبة أثناء النسخ الاحتياطي غير مضمنة.
س هل يمكن لـ PITR الاستعادة إلى ما قبل حذف صف واحد مباشرة؟
ج نعم، طالما أن أرشيف WAL يغطي تلك الفترة الزمنية. أدق دقة لـ PITR هي مستوى المعاملة — يمكن لـ recovery_target_xid تحديد معاملة معينة. لكن لا يمكنك تخطي بعض المعاملات والتراجع عن عمليات محددة فقط.
س هل يمكن حذف ملفات أرشيف WAL؟
ج يمكن حذف WAL الذي تجاوز نقطة التحقق ولم يعد مطلوبًا من قبل احتياطي. لكن استعادة PITR تحتاج جميع مقاطع WAL من النسخ الاحتياطي الأساسي إلى الوقت المستهدف، لذا تأكد من عدم الحاجة إليها قبل الحذف.
س هل يمكن للاحتياطي في النسخ المتدفق خدمة استعلامات القراءة؟
ج نعم. مع hot_standby = on، يقبل الاحتياطي استعلامات القراءة فقط (SELECT)، ويسمى "نسخة قراءة"، وهو جيد لتخفيف حمل الاستعلامات التحليلية.
س هل يمكن للنسخ المنطقي عبور إصدارات PostgreSQL؟
ج نعم. يرسل النسخ المنطقي تغييرات منطقية (عمليات SQL)، ولا يعتمد على التنسيق الماد��، لذا يدعم الترقيات والترحيل عبر الإصدارات الرئيسية. هذه ميزة مهمة للنسخ المنطقي في PG.
س أيهما أختار، pg_basebackup أم pg_dump؟
ج اختر pg_basebackup (نسخ مادي) إذا كن�� بحاجة إلى PITR أو استعادة المجموعة الكام��ة؛ اختر pg_dump (نسخ منطقي) للاستعادة الانتقائية أو الترحيل عبر الإصدارات أو تصدير جدول واحد. الإنتاج عادة يستخدم كليهما.
س أيهما أسرع في الاستيراد، COPY أم INSERT؟
ج COPY أسرع بكثير. COPY هي كتابة جماعية برحلة بروتوكول واحدة؛ INSERT يحلل وينفذ صفًا بصف. فضل COPY لاستيراد البيانات الكبيرة؛ INSERT أكثر مرونة للكميات الصغيرة.
س ماذا يعني خطأ pg_restore --list في سكريبت النسخ الاحتياطي؟
ج قد يكون ملف النسخ الاحتياطي تالفًا أو غير مكتمل. --list يقرأ دليل الأرشيف فقط دون تنفيذ الاستعادة، لذا فهو طريقة سريعة للتحقق من سلامة النسخ الاحتياطي. إذا كان تالفًا، استعد من ن��خة احتياطية أخرى.

📖 ملخص


📝 تمارين

  1. ⭐ قم بنسخ احتياطي لقاعدة بيانات shop_db باستخدام pg_dump -Fc، ثم تحقق من سلامة النسخ الاحتياطي باستخدام pg_restore --list، واستعدها إلى قاعدة بيانات shop_db_test.

  2. ⭐⭐ اكتب سكريبت نسخ احتياطي آلي: نسخ احتياطي كامل يومي بـ pg_dump (تنسيق مخصص، مضغوط)، مع الاحتفاظ بـ 7 أيام، والتحقق بـ pg_restore --list بعد النسخ الاحتياطي. أيضًا قم بتصدير جدول orders إلى CSV (مع رأس) باستخدام COPY، مسمى بالتاريخ.

  3. ⭐⭐⭐ قم بتكوين حل PITR كامل: تمكين أرشفة WAL (archive_command إلى دليل محدد)، تشغيل نسخ احتياطي أساسي بـ pg_basebackup، محاكاة حذف البيانات عن طريق الخطأ، ثم الاستعادة إلى نقطة زمنية محددة. سجل LSN ووقت الاستعادة، وتحقق من سلامة البيانات. بالإضافة إلى ذلك، قم بتكوين احتياطي نسخ متدفق وتحقق من أن استعلامات القراءة تعمل.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%