لقد قمت للتو بترقية موقع يحتوي على 1.8 مليون منشور إلى الإصدار 2.7.0.beta2، ومعها ترقية من PostgreSQL 10 إلى PostgreSQL 13. لاحظت أن الإصدار beta3 صدر للتو ويحتوي على “تحسينات في أداء ترحيل قاعدة البيانات”، لذا قمت بالترقية مرة أخرى.
عند محاولة تنفيذ أمر reindex concurrently، تظهر الرسالة التالية:
WARNING: cannot reindex invalid index "public.allowed_pm_users_pkey_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_allowed_pm_users_on_user_id_and_allowed_pm_user_id_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_allowed_pm_users_on_allowed_pm_user_id_and_user_id_ccnew" concurrently, skipping
كنت أعتزم حذف هذه الفهارس وإعادة إنشائها، لكنني لا أجد أي ذكر لـ ccnew في الكود المصدري الحالي، لذا لست متأكدًا من الإجراء المناسب.
يبدو أن فهرس _ccnew جزء من آلية إعادة الفهرسة المتزامنة في PostgreSQL:
إنشاء فهرس جديد في الفهارس النظامية يكون نسخة طبق الأصل من الفهرس المعاد فهرسته (مع بعض الاستثناءات، على سبيل المثال، فهارس التقسيم لا تسجل اعتماد الوراثة الخاص بها عند الإنشاء، بل عند وقت التبديل). يُضاف لهذا الفهرس المؤقت لاحقة “_ccnew”. باختصار.
هل يمكنك إعادة فهرسة هذه الفهارس دون استخدام الكلمة المفتاحية concurrently؟
أو، من الجزء اللاحق في نفس المنشور:
ثم، سيقوم أمر REINDEX TABLE CONCURRENTLY بتجاوز الفهارس غير الصالحة لأنه في حال حدوث إخفاقات متتالية ومتعددة، فإن عدد الفهارس سيزداد بشكل مطرد، مضاعفًا نفسه في كل تشغيل، مما يتسبب في تضخم كبير في عمليات إعادة الفهرسة اللاحقة:
…
ومع ذلك، من الممكن إعادة فهرسة الفهارس غير الصالحة باستخدام أمر REINDEX INDEX CONCURRENTLY فقط:
_ccnew هي فهارس حاولت عملية reindex concurrently السابقة إنشاؤها لكنها فشلت، عادةً بسبب انتهاكها لفحص التفرد. ستبقى محاولات إعادة الفهرسة المتزامنة الفاشلة هناك، ويجب حذفها يدويًا.
عند تشغيل reindex concurrently للمرة الثانية، سيتجاوز PostgreSQL بقايا الفشل هذه.