مشكلة PG::UniqueViolation أثناء ترقية 3.1.0.beta4

أثناء الترقية إلى 3.1.0.beta4، واجهت الخطأ التالي:

I, [2023-04-19T00:02:26.057232 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'LOAD_PLUGINS=0 bundle exec rake plugin:pull_compatible_all'
I, [2023-04-19T00:02:27.340128 #1]  INFO -- : discourse-adplugin is already at latest compatible version
discourse-cakeday is already at latest compatible version
discourse-formatting-toolbar is already at latest compatible version
discourse-whos-online is already at latest compatible version
docker_manager is already at latest compatible version
vbulletin-bbcode is already at latest compatible version

I, [2023-04-19T00:02:27.340368 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
2023-04-19 00:02:30.080 UTC [634] discourse@discourse ERROR:  duplicate key value violates unique constraint "index_users_on_username"
2023-04-19 00:02:30.080 UTC [634] discourse@discourse DETAIL:  Key (username)=(xxx) already exists.
2023-04-19 00:02:30.080 UTC [634] discourse@discourse STATEMENT:  UPDATE users SET password_algorithm = '$pbkdf2-sha256$i=64000,l=32$'
	WHERE id IN (
	  SELECT id FROM users
	  WHERE users.password_hash IS NOT NULL
	  AND users.password_algorithm IS NULL
	  LIMIT 5000
	)
	
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_username"
DETAIL:  Key (username)=(xxx) already exists.

بعد إصلاح المستخدمين المكررين، واجهت مرة أخرى مستخدمين جدد.

discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(mhm) is duplicated.
discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(ahmedhafez) is duplicated.
CONTEXT:  parallel worker
discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(hany) is duplicated.
CONTEXT:  parallel worker
discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(eng_ali) is duplicated.
CONTEXT:  parallel worker
discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(saad_saad) is duplicated.
discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(eng_ali) is duplicated.
CONTEXT:  parallel worker
discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(mostafa11) is duplicated.
CONTEXT:  parallel worker
إعجاب واحد (1)

يبدو أن هذا فهرس تالف أو أن المستخدمين تمكنوا بطريقة ما من إنشاء حسابات بنفس اسم المستخدم بأحرف كبيرة مختلفة.
يجب أن تكون قادرًا على بدء الحاوية القديمة باستخدام
./launcher start app
يمكنك بعد ذلك محاولة إعادة فهرسة الجدول، ومعرفة أي مستخدم معطل، وإصلاحه، وتكرار ذلك حتى تتم إعادة بناء الفهرس.

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

شكراً على ردك.

نعم، أنا قادر على بدء / الدخول إلى التطبيق، وأنا أفعل أيضاً كما اقترحت.

discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(mostafa11) is duplicated.

المشكلة هي أن التكرارات تستمر في الظهور، لدي أكثر من 300 ألف مستخدم.
هل هناك أي طريقة للتحقق من عدد التكرارات أو سردها جميعاً؟

بالنسبة للإصلاح، كنت أقوم بتحديث username_lower كالتالي: كنت أضيف بعض الأرقام في النهاية.

UPDATE users SET username_lower = 'xxx' WHERE id = xxx;

هل أحتاج أيضاً إلى تحديث عمود username ليتطابق مع username_lower؟ هل هناك طريقة أسرع، مثل إصلاح هذه التكرارات تلقائياً؟

موقعي الإلكتروني متوقف الآن، لذا فإن أي مساعدة ستكون موضع تقدير كبير.

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

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

ربما يمكنك البحث عن مستخدمين حيث اسم المستخدم! = اسم المستخدم السفلي؟

هل تعطل حتى لو بدأت التطبيق؟

لا. لا بأس بأن يكون لاسم المستخدم حالة مختلطة ولكنك لا تريد أن يكون لديك اسمان للمستخدمين لهما نفس الأحرف.

هل الحالة هي أن لديك كل من Joe و joe؟ إذا كان الأمر كذلك، أعتقد أنه يجب أن يكون هناك استعلام يمكنه العثور عليها، ولكنني لا أعرف كيف أفعل ذلك حاليًا.

إعجابَين (2)

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

SELECT username_lower, count(*) from users GROUP by username_lower HAVING count(*) > 1;

كان يعطيني صفراً.
بالطبع هناك العديد من التكرارات وأردت معرفة العدد. لذلك قمت بتعديل الاستعلام قليلاً:

SELECT username_lower, count(username) from users GROUP by username_lower HAVING count(username) > 1;

نجح هذا وأعاد حوالي 50 تكرارًا، لذا قمت بإصلاحها، وأعدت الفهرسة وأعدت البناء بنجاح.

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

عظيم! يسعدني أنك تمكنت من حل المشكلة. ستكون ملاحظاتك مفيدة جدًا للآخرين الذين يواجهون نفس المشكلة.

لقد قمت بتحرير مشاركتك لتسهيل نسخ ولصق استعلام SQL الخاص بك للآخرين.

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

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