فحص سلامة المرفق
عندما يختفي ملف المرفق ولكن يبقى سجل قاعدة البيانات الخاص به، يقوم XenForo بعرض رابط المرفق. يؤدي النقر عليه إلى ظهور خطأ 500 وملء سجل الأخطاء بما يلي:
لا توجد طريقة مدمجة للعثور على هذه الملفات بكميات كبيرة، ولا توجد طريقة للتمييز بين المرفق المفقود فعلاً والمرفق الذي لا يزال ملفه موجودًا في وحدة التخزين تحت مفتاح قديم.
يحدث هذا بعد استعادة قاعدة البيانات، أو ترحيل التخزين، أو فشل مزامنة S3/R2، أو استعادة جزئية للنسخة الاحتياطية، أو سنوات من عمليات الحذف الفاشلة المتراكمة.
ما يفعله
يتم تصنيف كل ملحق على أنه واحد من ثلاثة أشياء:
يُعدّ فحص MD5 أمراً بالغ الأهمية. فإعادة الربط بناءً على اسم الملف فقط قد يؤدي إلى دمج لقطة شاشة لشخص غريب في منشور شخص آخر.
ثلاثة أوضاع
الاستخدام
ضع الملف النصي في مجلد المنتدى الرئيسي، بجوار ملف index.php. ثم:
هذا الخيار للقراءة فقط ولا يُغيّر شيئًا. أما خيار --index فيُجري سردًا متكررًا واحدًا لمساحة التخزين لديك، ويُجيب على كل عملية بحث من الذاكرة - على مساحة تخزين بعيدة، مما يُحوّل حوالي 200,000 رحلة ذهاب وإياب عبر الشبكة إلى حوالي 200 استدعاء لقائمة البيانات.
راجع ملف CSV. ثم ارجع للخلف:
إصلاح دون حذف أي شيء:
إصلاح وتنظيف الصفوف الميتة:
السلامة
يمكن لهذه الأداة حذف صفوف قاعدة البيانات، لذا فهي مبنية على افتراض أنها قد تكون خاطئة.
ما لا يمسه النظام أبدًا: لا يتم تعديل المنشورات والمواضيع.
عندما يختفي ملف المرفق ولكن يبقى سجل قاعدة البيانات الخاص به، يقوم XenForo بعرض رابط المرفق. يؤدي النقر عليه إلى ظهور خطأ 500 وملء سجل الأخطاء بما يلي:
League\Flysystem\FileNotFoundException: File not found at path: attachments/236/236888-0dcb....data
src/XF/Pub/View/Attachment/View.php:27
لا توجد طريقة مدمجة للعثور على هذه الملفات بكميات كبيرة، ولا توجد طريقة للتمييز بين المرفق المفقود فعلاً والمرفق الذي لا يزال ملفه موجودًا في وحدة التخزين تحت مفتاح قديم.
يحدث هذا بعد استعادة قاعدة البيانات، أو ترحيل التخزين، أو فشل مزامنة S3/R2، أو استعادة جزئية للنسخة الاحتياطية، أو سنوات من عمليات الحذف الفاشلة المتراكمة.
ما يفعله
يتم تصنيف كل ملحق على أنه واحد من ثلاثة أشياء:
- حسنًا — الملف موجود بالضبط في المكان الذي يتوقعه XenForo.
- إعادة الربط — الملف مفقود من مساره المتوقع، ولكن يوجد ملفٌ يحمل نفس مُعرّف البيانات (data_id) تحت مفتاح ملف مختلف ، وقيمة MD5 الخاصة به تُطابق قيمة تجزئة الملف المخزنة . عملية التحميل سليمة؛ فقط مؤشر قاعدة البيانات قديم. يمكن إصلاح المشكلة دون فقدان أي بيانات.
- مفقود - لا يوجد ملف على الإطلاق، أو يوجد ملف مرشح لا يتطابق رمز MD5 الخاص به، مما يعني أن المعرّف قد أُعيد استخدامه في عملية تحميل لاحقة وأن هذا الملف يخص شخصًا آخر. لا يمكن استعادة أي شيء.
يُعدّ فحص MD5 أمراً بالغ الأهمية. فإعادة الربط بناءً على اسم الملف فقط قد يؤدي إلى دمج لقطة شاشة لشخص غريب في منشور شخص آخر.
ثلاثة أوضاع
- المسح الضوئي — يتجول في قاعدة البيانات سائلاً "أين الملف؟" ويكتب ملف CSV. للقراءة فقط.
- الملفات اليتيمة - عكس ذلك. تتجول في وحدة التخزين متسائلةً "أي صف يمتلك هذا الملف؟"، لتجد الملفات العالقة نتيجةً لعملية استرجاع قاعدة البيانات والتي لا يمكن للمسح العادي رؤيتها، لأن تلك الصفوف لم تعد موجودة. للقراءة فقط.
- تطبيق - يستهلك ملف CSV الممسوح ضوئياً، ويعيد التحقق من كل صف مقابل وحدة التخزين مرة أخرى، ثم يقوم بالإصلاح. لا يحذف إلا إذا طلبت ذلك صراحةً.
الاستخدام
ضع الملف النصي في مجلد المنتدى الرئيسي، بجوار ملف index.php. ثم:
هذا الخيار للقراءة فقط ولا يُغيّر شيئًا. أما خيار --index فيُجري سردًا متكررًا واحدًا لمساحة التخزين لديك، ويُجيب على كل عملية بحث من الذاكرة - على مساحة تخزين بعيدة، مما يُحوّل حوالي 200,000 رحلة ذهاب وإياب عبر الشبكة إلى حوالي 200 استدعاء لقائمة البيانات.
راجع ملف CSV. ثم ارجع للخلف:
إصلاح دون حذف أي شيء:
إصلاح وتنظيف الصفوف الميتة:
السلامة
يمكن لهذه الأداة حذف صفوف قاعدة البيانات، لذا فهي مبنية على افتراض أنها قد تكون خاطئة.
- لا يقوم المسح الضوئي بالكتابة. أما الحذف فيتطلب عملية منفصلة، وعلامة منفصلة، وملف CSV سبق لك قراءته.
- يتم التحقق من كل صف مرة أخرى مقابل وحدة التخزين الحية مباشرة قبل تعديله. لا يمكن أن يتسبب ملف CSV قديم أو تم تعديله يدويًا في حدوث أي ضرر.
- يؤدي الفهرس الفارغ إلى إيقاف العملية. إذا كان الوصول إلى وحدة التخزين غير ممكن أو كان البادئة خاطئة، فستظهر جميع الصفوف مفقودة. هذا خطأ فادح، ولا يمكن تجاوزه باستخدام خيار --force.
- حماية النسبة. يتم رفض خطة من شأنها حذف أكثر من 20% من جميع المرفقات - هذا النمط يعني وجود خلل في التخزين، وليس فقدان البيانات.
- يقوم خيار "حماية العد" (--max-delete، القيمة الافتراضية 2000) بحظر الخطط الكبيرة بشكل غير متوقع.
- تتم عمليات الحذف من خلال طبقة الكيان ، لذلك يتم الاحتفاظ بعدد المرفقات بواسطة معالج المرفقات الخاص بـ XenForo لكل نوع محتوى، بما في ذلك تلك الموجودة في الإضافات الأخرى.
- يتم رفض الحجج غير المعروفة بدلاً من تجاهلها بصمت.
- لا يمكن كتابة التقارير إلى مسار يمكن الوصول إليه عبر الإنترنت ، فهي تعرض جميع المرفقات الموجودة في منتداك. وتُرسل إلى internal_data/attachment-audit/.
- يرفض التشغيل عبر بروتوكول HTTP.
ما لا يمسه النظام أبدًا: لا يتم تعديل المنشورات والمواضيع.