التواصل مع الدعم

نردّ عبر البريد الإلكتروني، عادةً خلال يومين.

يفحص Google reCAPTCHA هذا الإرسال للحماية من إساءة الاستخدام؛ وتُرسَل بيانات إلى Google. لا يُحمَّل السكربت إلا عند فتح هذا النموذج.

→ كل المقالات

أين يوجد مخطط قاعدة البيانات فعلًا

كل ما تفعله هذه الخدمة موجود في نظام التحكم بالإصدارات. أو الكود على الأقل. أما قاعدة البيانات التي تعمل عليها فتتألف من 32 جدولًا، و15 منها لا تعريف لها في أي مكان في المستودع — لا CREATE TABLE، ولا ملف مخطط، ولا شيء. ملف التفريغ (dump) يستعيد الجداول الـ32 كلها ببنيتها سليمة؛ أما ما لا يحتويه المستودع فهو نسخة ثانية مستقلة من تلك البنية.

17 جدولًا معرّفًا 15 بلا تعريف في أي مكان 21 فهرسًا يُنشئها الكود 11 في قاعدة البيانات فقط 32 جدولًا، 32 فهرسًا ثانويًا، ملفات مخطط: 0

هذه الأرقام مستمدة من مقارنة قاعدة البيانات الحية بمستودع يضم 736 ملفًا و5,671,710 أحرف. وهي ليست تقديرًا.

كيف يضيع نصف المخطط

ليس الأمر إهمالًا، وهذا ما يجعله جديرًا بالتدوين. فكل خطوة بمفردها كانت معقولة.

الجداول التي أُنشئت قبل وجود قاعدة الكود الحالية لم تُدوَّن قط، لأنها كانت ببساطة موجودة في ذلك الوقت. أما الجداول التي أُضيفت بعد ذلك فجاءت عبر سكربتات ترحيل، وهذه السكربتات موجودة فعلًا في المستودع — ومنها تأتي التعريفات الـ17. والأعمدة التي أُضيفت لاحقًا أُضيفت بسطر ALTER TABLE واحد كُتب في سطر الأوامر، لأن كتابته كانت أسرع من كتابة سكربت لتغيير يستغرق ثانية.

الفهارس هي أسوأ الحالات. يُضاف الفهرس عندما يكون شيء ما بطيئًا، في لحظة بطئه، ويحل المشكلة فورًا. لا يترك خلفه أي أثر، ولا شيء للمراجعة، ولا شيء يفشل عند نسيانه. أحد عشر فهرسًا من الفهارس الثانوية الاثنين والثلاثين هنا موجودة لهذا السبب بالضبط، وغير مسجلة في أي مكان.

والجدول الذي يضم العدادات نفسها، بصفوفه البالغ عددها 166,438، من بين الجداول الخمسة عشر التي لا تعريف لها في المستودع.

ما الذي يتعطل فعلًا

ليس الكثير، حتى لحظة محددة: عند استعادة قاعدة البيانات من ملف تفريغ.

ملف التفريغ يحمل البنية، لذا فالاستعادة المباشرة لا مشكلة فيها. الخطر في أي مسار يعيد بناء جدول بدلًا من استعادته — الانتقال إلى جهاز آخر، أو استيراد جداول مختارة، أو إعادة إنشاء جدول من سكربت. تعود البيانات، ولا تعود الفهارس، بصمت. لا شيء يفشل. والاستعلامات تعيد الإجابات الصحيحة. لكنها تستغرق وقتًا أطول فحسب، والسبب غير مرئي، لأن السجل الوحيد لما كان عليه الفهرس هو الجهاز الذي لم يعد يحتويه.

وهذا هو نمط الإخفاق الذي يستحق التسمية: الفهرس المفقود لا يُنتج خطأً، بل يُنتج إجابة صحيحة أبطأ. ولا يوجد اختبار له، لأن الاختبارات تنجح.

ما نفعله حيال ذلك في الأثناء

المخطط ليس في المستودع اليوم، وهذا هو الوصف الدقيق للوضع. وما هو قائم أضيق من إصلاح كامل، لكنه يغطي الحالة التي تكلّف شيئًا فعلًا:

ملف تفريغ قبل أي عملية مدمّرة، يُحفظ خارج جذر الموقع. واستعادة نُفّذت فعلًا مرة واحدة على الأقل، بدلًا من افتراض نجاحها. وقائمة قصيرة، تُراجَع بعد كل استعادة، بالفهارس المعروف أنها لا توجد إلا في قاعدة البيانات العاملة — لأنه يمكن سؤال الجهاز عن الفهارس الموجودة لديه، ومقارنة الجواب بآخر مرة سُئل فيها.

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

تحديث: سبتمبر 2026

بعد خمسة أيام من نشر هذه التدوينة، أُودع مجلد العمل في المستودع: 26 ملفًا و4,058 سطرًا، من بينها أحد عشر سكربت ترحيل كُتبت بين 28 أغسطس و1 سبتمبر ولم تكن موجودة حتى ذلك الحين إلا على الجهاز العامل. كان ذلك النصف السهل — كود كُتب لكنه لم يُسجَّل قط.

أُعيد القياس في 1 سبتمبر 2026 بالطريقة نفسها: قاعدة البيانات الحية مقابل كل ما يتتبعه git.

الجداول4630 لها CREATE TABLE في المستودع، و16 ليس لها
الفهارس الثانوية4332 يُنشئها الكود في المستودع، و11 في قاعدة البيانات العاملة فقط
سكربتات الترحيل109في نظام التحكم بالإصدارات
30 جدولًا معرّفًا 16 بلا تعريف في أي مكان 32 فهرسًا لها ملف 11 في قاعدة البيانات فقط 46 جدولًا، 43 فهرسًا ثانويًا، ملفات مخطط: 0

الرقم المهم لم يتحرك. في 27 أغسطس كان أحد عشر فهرسًا ثانويًا لا توجد إلا في قاعدة البيانات العاملة. وفي 1 سبتمبر لا يزال عددها أحد عشر. وأُضيف في الأثناء أحد عشر فهرسًا آخر، وجاء كل واحد منها مع سكربت ترحيل: تغيّرت العادة، ولم يتغير الدَّين.

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

لذا يبقى موقف أغسطس قائمًا. فالمخطط لا يزال خارج المستودع، والاستعادة التي تعيد بناء جدول بدلًا من استعادته ستُسقط أحد عشر فهرسًا دون أي تنبيه. وما تغيّر أضيق من ذلك: كل ما أُضيف منذ ذلك الحين ترك خلفه ملفًا.

إعلان