مشاكل أثناء التحديث من 3.0.0 إلى 3.0.1

مرحباً،

اليوم قمت بتحديث تطبيق Discourse الخاص بنا إلى الإصدار 3.0.1. فشل التحديث أثناء محاولة معالجة ترحيل postgres.
على وجه التحديد هنا:

2023-01-27 04:50:48.628 UTC [483] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 04:50:48.628 UTC [483] discourse@discourse DETAIL:  Key (name)=(e-mail) already exists.
2023-01-27 04:50:48.628 UTC [483] discourse@discourse STATEMENT:  UPDATE tags t
	SET public_topic_count = x.topic_count
	FROM (
	  SELECT
	    COUNT(topics.id) AS topic_count,
	    tags.id AS tag_id
	  FROM tags
	  INNER JOIN topic_tags ON tags.id = topic_tags.tag_id
	  INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'
	  INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted
	  GROUP BY tags.id
	) x
	WHERE x.tag_id = t.id
	AND x.topic_count <> t.public_topic_count;
	
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

يبدو أن بعض العلامات كانت مكررة. اتصلت بـ postgres وقمت بتصحيح العلامات. ثم تم تشغيل الترحيل والتحديث.

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

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

لدي نفس المشكلة

هل حصلت على نفس العرض بالضبط؟

ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(e-mail) already exists.
إعجاب واحد (1)

نعم. هذا أيضًا بسبب العلامات المكررة / index_tags_on_name.
في حالتي، اسم العلامة مختلف فقط.

أحاول حاليًا معرفة:

  • كيفية ترقية ruby إلى 3.0.0 لأنه يشتكي من أن web-push عند الإصدار 2.6.7، لذلك لا يمكنني حتى إدخال rails c، لتنفيذ أوامر متقدمة لإصلاح العلامات
  • كيفية حذف العلامة بأمان من قاعدة بيانات postgres ولكن لا توجد فكرة حتى الآن
إعجاب واحد (1)

من فضلك انشر جزء السجل الذي يوضح الخطأ في حالتك!

إذا كان أي شخص سيكتشف كيف نشأت هذه القيم المكررة للمفاتيح، فسوف يقدرون المزيد من التفاصيل.

عذرًا، لا يمكنني المساعدة في إصلاح قاعدة البيانات.

بالنسبة لمشكلة الـ ruby، أعتقد أنك بحاجة إلى إجراء ترقية من سطر الأوامر (*). انظر على سبيل المثال

(*) تحرير: ولكن انظر أدناه، تفشل الترقية مع قاعدة البيانات كما هي. عفوًا.

