SQLite / المتقدم: التزامن والاسترداد وحدود التطبيق / الدرس 14
النسخ الاحتياطي والاستعادة وأدلة السلامة
صمّم التعافي في SQLite كقدرة مختبرة تجمع نسخة متسقة واستعادة معزولة وفحوص سلامة واعتمادات تطبيق صريحة.
في هذه الصفحة
أهداف الدرس
- تمييز الملف الحي من النسخة الاحتياطية المتسقة.
- استخدام واجهة النسخ الاحتياطي أثناء التشغيل بأمان.
- فحص نسخة مستعادة ومعناها التجاري.
البدء بالفقد المقبول وزمن التعافي
يحدد RPO التعرض المقبول لفقد البيانات، ويحدد RTO المدة المقبولة لاستعادة الخدمة. قد تبدو النسخة اليومية حديثة لكنها تعرض ساعات عمل للفقد. وقد تستعاد القاعدة سريعاً ويفشل التطبيق لغياب إصداره أو امتداد تشفير أو ملف خارجي أو إعداد. احصر وحدة التعافي الكاملة المدعومة.
حدد مالك جدولة النسخ والاحتفاظ والوصول والفحص والاستعادة. لا تحمي نسخة على وسيط التخزين المتعطل نفسه من تعطله. تنقل طبيعة SQLite المضمنة المسؤولية إلى التطبيق أو تصميم النشر ولا تلغيها. التوقيت ونجاح أمر النسخ ملاحظتان مفيدتان، لا إثبات استعادة خدمة أعمال متسقة.
استخدام حد نسخ ينسقه المحرك
تنسخ واجهة النسخ الاحتياطي في SQLite المحتوى عبر اتصالات، وتدعم قواعد الذاكرة والملفات دون افتراض اتساق نسخ ملف حي عادي. تعرضها Python باسم Connection.backup. تحتاج ملكية المصدر والوجهة والاكتمال والخطأ تحديداً مقصوداً. لا تبدأ نسخ مسار تطبيق مضبوط غير مقصود لمجرد سهولة الواجهة.
ينسخ البرنامج الكامل الأول مصدراً مصطنعاً في الذاكرة ثم يغير المصدر. تبقى الوجهة على القيمة المنسوخة السابقة، فيوضح نسخة مستقلة مكتملة لا تعافي انهيار أو ضمان أداء متزامن. يحدد الالتزام التلقائي صراحة حتى لا تجعل معاملة كتابة مصدر غير منتهية المثال ينتظر بلا نهاية.
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(":memory:", isolation_level=None)) as source, \
closing(sqlite3.connect(":memory:", isolation_level=None)) as copy:
source.executescript("CREATE TABLE item(value INTEGER); INSERT INTO item VALUES(2);")
source.backup(copy)
source.execute("UPDATE item SET value=99")
print("source", source.execute("SELECT value FROM item").fetchone()[0])
print("copy", copy.execute("SELECT value FROM item").fetchone()[0])
source 99
copy 2
تحفظ النسخة المكتملة 2 رغم تغير المصدر إلى 99. القاعدتان خاصتان وتغلقان.
الاستعادة إلى هدف منفصل وفحصه
يستخدم البرنامج الثاني مجلداً مؤقتاً خاصاً جديداً للمصدر والنسخة، ثم يستعيد إلى اتصال ذاكرة آخر. يفحص السلامة وقيمة أعمال معروفة، ويغلق المقابض قبل إزالة التخزين المؤقت. لا ينسخ ملف تطبيق حقيقياً أو يستبدله أو يعيد تسميته أو يفتحه. المخرج الفعلي للفحص جزء من المثال المختبر.
ينبغي لتجربة الإنتاج فحص إصدار المخطط واتساق المفاتيح الأجنبية والاستعلامات الممثلة وتوافق التطبيق والنقطة المستعادة. قِس جلب النسخة والاستعادة والتحقق وجاهزية الخدمة معاً. يثبت نجاح تجربة صغيرة معزولة آلية المثال، لا زمن تعافي المؤسسة أو سلامة نسخة مختلفة في مكان آخر.
import sqlite3
from pathlib import Path
from tempfile import TemporaryDirectory
from contextlib import closing
with TemporaryDirectory(prefix="sqlite-backup-training-") as temporary:
folder = Path(temporary)
with closing(sqlite3.connect(folder / "source.db", isolation_level=None)) as source, \
closing(sqlite3.connect(folder / "backup.db", isolation_level=None)) as backup, \
closing(sqlite3.connect(":memory:", isolation_level=None)) as restored:
source.executescript("CREATE TABLE account(id INTEGER PRIMARY KEY,amount INTEGER); INSERT INTO account VALUES(1,42);")
source.backup(backup)
print("backup_check", backup.execute("PRAGMA integrity_check").fetchone()[0])
backup.backup(restored)
print("restored", restored.execute("SELECT amount FROM account WHERE id=1").fetchone()[0])
print("foreign_key_issues", len(restored.execute("PRAGMA foreign_key_check").fetchall()))
backup_check ok
restored 42
foreign_key_issues 0
تنجح النسخة في فحص السلامة المصطنع؛ وتحوي المستعادة 42 ولا تبلغ عن مخالفة مفاتيح أجنبية.
عدم التخلص من الحالة الحية أثناء نسخ الملفات
قد تقيم بيانات معتمدة في WAL لا الملف الرئيسي وحده. لذلك قد ينتج نسخه منفرداً أثناء العمل أصل تعافٍ ناقصاً أو غير متسق. ليس حذف WAL للتنظيف إجراء نسخ احتياطي. اختر الواجهة الموثقة أو لقطة منسقة صحيحاً أو وسيلة نسخة متسقة معتمدة أخرى.
تنشئ VACUUM INTO نسخة مدمجة على الإصدارات الداعمة، بقيودها الخاصة للوجهة والتشغيل. لا تكافئ جدول نسخ عادياً أو أمر استبدال اعتباطياً. راجع السعة وضمانات نظام الملفات وملكية الوجهة ومتطلبات تهدئة التطبيق. لا تضف تنظيفاً مدمراً لجعل مسار المثال قابلاً لإعادة الاستخدام ظاهرياً.
معاملة دليل التلف كحادثة تعافٍ
تفحص integrity_check وquick_check الاتساق البنيوي بكلفة وتغطية مختلفتين، وتعالج foreign_key_check مخالفات العلاقات منفصلة. لا تثبت ok كل ثابت أعمال أو صحة البيانات. عند رصد تلف احفظ الدليل وقيّد الكتابة عبر إجراء الحادثة، وقيّم استعادة نسخة سليمة قبل محاولة استخراج بأفضل جهد.
حقق في التخزين وعيوب الإصدار وسوء استخدام التطبيق والتاريخ الدقيق للملف ومصاحباته. قد تفيد أدوات التعافي ولا تضمن المعنى الأصلي كاملاً أو خصوصية محتوى محذوف مستخرج. لا تسمِّ الملف المنقذ سليماً لمجرد فتحه. وثّق المصدر والطريقة والخسائر أو الشكوك والسلامة ومطابقة حقائق التطبيق.
الأخطاء الشائعة وإصلاحها
فقدان سجلات معتمدة حديثة من نسخة الملف الرئيسي.
- لماذا يحدث؟
- إغفال محتوى WAL الحي من حد النسخ.
- كيف تصلحه؟
- استخدم نسخة متسقة ينسقها المحرك واختبر استعادتها.
- كيف تتجنب تكراره؟
- وثّق نمط السجل وملكية النسخ.
انتظار استدعاء النسخ الاحتياطي بصورة غير متوقعة.
- لماذا يحدث؟
- إغفال حالة معاملات المصدر والوجهة أو التعارض.
- كيف تصلحه؟
- راجع إنهاء المعاملة الصريح وسلوك النسخ الموثق.
- كيف تتجنب تكراره؟
- اختبر واجهة المضيف المحددة ببيانات معزولة.
اعتبار ملف مستعاد قابلاً للفتح صحيحاً تماماً.
- لماذا يحدث؟
- الخلط بين قراءة الملف وصحة البنية والعمل.
- كيف تصلحه؟
- نفذ الفحوص المناسبة وطابق حقائق التطبيق.
- كيف تتجنب تكراره؟
- احفظ تجارب استعادة معزولة مقاسة.
اختبر فهمك
1. تستعاد نسخة سريعاً لكنها تحوي بيانات الأمس. أي هدف قد يفشل؟
اعرض الحل المشروح
قد يفشل هدف نقطة التعافي وفقد البيانات رغم مدة استعادة جيدة. حدد مقدار العمل المعتمد المحمي واختبر المسار من أخذ النسخة إلى استعادتها. لا تقيس السرعة وحدها الفقد المقبول.
2. هل تثبت ok من integrity_check عدم وجود مراجع يتيمة أو أرصدة أعمال خاطئة؟
اعرض الحل المشروح
لا؛ لفحص المفاتيح الأجنبية نطاق مستقل، وتحتاج ثوابت الأعمال مطابقة على مستوى التطبيق. اجمع فحوص البنية والعلاقات وإصدار المخطط وحالات الأعمال الممثلة، ولا تمنح أمراً واحداً كل الضمانات.
أهم ما تعلمته
- النسخة الاحتياطية أصل تعافٍ متسق لا مجرد اسم ملف حديث.
- تفحص تجربة الاستعادة الآلية وجاهزية التطبيق معاً.
- تكمل فحوص البنية والعلاقات والأعمال بعضها.