اليوم قمت بتحديث تطبيق 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 وقمت بتصحيح العلامات. ثم تم تشغيل الترحيل والتحديث.
سؤالي هو، هل تعاملت مع الأمر بشكل صحيح بالتلاعب في قاعدة البيانات؟ لقد قمت فقط بتغيير اسم العلامات المكررة.
لا أستطيع تحديد كيف تم إنشاء العلامات المكررة. تم إدخالها خلال العامين إلى الثلاثة أعوام الماضية.
لست متأكداً مما إذا كان هذا الموقف قد يتكرر.
I, [2023-01-27T07:46:34.317438 #1] INFO -- : `cd /var/www/discourse && 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 مواضيع.
أنا نادم على تفعيل العلامات لو كنت أعلم أن هذا سيحدث ولماذا لم يكن هناك تحذير بشأن ذلك في الواجهة الأمامية بالفعل.
أريد فقط حذفها واستعادة منتداي مرة أخرى
أعلم، ولا يتعلق الأمر بـ discourse أو الترقية نفسها. تحدث هذه الأمور ولا بأس بها.
أتمنى فقط ألا أواجه سيناريو عالقًا حيث يتعين عليّ القتال ضد العديد من المواضيع (docker، ruby، postgres، discourse). ليس هذا عملي اليومي ويتطلب استثمارًا للوقت.
العبث في قاعدة بيانات دائمًا ما يكون مخيفًا بالنسبة لي ولكن في هذه الحالة نجح الأمر.
لكل من لديه نفس المشكلة (علامات مكررة / index_tags_on_name):
فرّك أصابعك وابدأ المرحلة الأولى من 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.
قم بالوصول إلى قاعدة بيانات 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';
هذا يعطيك الجدول الذي يمكنك رؤيته أعلاه في مشاركاتي.
لقد قمت للتو بإعادة تسمية العلامة hws-connect إلى hws-connect1 باستخدام
UPDATE tags SET name = 'hws-connect1' WHERE name='hws-connect';
اخرج من Inception ببعض الركلات للخلف: \q للخروج من postgres exit للخروج من حاوية docker
قم بإعادة البناء مرة أخرى باستخدام sudo ./launcher rebuild app
كن سعيدًا لأن الأمر يعمل وتحقق في الواجهة الأمامية مما فعلته:
انتقل إلى صفحة العلامات الخاصة بك https://your-forum/tags
أنا أيضًا أعاني من هذا. شكرًا لمشاركة الحلول اليدوية، لقد استخدمتها للتو لإصلاح حوالي 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.
لقد واجهت نفس الخطأ - بغض النظر عن اسم العلامة الجديدة الذي استخدمته، فقد أبلغ عن وجوده بالفعل. لقد قمت بحله عن طريق تحديث العلامة باستخدام المعرف بدلاً من عمود الاسم: