جدول incoming_referers يتتبع مسارات عناوين URL التي أحالت الزوار إلى منتداك. يحتوي على فهرس فريد، مما يعني أنه لا يمكن أن يكون هناك صفان لهما نفس التركيبة من المسار + النطاق.
قاعدة البيانات الخاصة بك تحتوي على صفين مع path='//' و incoming_domain_id=5. عندما تحاول إعادة بناء هذا الفهرس الفريد أثناء الاستعادة، تجد التكرار وتوقف عملية الاستعادة بأكملها.
لذلك ستحتاج إلى العثور على المكرر في incoming_referers وتنظيفه، ثم إنشاء نسخة احتياطية جديدة للاستعادة على الخادم الجديد.
عذرًا على الإزعاج، لكن يبدو أنني أقوم بشيء خاطئ — بعد تشغيل الأمر “discourse=# select * from incoming_referers where path LIKE ‘%/search/’ ORDER BY incoming_domain_id;”، أحصل على خطأ في بناء الجملة.
حسنًا، قمت الآن بتثبيت “apt install postgresql-client-common”. ومع ذلك، لا زلت أحصل على الخطأ “خطأ: يجب عليك تثبيت حزمة postgresql-client- واحدة على الأقل.”
أنا آسف حقًا، حقًا جدًا على تصرفي بهذه الطريقة الغبية.
لقد قمت الآن بتثبيت Rails، ويبدو أن الأمر قد نجح. كما قمت بتشغيله باستخدام الأمر "rails c". يبدو أن هذا أيضًا يعمل، ولكن عند إدخال الأمر، يظهر بالشكل التالي:
"root@community:/var/discourse# ActiveRecord::Base.connection.execute(<<~SQL)
-bash: syntax error near unexpected token \'<<'
root@community:/var/discourse# SELECT id, path, incoming_domain_id
SELECT: command not found
root@community:/var/discourse# FROM incoming_referers
FROM: command not found
root@community:/var/discourse# WHERE path = ‘//’
WHERE: command not found
root@community:/var/discourse# AND incoming_domain_id = 5
AND: command not found
root@community:/var/discourse# SQL"
أنا أشعر بالحيرة عندما تقول إنك قمت للتو بتثبيت Rails ولا يمكنك الوصول إلى قاعدة البيانات. ربما يكون الأمر مختلفًا لأن النسخة أقدم، لكنني أعتقد أنني أيضًا خارج نطاق خبرتي الآن.
على أي حال، بمجرد دخولك إلى Rails، يجب أن يتغير الموجه (prompt)، لذا يبدو من مخرجاتك أنك لم تدخل إلى وحدة تحكم Rails بعد.
أعتقد حتى أنك لم تدخل إلى الحاوية الفعلية. هل قمت بتشغيل ./launcher enter app؟
إذن، ntuples=1 تعني أنه تم العثور على صف واحد فقط، بينما يشير سجل الخطأ إلى وجود تكرار…
آسف، لا أعرف ما يمكنني تجربته بعد ذلك. أنصحك بتصفح المنتدى، يبدو أن هناك العديد من الحالات المشابهة (انظر أدناه هذا الموضوع في القسم ذي الصلة)، ربما تجد هناك الدليل التالي.
يبدو أن خادمك القديم ليس تثبيتًا قياسيًا. على أي حال، إليك ملخص لما حدث: تضرر فهرس على خادمك القديم بمرور الوقت (وهو ما قد يحدث بعد ترقية نظام التشغيل)، مما سمح لصفحتين متطابقتين بالتسرب إلى جدول incoming_referers. تقوم النسخة الاحتياطية بنسخهما كما هما، ثم يرفض الخادم الجديد ذلك. لذا، سنقوم بإصلاح المشكلة على الخادم القديم أولاً، ثم ننشئ نسخة احتياطية جديدة.
على الخادم القديم، افتح وحدة تحكم Rails:
./launcher enter app
rails c
ثم الصق الأسطر التالية، واحدة تلو الأخرى:
db = ActiveRecord::Base.connection.current_database
DB.exec("DELETE FROM incoming_referers a USING incoming_referers b WHERE a.id > b.id AND a.path = b.path AND a.incoming_domain_id = b.incoming_domain_id")
DB.exec("REINDEX DATABASE #{ActiveRecord::Base.connection.quote_table_name(db)}")
هذا الإجراء يزيل التكرار ويعيد بناء جميع الفهارس (في حال تأثرت جداول أخرى أيضًا).
إذا اكتملت عملية REINDEX دون ظهور خطأ، اكتب exit، ثم أنشئ نسخة احتياطية جديدة على الخادم القديم، واستعد الملف الجديد. وإذا ظهر خطأ يتعلق بجدول آخر، فقط انسخه وألصقه هنا.
أغلق وحدة تحكم Rails (اكتب exit)، وفيما لا تزال داخل الحاوية (./launcher enter app)، قم بتشغيل:
su postgres -c "reindexdb discourse"
عندما ينتهي الأمر دون ظهور أخطاء، قم بإنشاء نسخة احتياطية جديدة على الخادم القديم واستعد هذا الملف الجديد. إذا ظهر خطأ يتعلق بجدول معين، فما عليك سوى لصقه هنا.
شكرًا جزيلاً لك! كل شيء سار بشكل رائع، وبدون مساعدتي ما كنتُ لأملك أي فرصة، ولضطررتُ حتمًا إلى إعادة إنشاء المنتدى من الصفر بعد ألمٍ شديد! شكرًا جزيلاً!