0Pricing
SQL Academy · درس

الاسترداد إلى نقطة زمنية

استعد البيانات إلى أي لحظة باستخدام WAL

الاسترداد إلى نقطة زمنية درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما الاسترداد إلى نقطة زمنية؟

يتيح الاسترداد إلى نقطة زمنية (PITR) استعادة قاعدة البيانات إلى أي لحظة محددة في الماضي، وليس فقط إلى وقت آخر لقطة احتياطية.

وهذا ممكن لأن PostgreSQL يكتب باستمرار كل تغيير إلى تدفق يُسمى سجل الكتابة المسبقة (WAL). ومن خلال إعادة تشغيل سجلات WAL فوق نسخة احتياطية أساسية، يمكن الوصول بدقة إلى النقطة المطلوبة.

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

تُكتب كل عبارة INSERT وUPDATE وDELETE وDDL أولًا في WAL قبل أن تمس ملفات البيانات الفعلية. ويضمن ذلك المتانة حتى إذا تعطل الخادم أثناء عملية الكتابة.

بالنسبة إلى PITR، تمثل مقاطع WAL المؤرشفة أشرطة آلة الزمن. فالنسخة الاحتياطية الأساسية هي نقطة البداية، بينما يملأ WAL كل ما حدث بعدها.

-- Check current WAL write location
SELECT pg_current_wal_lsn() AS current_lsn,
       pg_walfile_name(pg_current_wal_lsn()) AS current_wal_file;

تفعيل أرشفة WAL

قبل أن يصبح PITR ممكنًا، يجب تشغيل أرشفة WAL في postgresql.conf. والمعلمات الأساسية هي wal_level وarchive_mode وarchive_command.

ينسخ أمر الأرشفة كل مقطع WAL مكتمل إلى موقع آمن، مثل دليل محلي أو نقطة تحميل NFS أو حاوية تخزين سحابية.

-- View current WAL and archive settings
SELECT name, setting, unit
FROM   pg_settings
WHERE  name IN (
  'wal_level',
  'archive_mode',
  'archive_command',
  'archive_status'
)
ORDER  BY name;

إنشاء نسخة احتياطية أساسية

النسخة الاحتياطية الأساسية هي نسخة متسقة من دليل البيانات بأكمله، تُنشأ أثناء تشغيل الخادم. ويوفر PostgreSQL الأداة pg_basebackup ودوال SQL منخفضة المستوى لتنسيق هذه العملية.

تشكل النسخة الاحتياطية، مقترنةً بمقاطع WAL المؤرشفة المسجلة منذ وقت بدء النسخ الاحتياطي، كل ما يلزم للاسترداد إلى نقطة زمنية.

-- Check the latest base backup information
SELECT backup_start,
       backup_end,
       pg_size_pretty(backup_total) AS total_size
FROM   pg_stat_basebackup;

تحديد وقت هدف الاسترداد

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

غالبًا ما تحتوي جداول سجل المعاملات أو سجلات التطبيق على هذا الطابع الزمني. ويسجل WAL نفسه طوابع زمنية للالتزام عند تشغيل track_commit_timestamp.

-- Find the commit timestamp of recent transactions (requires track_commit_timestamp=on)
SELECT xid,
       pg_xact_commit_timestamp(xid::xid) AS committed_at
FROM   pg_stat_activity
WHERE  state = 'idle'
LIMIT  10;

معلمات recovery.conf / recovery

تتحكم في سلوك الاسترداد معلمات توضع في postgresql.conf (في PostgreSQL 12+) أو في الملف الأقدم recovery.conf. وأهم هذه المعلمات هي:

  • restore_command — كيفية جلب مقاطع WAL المؤرشفة
  • recovery_target_time — الطابع الزمني الدقيق الذي يجب التوقف عنده
  • recovery_target_action — الإجراء الذي يجب تنفيذه عند الوصول إلى الهدف (promote أو pause أو shutdown)
-- Inspect recovery settings that are currently active
SELECT name, setting
FROM   pg_settings
WHERE  name IN (
  'restore_command',
  'recovery_target_time',
  'recovery_target_action',
  'recovery_target_inclusive'
)
ORDER  BY name;

أنواع أخرى من أهداف الاستعادة

الوقت ليس الطريقة الوحيدة لتحديد هدف الاستعادة. يدعم PostgreSQL أربعة أنواع من الأهداف:

  • recovery_target_time — سلسلة نصية تمثل طابعًا زمنيًا
  • recovery_target_xid — معرّف معاملة محدد
  • recovery_target_lsn — رقم تسلسل سجل WAL
  • recovery_target_name — نقطة استعادة مسماة أُنشئت باستخدام pg_create_restore_point()
-- Create a named restore point before a risky migration
SELECT pg_create_restore_point('before_migration_2024_07_01') AS restore_lsn;

محاكاة الكارثة

للتدرّب على PITR في بيئة اختبار، أفسد البيانات أو احذفها عمدًا بعد تسجيل الوقت الحالي. يتيح لك ذلك التحقق من وصول الاستعادة إلى اللحظة الصحيحة ومن عودة الصفوف المحذوفة.

