DB에 중복된 사용자 이름으로 인한 업그레이드 문제

오늘 아침 보드를 업그레이드하려고 했는데 오류가 발생했습니다:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint “index_users_on_username”

오류 메시지에 사용자 "MikeC"가 언급되어 있습니다. 그래서 좀 더 찾아보니 postgres_data를 복원하고 보드를 다시 시작한 후, 데이터베이스에서 중복 항목을 확인하라는 조언을 받았습니다. 그래서 username_lower = 'mikec’인 항목을 빠르게 조회했는데 1행만 나왔습니다. 이후 다음과 같은 복잡한 쿼리를 발견했습니다:

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

하지만 이 쿼리는 아무 행도 반환하지 않았습니다. 그러면 중복 항목은 어디에 있는 걸까요? 도움이 필요하니 조언 부탁드립니다. 현재는 구버전 데이터로 실행 중이지만, 앱을 제대로 다시 구축할 수 있으면 좋겠습니다.

음, 이렇게 해결했는데 더 좋은 방법이 분명 있을 것 같아:

관리자 페이지로 가서 'MikeC’를 검색했는데 2명의 사용자가 검색되었어. 그래서 가장 오래된 사용자의 이름을 변경하고, 다시 rebuild를 실행하는 대신 DB에 직접 로그인해서 재인덱싱을 수행했어:

cd /var/discourse
./launcher enter app
sudo -i postgres psql discourse
discourse# REINDEX SCHEMA CONCURRENTLY public;

그렇게 하면 또 다른 중복이 표시되고, 웹 UI로 돌아가서 해당 사용자를 검색한 다음 더 오래된 사용자의 이름을 변경해. 중복이 더 이상 발견되지 않을 때까지 이 과정을 반복해. 그리고 rebuild를 실행하면 성공!

하지만 궁금한 점이 있어:

  1. 왜 discourse는 중복을 허용하는 거야? 사용자 이름은 대소문자를 구분하지 않을 수 있지만, username_lower는 고유한 값으로 정규화되어야 해. 이건 꽤 큰 버그인 것 같아.

  2. 이 중복을 찾고 수정하는 더 좋은 방법은 뭐야?

더 나은 방법이 있다고 생각하지 않습니다. 중복된 사용자 이름은 허용되지 않지만, 이전 버그 때문에 소문자 변환 체크가 제대로 적용되지 않은 것 같습니다. 최근 이 문제에 대해 다른 게시글이 있었습니다.