إعجابَين (2)
I, [2023-01-27T07:46:34.317438 #1]  INFO -- : `cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate'`
2023-01-27 07:46:45.663 UTC [584] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 07:46:45.663 UTC [584] discourse@discourse DETAIL:  Key (name)=(hws-connect) already exists.
2023-01-27 07:46:45.663 UTC [584] discourse@discourse STATEMENT:  UPDATE tags t
        SET public_topic_count = x.topic_count
        FROM (
          SELECT
            COUNT(topics.id) AS topic_count,
            tags.id AS tag_id
          FROM tags
          INNER JOIN topic_tags ON tags.id = topic_tags.tag_id
          INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'
          INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted
          GROUP BY tags.id
        ) x
        WHERE x.tag_id = t.id
        AND x.topic_count <> t.public_topic_count;

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(hws-connect) already exists.

يظهر هذا الخطأ 3 مرات، لأن العلامة تبدو موجودة في 3 مواضيع.

أنا نادم على تفعيل العلامات لو كنت أعلم أن هذا سيحدث ولماذا لم يكن هناك تحذير بشأن ذلك في الواجهة الأمامية بالفعل.
أريد فقط حذفها واستعادة منتداي مرة أخرى :cold_sweat:

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

يمكنني إعادة بناء التطبيق كلما أردت. أحصل على الخطأ ويتوقف. وبالتالي يبقى روبي غير مطور.
أنا عالق بشكل أساسي.

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

مرحباً،

ربما قم بإجراء استعلام SELECT مثل هذا:
SELECT * FROM tags WHERE name LIKE '%hws-connect%'

يجب أن تجد علامات متعددة بنفس الاسم. كانت هذه هي المشكلة في حالتي.

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

لقد قمت بتحديد:

سؤالي هو ما إذا كان بإمكاني إعادة تسمية علامة “hws-connect” في قاعدة البيانات دون إتلاف بنية discourse؟
و… كيف يمكنني إعادة تسميتها عبر postgres؟

حسنًا، بعض الأمور:

  • عليك أن تتقبل الخلل العرضي عند تشغيل تثبيتك الخاص لبرنامج بمليون دولار (مدعوم بمجتمع مفيد للغاية) حصلت عليه (مجاناً تقريباً)
  • لقد قمت مؤخراً بتحديث موقعين يستخدمان العلامات بشكل مكثف ولم أواجه أي مشاكل.
  • في أكثر من 5 سنوات من تشغيل مثيلات Discourse متعددة، أعتقد أنني واجهت مشكلة كهذه مرة واحدة؟

على أي حال، يبدو أنها مشكلة مشابهة جداً لهذه، ربما يمكنك استخدام استراتيجية مماثلة لحلها؟:

يبدو أنك كنت بالفعل على المسار الصحيح هنا، عليك فقط المتابعة …

إعجابَين (2)

أعلم، ولا يتعلق الأمر بـ discourse أو الترقية نفسها. تحدث هذه الأمور ولا بأس بها.
أتمنى فقط ألا أواجه سيناريو عالقًا حيث يتعين عليّ القتال ضد العديد من المواضيع (docker، ruby، postgres، discourse). ليس هذا عملي اليومي ويتطلب استثمارًا للوقت.

شكرًا على الرابط!
سأقوم بتحديث حالتي.

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

تحديث: أفضل ما أخذته من موضوعك @merefield كان

أعتقد أنني يجب أن أكون شجاعًا

:smiley:
العبث في قاعدة بيانات دائمًا ما يكون مخيفًا بالنسبة لي ولكن في هذه الحالة نجح الأمر.

لكل من لديه نفس المشكلة (علامات مكررة / index_tags_on_name):

  1. فرّك أصابعك وابدأ المرحلة الأولى من Inception:
    cd /var/discourse
    sudo ./launcher enter app

إذا فشل هذا لأنك تحصل على شيء مثل “لا يوجد حاوية docker قيد التشغيل” أو ما شابه، اكتب
sudo docker ps -a --no-trunc
سيؤدي هذا إلى سرد حاويات docker المتاحة والمعرف الخاص بها. باستخدام ذلك، أعد تشغيل الحاوية.
sudo docker restart <container ID>
بعد ذلك، يجب أن يعمل sudo ./launcher enter app.

  1. قم بالوصول إلى قاعدة بيانات postgres الخاصة بك وابدأ المرحلة الثانية من Inception:
    su discourse
    psql
    يجب أن يكون سجل خطأ إعادة البناء قد أعطاك اسم العلامة المذنبة. في حالتي كان
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-01-27 07:46:45.663 UTC [584] discourse@discourse DETAIL:  Key (name)=(hws-connect) already exists.

لذا ابحث أولاً عن علامتك باستخدام

select * from tags where name='hws-connect';

هذا يعطيك الجدول الذي يمكنك رؤيته أعلاه في مشاركاتي.

  1. لقد قمت للتو بإعادة تسمية العلامة hws-connect إلى hws-connect1 باستخدام
UPDATE tags SET name = 'hws-connect1' WHERE name='hws-connect';
  1. اخرج من Inception ببعض الركلات للخلف:
    \q للخروج من postgres
    exit للخروج من حاوية docker
  2. قم بإعادة البناء مرة أخرى باستخدام sudo ./launcher rebuild app
  3. كن سعيدًا لأن الأمر يعمل وتحقق في الواجهة الأمامية مما فعلته:
    انتقل إلى صفحة العلامات الخاصة بك https://your-forum/tags

ليس لدي أي فكرة كيف حدث ذلك ولماذا فشل هذا الترقية بهذا السوء - كل الترقيات السابقة نجحت، عبر الويب أو الطرفية.
سأقوم بتنظيف علاماتي الآن.

مكافأة:

  1. انقر على العلامة التي تم تغيير اسمها.
  2. قم بإزالتها من جميع المواضيع. 3 في حالتي.
  3. عد إلى صفحة العلامات واستخدم الميزة الموجودة في أعلى اليمين:

تم الانتهاء. :v:
شكراً لكم جميعاً على مساعدتكم.

10 إعجابات

أحسنت! عمل ممتاز!

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

شرح رائع (وشجاعة مُثبتة) شكرًا لك!

منتدياتي تستخدم العلامات أيضًا - وهذا المنتدى كذلك، الكثير منها:
https://meta.discourse.org/tags

من الواضح أن شيئًا نادرًا وغير مؤسف يمكن أن يحدث لإنشاء قيمة مفتاح مكررة.

3 إعجابات

أنا أيضًا أعاني من هذا. شكرًا لمشاركة الحلول اليدوية، لقد استخدمتها للتو لإصلاح حوالي 20 منها.

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

  id   |          name          |         created_at
-------+------------------------+----------------------------
   707 | ParkRide               | 2019-05-21 21:36:53.213993
 18982 | ParkRide               | 2020-06-05 18:43:09.409895

(نعم، هناك فرق في المسافات البيضاء حول هذه)

أنا الآن عالق بعلامة مكررة أخيرة ولا يمكن إصلاحها:

discourse=> select name from tags group by name having count(*) > 1;
    name
------------
 Bike--Ride
(1 row)

discourse=> UPDATE tags SET name = 'Bike--Ride_2' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(Bike--Ride_2) already exists.
discourse=> UPDATE tags SET name = 'Bike--Ride_3' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(Bike--Ride_3) already exists.
discourse=> UPDATE tags SET name = 'something is broken here' WHERE name = 'Bike--Ride';
ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
DETAIL:  Key (name)=(something is broken here) already exists.

بينما تفشل الترقية على

2023-02-01 18:56:58.610 UTC [475] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_tags_on_name"
2023-02-01 18:56:58.610 UTC [475] discourse@discourse DETAIL:  Key (name)=(Bike--Ride) already exists.

أي فكرة حول كيفية تجاوز هذا؟

أود أن أشكرك. لقد ساعدني هذا في الترقية!

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

لقد واجهت نفس الخطأ - بغض النظر عن اسم العلامة الجديدة الذي استخدمته، فقد أبلغ عن وجوده بالفعل. لقد قمت بحله عن طريق تحديث العلامة باستخدام المعرف بدلاً من عمود الاسم:

UPDATE tags SET name = 'tag1' WHERE id = 1234

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