خطأ في استيراد النسخ الاحتياطي: "تعذر إنشاء فهرس فريد"

مرحباً،

أحاول ترحيل منتدى إلى خادم جديد. كلا الخادمين يعملان بأحدث إصدار من discourse docker. عند استيراد النسخة الاحتياطية عبر سطر الأوامر، أحصل على الخطأ التالي:

ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL:  Key (path, incoming_domain_id)=(/search/, 418) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/search/, 418) is duplicated.

يبدو هذا هو نفس الخطأ أو خطأ مشابه للخطأ الموجود في:

ومع ذلك، في حالتي، السجلات المكررة موجودة في المسار /search/ بدلاً من /m/search كما هو الحال في الموضوع المرتبط أعلاه.

لقد اتصلت بالحاوية على الخادم القديم (./launcher enter app) وفي وحدة تحكم Rails (rails c) حاولت البحث عن السجلات المكررة باستخدام:

IncomingReferer.where(path: "/search")
و
IncomingReferer.where("path LIKE '%/search%'")

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

إعجاب واحد (1)

هل جربت استخدام واجهة المستخدم الرسومية للمدير؟

إعجاب واحد (1)

لا، افترضت أن الاستيراد عبر واجهة المستخدم الرسومية سيستدعي عملية الاستيراد نفسها؟ سأجرب ذلك الآن.

إعجاب واحد (1)

أظن أن هذا يعني أن لديك فهرسًا تالفًا. ما إصدار PostgreSQL الذي تعمل عليه؟

شيء من هذا القبيل:

cd /var/discourse
cat shared/standalone/postgres_data/PG*

(لا أتذكر تمامًا اسم ملف PostgreSQL).

يمكنك البحث هنا عن “postgres corrupt index” وإيجاد موضوع كتبته سابقًا عن كيفية تتبع تلك السجلات المعيبة وحذفها.

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

لقد جربت للتو الاستيراد عبر واجهة المستخدم الرسومية، مع نفس النتيجة تمامًا:

الخادم القديم لا يحتوي على ملف يسمى PG_VERSION، كيف يمكنني معرفة الإصدار الذي يعمل به؟ لقد قمت بتحديث تثبيت docket إلى أحدث إصدار اليوم.

الخادم الجديد (الذي تم تهيئته حديثًا) يعمل بإصدار Postgres V13

cat shared/standalone/postgres_data/PG_VERSION
13

هل توجد إجراءات موصى بها لكيفية القيام بذلك؟

كان لدي موضوع يحتوي على بعض التلميحات، لكنني لم أعد أراه. لقد مرّ ما يقرب من عام منذ ترقية postgres 12.

  reindex index index_incoming_referers_on_path_and_incoming_domain_id;

و

 ActiveRecord::Base.connection.execute('reindex index index_incoming_referers_on_path_and_incoming_domain_id;')

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

حسنًا، لقد أصلحت المشكلة. قمت بالخطوات التالية

الدخول إلى الحاوية

./launcher enter app

الاتصال بقاعدة البيانات

su postgres -c 'psql discourse'

محاولة البحث عن التكرارات

discourse=# select * from incoming_referers where path LIKE '%/search/' ORDER BY incoming_domain_id;`

  id  |    path    | incoming_domain_id
------+------------+--------------------
 3339 | /search/   |                 33
 6257 | /search/   |                 91
 1567 | /search/   |                298
 1777 | /search/   |                341
 3010 | /search/   |                418
 6247 | /search/   |                418
 4293 | /search/   |                644
 2899 | /search/   |                653
 3447 | /search/   |                793
 3696 | /search/   |                852
 4395 | /a/search/ |               1050
 6968 | /search/   |               1305
 5634 | /search/   |               1387
 5834 | /search/   |               1437
 6519 | /search/   |               1637
 7127 | /search/   |               1787
 7280 | /search/   |               1827
(17 rows)

حذف التكرار

DELETE FROM incoming_referers WHERE path LIKE '%/search/' AND id IN (6247);

ثم إعادة البناء

discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING:  cannot reindex invalid index "public.incoming_referers_pkey_ccnew" concurrently, skipping
WARNING:  cannot reindex invalid index "public.index_incoming_referers_on_path_and_incoming_domain_id_ccnew" concurrently, skipping
WARNING:  cannot reindex invalid index "pg_toast.pg_toast_20732_index_ccnew" concurrently, skipping
REINDEX

ثم أخذت نسخة احتياطية أخرى، ونسختها إلى الخادم الجديد، وتمت استيراده بنجاح :smiley:

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

شكرًا جزيلاً لمساعدتك.

3 إعجابات

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.