업그레이드 실패 PG::UniqueViolation -- 고유 인덱스 "unique_post_links_ccnew"을(를) 생성할 수 없음

표준 설치 환경에서 2.8.0.beta2로 업그레이드하는 과정에서 다음과 같은 오류가 발생하고 있습니다:

PG::UniqueViolation: ERROR:  could not create unique index "unique_post_links_ccnew"

해당 오류는 아래 마이그레이션에서 발생했습니다:

I, [2021-06-25T18:35:47.756688 #1]  INFO -- : == 20210525112226 RemoveLengthConstrainFromTopicLinkUrl: migrating ============

손상된 인덱스처럼 보이지는 않습니다.

아래 정보가 도움이 될까요?

[6] pry(main)> TopicLink.where(url: bad_url).pluck(:id, :topic_id, :post_id, :user_id)
=> [[15733, 14351, 63616, 911], [16131, 14505, 63986, 911], [27141, 14505, 63986, 1152]]

결국 중복된 URL 뒤에 badX를 붙여서 처리했고, 그 후에는 정상적으로 작동했습니다. 다만 이 방식이 향후 어떤 문제를 일으킬 수 있을지 정확히 파악이 되지 않습니다…

우리의 경험상, 이전 버전의 Postgres에는 이른바 "불가능"하다고 여겨지던 인덱스 손상 버그가 꽤 많았습니다. 여전히 이런 문제가 발생하고 있나요?

pg12로 업그레이드한 이후로 본 적이 없는 것 같습니다.

우리는 PG13까지 전부 업데이트했고, 이게 (손상된 인덱스 문제를) 우리에게 거의 해결해 주었다고 생각합니다. @sam, 맞나요?

@saj 님이 이 문제의 원인을 파악했습니다. 우리는 인프라 측면에서 이를 해결했으며, 대부분의 셀프 호스터도 이미 우회 방법을 찾아 적용했습니다.

과거에 오픈소스 이미지에서 PostgreSQL(PG)을 업그레이드할 때 사용했던 메커니즘에는 PG 버전 간에 내부적으로 libc가 변경되는 문제로 인해 본질적인 안전성 문제가 있었습니다.

현재 이 문제는 생태계 전반에서 대부분 사라졌다고 보지만, 오래된 업그레이드 환경에서는 여전히 영향을 받을 수 있습니다. 기존 오픈소스 업그레이드 스크립트를 수정하고 방대한 PG 업그레이드 조합을 다루는 일은 매우 까다로울 것입니다.

그럼에도 불구하고 이제는 문제의 원인을 명확히 인지하고 있으므로, 향후 이를 더 효과적으로 대응할 수 있는 준비가 되어 있습니다.