SouperC
(NotSoSuper)
6월 14, 2023, 8:49오후
1
오늘 Discourse를 최신 버전으로 업그레이드하려는데 리빌드가 실패하고 있으며, 원인이 정확히 무엇인지 파악이 되지 않습니다. 설치된 버전이 꽤 오래된 상태였습니다(2.8x 계열이라고 생각합니다). Docker 이미지 업데이트는 문제없이 진행되었지만, Discourse 업그레이드를 시도하자 수동으로 pull 및 rebuild를 수행하라는 안내가 나왔습니다(대부분 이런 안내를 받습니다). 그러나 rebuild는 성공하지 못했습니다.
discourse-doctor를 사용하여 "error"를 검색한 결과를 아래에 첨부합니다. 웹 기반 VNC 클라이언트를 사용 중인데 복사/붙여넣기 기능이 지원되지 않아 스크린샷으로 대체합니다.
두 개의 racerx 사용자가 있는 것으로 보입니다. 비슷한 문제에 대한 주제가 여기 있습니다:
또한 여기 더 최근의 사례도 있습니다:
Thanks for your reply.
Yes, I am able to start / enter the app, I am also doing as you suggested.
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(mostafa11) is duplicated.
The problem is duplicates keep coming, I have a lot of user over 300K.
Is there any way to check how many duplicates or list all of them?
For fixing, I was updating the username_lower like this: I was appending some number at the end.
U…
SouperC
(NotSoSuper)
6월 14, 2023, 9:07오후
3
감사합니다. 그 방향으로 시작해볼게요… 행운을 빌어주세요..
SouperC
(NotSoSuper)
6월 14, 2023, 9:37오후
4
재인덱싱을 어떻게 시작해야 할지 막혀 있습니다. (웹에서 접근은 불가능하지만) 앱을 시작하고 진입하는 것까지는 성공했지만, 그 이후로는 진행이 되지 않습니다.
pfaffman
(Jay Pfaffman)
6월 15, 2023, 12:46오전
5
해당 명령어를 컨테이너 내부에서 실행해야 합니다. 예를 들어 다음과 같이 실행하세요.
./launcher start app
./launcher enter app
그리고 나서 sudo postgres를 실행하세요.
수정: 아, 컨테이너에 진입하셨군요.
해당 postgres -c 명령어 앞에 sudo를 붙여야 합니다.
SouperC
(NotSoSuper)
6월 15, 2023, 1:33오전
6
sudo는 안 될 것 같았고, su를 사용하니 이제 postgres에서 이것저것 살펴보고 있습니다.
이제 실제로 중복 항목을 수정하는 방법을 알아내야 합니다. 쿼리는 다음과 같은 것 같습니다.
UPDATE users SET username_lower = 'xxx' WHERE id = xxx;
몇 가지 변형을 시도해 보았지만 실패했습니다. 에러가 컬럼 관련 문제인 걸 보면, 제가 정확한 문법에 대해 100% 확신이 없는 상태입니다.
계속 파헤쳐 보겠습니다. 아직 중복 항목이 몇 개인지도 모르겠네요…
/수정… 그냥 racerx 하나뿐이었네요. 진짜 화나네, RACERX!
Canapin
(Coin-coin le Canapin)
6월 15, 2023, 9:22오전
7
수정하는 방법을 알아냈나요?
사용자를 제대로 식별하기 위해 고유한 사용자 ID도 반환하고, 이 두 사용자 중 하나의 이름을 바꾸는 걸 추천합니다
@Canapin 님이 말씀하신 내용을 확장해서 말씀드리면, 이미 racerx가 유일한 중복된 사용자명이라는 것을 확인하셨으므로 사용자명을 고유하게 만드는 것은 간단할 것입니다.
먼저, 아직 확인하지 않으셨다면 racerx2가 이미 존재하지 않는지 확인하여 문제를 다른 사용자명으로 단순히 옮기는 일이 없도록 하세요: (ID가 반환되면 다른 사용자명을 시도해 보세요.)
SELECT id FROM users WHERE username_lower = 'racerx2';
사용 가능한 사용자명을 찾았다면, 중복된 racerx 계정의 ID를 가져오세요:
SELECT id from users WHERE username_lower = 'racerx';
그중 하나를 선택하세요. 어느 것을 선택하든 무방하지만, 저는 가장 큰 ID를 사용하는 것을 권장합니다. 그리고 해당 계정의 사용자명을 변경하세요: (필요하다면 racerx2를 다른 사용자명으로, 12345를 선택한 racerx ID로 대체하세요.)
UPDATE users SET username_lower = 'racerx2' WHERE id = 12345;
SouperC
(NotSoSuper)
6월 19, 2023, 12:57오후
9
업데이트 (몇 일간 초안으로 남아있어서 죄송합니다) 해결 방법을 찾은 것 같습니다. 제가 한 것이 올바른 접근 방식인지 확신은 없지만, 성공적으로 다시 빌드되었습니다.
문법으로 username_lower 컬럼의 racerx 값을 수정\추가하는 것이 어려워 다른 방식으로 접근했습니다. 행의 ID를 조회한 후 특정 행의 username_lower 값을 수정하는 방식이었죠.
먼저 users 테이블에서 username_lower 컬럼에 "racerx"가 포함된 행에 대한 보고서를 받아보려고 했습니다.
select all from users where username_lower ='racerx';
이 결과를 바탕으로 racerx를 racerx2로 수정하기로 결정했습니다. 정확히 무엇을 입력했는지 기억은 나지 않습니다. 아마도 users 테이블에서 username_lower를 racerx에서 racerx2로 변경하는 UPDATE SET 구문을 사용했을 것입니다.