-- Record the 'safe' timestamp, then simulate an accident
SELECT now() AS safe_point;

-- (In a test DB only!) accidentally delete important rows
DELETE FROM orders WHERE created_at < '2024-01-01';

-- Confirm the damage
SELECT COUNT(*) AS remaining_orders FROM orders;

تنفيذ الاستعادة

تتضمن الاستعادة ثلاث خطوات:

  1. أوقف مثيل PostgreSQL قيد التشغيل.
  2. استعد النسخة الاحتياطية الأساسية إلى دليل البيانات.
  3. اضبط معلمات الاستعادة وشغّل PostgreSQL في وضع الاستعادة — إذ يعيد تشغيل WAL حتى يصل إلى الوقت المستهدف، ثم يرقّي نفسه إلى خادم عادي قابل للقراءة والكتابة.

تُظهر سجلات الخادم كل ملف WAL يتم تطبيقه، مما يسهّل متابعة التقدم.

-- After recovery completes, confirm the cluster is no longer in recovery
SELECT pg_is_in_recovery() AS in_recovery,
       pg_last_xact_replay_timestamp() AS last_replayed_txn;

التحقق من الاستعادة

بعد ترقية الخادم، تحقّق من أن البيانات في الحالة المتوقعة. افحص أعداد الصفوف، والطوابع الزمنية لأحدث الصفوف، وأي قيم مهمة للأعمال.

من الحكمة تشغيل استعلامات التحقق هذه قبل السماح بعودة حركة مرور التطبيق، حتى تتمكن من متابعة الاستعادة أو تعديل الوقت المستهدف إذا لزم الأمر.

-- Verify row counts and the latest transaction timestamp after recovery
SELECT 'orders'       AS tbl, COUNT(*) AS rows FROM orders
UNION ALL
SELECT 'order_items'  AS tbl, COUNT(*) AS rows FROM order_items
UNION ALL
SELECT 'customers'    AS tbl, COUNT(*) AS rows FROM customers
ORDER  BY tbl;

أفضل ممارسات PITR

يتطلب إعداد PITR موثوقًا أكثر من مجرد تفعيل الأرشفة. تشمل الممارسات الأساسية ما يلي:

  • اختبر عمليات الاستعادة بانتظام — فالنسخة الاحتياطية التي لم تُختبر ليست نسخة احتياطية.
  • راقب تأخر أرشيف WAL — إذ تجعل الفجوات في WAL المؤرشف الاستعادة الكاملة مستحيلة.
  • احتفظ بسجل WAL كافٍ — أبقِ المقاطع محفوظة إلى تاريخ يسبق أقدم نسخة احتياطية أساسية صالحة على الأقل.
  • استخدم موقع تخزين منفصلًا — فإذا تعطل القرص الأساسي، ستفقد أيضًا WAL المؤرشف المخزن على القرص نفسه.
-- Check for any WAL archiving failures
SELECT archived_count,
       failed_count,
       last_archived_wal,
       last_archived_time,
       last_failed_wal,
       last_failed_time
FROM   pg_stat_archiver;

اختبار سريع

اختبر مدى فهمك للاستعادة إلى نقطة زمنية.

مراجعة: الاستعادة إلى نقطة زمنية

تعلّمت في هذا الدرس كيف يتيح سجل PostgreSQL للكتابة المسبقة (Write-Ahead Log) الاستعادة إلى أي لحظة سابقة:

  • أرشفة WAL تلتقط كل تغيير يحدث بعد إنشاء نسخة احتياطية أساسية.
  • أهداف الاستعادة يمكن أن تكون طابعًا زمنيًا، أو معرّف معاملة، أو LSN، أو نقطة استعادة مسماة.
  • عملية الاستعادة تستعيد النسخة الاحتياطية الأساسية، ثم تعيد تشغيل WAL المؤرشف، وتُجري الترقية عند الوصول إلى الهدف.
  • التحقق يؤكد سلامة البيانات قبل إعادة فتح الخادم أمام حركة المرور.
  • أفضل الممارسات تشمل اختبار الاستعادة بانتظام، ومراقبة الأرشيف، وتخزين WAL خارج الموقع.

يمثل PITR شبكة أمان في مواجهة الأخطاء البشرية وتلف البيانات — أتقنه تتقن التعافي من الكوارث.

الأسئلة الشائعة

هل درس «الاسترداد إلى نقطة زمنية» مجاني؟

نعم — نص درس «الاسترداد إلى نقطة زمنية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «الاسترداد إلى نقطة زمنية»؟

استعد البيانات إلى أي لحظة باستخدام WAL تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الاسترداد إلى نقطة زمنية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. النسخ الاحتياطية المنطقية مقابل الفعلية
  2. الاسترداد إلى نقطة زمنية
  3. اختبار عمليات الاسترداد
  4. التخطيط للتعافي من الكوارث
← العودة إلى SQL Academy