컨테이너가 시작되지 않으면 SQL 쿼리를 어떻게 실행합니까? (리빌드 실패)

안녕하세요.

업데이트 및 재구성을 시도했는데, 다음과 같은 아름다운(?) 오류가 발생했습니다:

I, [2023-01-18T08:05:48.701709 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'LOAD_PLUGINS=0 bundle exec rake plugin:pull_compatible_all'
I, [2023-01-18T08:05:52.431210 #1]  INFO -- :
I, [2023-01-18T08:05:52.431807 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
2023-01-18 08:05:59.081 UTC [1166] discourse@discourse ERROR:  could not create unique index "index_tags_on_name_ccnew_ccnew_ccnew5"
2023-01-18 08:05:59.081 UTC [1166] discourse@discourse DETAIL:  Key (name)=(vuejs) is duplicated.
2023-01-18 08:05:59.081 UTC [1166] discourse@discourse STATEMENT:  REINDEX INDEX CONCURRENTLY index_tags_on_name_ccnew_ccnew
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

PG::UniqueViolation: ERROR:  could not create unique index "index_tags_on_name_ccnew_ccnew_ccnew5"
DETAIL:  Key (name)=(vuejs) is duplicated.
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `async_exec'

포럼에는 유사한 문제가 있는 다른 토픽들(1, 2, 3)이 있지만, 컨테이너에 진입하려고 하면 다음과 같은 메시지가 표시됩니다:

/var/discourse# ./launcher enter app
x86_64 arch detected.
Error: No such container: app

따라서 인덱스를 수동으로 삭제할 수 없습니다.

다음으로 어떤 접근 방식을 취해야 할지 다른 조언이 있을까요?

Ionut님,

버그 제보해 주셔서 감사합니다. 이 문제를 확인해 보겠습니다. 다만, 데이터베이스에 인덱스 관련 문제가 있는 것으로 보이며, 최근 마이그레이션에서 이를 수정하려고 시도했지만, 일부 문제는 사람의 개입 없이는 해결할 수 없습니다.

실패하는 마이그레이션을 도입한 커밋은 아마도 이 커밋일 것입니다:

app.yml 파일을 편집하여 params 아래에 있는 version 키를 설정하고, Discourse 인스턴스를 이전 버전인 커밋 690e2f15ab9549486aaa6750e1093c1336bf17f2로 고정해 보실 수 있습니다. 해당 키가 주석 처리되어 있지 않도록 확인하세요!

그렇게 하면 모든 것이 정상적으로 시작되고 중복된 vuejs 태그를 제거할 수 있어야 합니다. 하지만 중복된 태그가 사용 중이라면 원치 않는 부작용이 발생할 수 있습니다. 더 나은 해결책을 찾기 위해 노력하겠지만, 그때까지는 이 방법으로 작동할 것입니다.

부팅 후 Data Explorer 플러그인을 사용하여 모든 중복 태그를 찾을 수 있었습니다:

SELECT name, count(*)
    FROM tags 
    GROUP BY name
     HAVING count(*) > 1

어떤 이유에서인지 약 10개의 중복 태그가 있었습니다. 왜, 그리고 어떻게 처음부터 그런 태그가 생성되었는지 궁금합니다…

드디어 그 골칫덩이들을 제거했고, yml 파일에서 버전 잠금을 해제한 후 다시 빌드하니 지금은 문제가 없는 것 같습니다.

감사합니다!

:+1:

과거에도 이런 상황을 목격한 적이 있습니다. 악몽 같은 문제이지만, 업그레이드와 관련된 문제로 한정되어 있습니다.

PG의 인덱스 구조는 설치 시 로케일에 따라 달라지며, 업그레이드 과정에서 때때로 악몽 같은 상황이 발생할 수 있습니다.

재인덱싱(reindex)을 충분히 일찍 수행하지 않으면 문제가 발생할 수 있습니다. 이전 PG 도커 업그레이드 중 일부는 이 작업을 수행하지 않았습니다… 그리고 일부 오래된 설치 환경에는 불행히도 시간 폭탄이 남아 있습니다.

이제는 생태계 내에서 대부분 해결되었지만, 여전히 일부 고통이 남아 있습니다.

원인을 더 정확히 파악하는 데 도움이 될 수 있으니, 시스템에 대한 추가 정보를 공유합니다:

설치 버전은 2014년부터 사용 중인 오래된 버전이지만, 시스템은 최소한 한 달에 한 번씩 업데이트됩니다(보통은 격주로). 따라서 주요 버전을 건너뛴 적은 없습니다.

버전 고정(lock)이 없으므로, 기본적으로 main 브랜치의 최신 사용 가능 버전을 실행 중입니다(무모한 도전!).

과거에 비공식 플러그인을 몇 개 시도해 본 적은 있지만, 현재 설치된 모든 플러그인은 공식 플러그인이며, 지난 5년 이상 이렇게 유지되어 왔습니다.

같은 문제를 겪고 있어서 이 문장까지 따라와 봤습니다.

실제로 중복 항목을 어떻게 제거하나요? Data Explorer에서 단순히 delete SQL 문장을 실행하는 건가요? 이 태그를 참조하는 외래 테이블 레코드들은 어떻게 처리하나요?

업데이트 1

update 문장을 실행할 수 없다는 것을 확인했습니다.

그래서 GUI를 사용하여 태그 이름을 단순히 변경했습니다.

태그를 편집하려면 /tag/foo로 이동한 후 이름을 변경하거나 삭제하세요.