EXCEPTION: psql 실패: DETAIL: Key (post_id)=(36946) 이(가) 중복됩니다.

서버를 새로운 호스트로 이전하려고 시도 중입니다. 백업 파일을 다운로드하여 새 호스트에 업로드했습니다. 그 후 discourse를 새로 설치하고, 명령줄에서 다음 안내에 따라 진행했습니다:

불행히도 discourse restore databasename 명령은 다음과 같은 오류로 실패합니다:

ALTER TABLE
ALTER TABLE
ALTER TABLE
ERROR:  could not create unique index "posts_search_pkey"
DETAIL:  Key (post_id)=(36946) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (post_id)=(36946) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:149:in `restore'

데이터베이스 파일에 문제가 있는 것 같습니다. 이 오류를 수정하는 방법에 대한 방향을 알려줄 수 있는 분 있으신가요? 원본 서버에 여전히 접근할 수 있으며, 정상적으로 작동하는 것으로 보입니다.

백업을 다운로드하기 전에 데이터베이스를 분석(및 수정?)할 수 있는 SQL 명령이나 다른 방법이 있을까요?

손상된 인덱스가 있는 것 같습니다. postgres 버전은 무엇인가요?

이와 관련된 몇 가지 주제가 있습니다. 실행 중인 인스턴스에서 해당 테이블을 다시 인덱싱한 후 중복된 ID를 삭제하거나 수정해 볼 수 있습니다.

네, 손상된 것 같습니다. :slight_smile:

누군가 어떻게 수정할 수 있는지 알려주시면 좋겠습니다.

Postgres 버전은 13.6입니다. 다른 서버의 새 인스턴스로 이전하려고 하고 있습니다.

docker 컨테이너 안에서 rake search:reindex를 시도해 보았는데, 다음과 같이 실패합니다:

........rake aborted!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "posts_search_pkey"
DETAIL:  Key (post_id)=(86919) already exists.

문제가 되는 레코드만 삭제하고 다시 색인화하는 것이 가능할까요?

도움 주시면 감사하겠습니다!

네, 행을 그냥 삭제하는 걸 추천해요. 그게 가장 간단한 방법이에요.

문제가 되는 행을 식별하고 삭제하는 데 사용할 수 있는 psql 명령어를 알려주시는 분 계신가요?

감사합니다, 정말 감사하겠습니다!

아래와 같은 내용일 것 같습니다.

./launcher enter app
su - postges
psql discourse
select id from post_search_data were post_id>86918 and post_id<86921;
--- id를 얻은 후 ----
delete from post_search_data where id=ID_FROM_LAST_QUERY

더 많은 작업이 필요할 수 있습니다.

다른 누군가가 더 많은 도움을 줄 수 있겠지만, 서버에 로그인하지 않은 상태에서는 제가 할 수 있는 것은 이 정도입니다. 더 많은 도움이 필요하시다면 Marketplace 채널에 게시하거나 저에게 직접 연락해 주세요.

아니면 그냥 지우고 재생성되도록 두는 것이 안전할 수도 있지만, 그 부분은 확신하지 못하겠습니다.

도와주셔서 감사합니다.

다음과 같이 처리할 수 있었습니다:

discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew2"
DETAIL:  Key (post_id)=(116038) is duplicated.
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 2
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 0
discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew3"
DETAIL:  Key (post_id)=(9336) is duplicated.
discourse=# delete from post_search_data
where post_id = 9336;
DELETE 1
.
.
.
.
discourse=# reindex index concurrently "posts_search_pkey";
REINDEX

모든 것이 정상으로 보였을 때, 전체 백업을 수행하고 새 서버에 문제 없이 복원했습니다.

모든 분들의 시간 내어주심에 감사드립니다. discourse를 정말 좋아합니다!

배운 교훈: 가끔은 백업이 제대로 되어 있는지 확인해야 합니다 :slight_smile: 저는 매일 백업을 수행하고, 월간 "스냅샷"도 함께 유지하고 있습니다. 손상되지 않은 데이터베이스를 가진 가장 오래된 백업은 4개월 전 것이었습니다 :slight_smile:

좋아요! 해결되어서 정말 기쁩니다!

@sam 이상한 점은, 이것이 PG<13 관련 문제라는 설명을 믿고 있었는데, 당신은 PG13을 사용 중이라는 점입니다.