약 3주 전 최신 버전으로 업그레이드 중 마이그레이션 실패

1개의 마이그레이션이 실패했습니다!

Failed to migrate default
#<StandardError: An error has occurred, all later migrations canceled:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_user_emails_on_email"
DETAIL:  Key (lower(email::text))=(talk@remobjects.com<mailto:talk@remobjects.com) already exists.
>
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.3/lib/patches/db/pg.rb:110:in `exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.3/lib/patches/db/pg.rb:110:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-6.1.4.1/lib/active_record/connection_adapters/postgresql/database_st



== 20211201221028 MigrateEmailToNormalizedEmail: migrating ====================
-- execute("UPDATE user_emails\nSET normalized_email = REPLACE(REGEXP_REPLACE(email,'([+@].*)',''),'.','') || REGEXP_REPLACE(email, '[^@]*', '')\nWHERE (normalized_email IS NULL OR normalized_email <> (REPLACE(REGEXP_REPLACE(email,'([+@].*)',''),'.','') || REGEXP_REPLACE(email, '[^@]*', '')))\n  AND (id >= -2 AND id < 7155)\n")
Migrating secondsite
Docker Manager: FAILED TO UPGRADE
#<RuntimeError: RuntimeError>

이 문제를 해결하는 방법에 대해 아시는 분 계신가요?

아… PG의 주요 버전 업그레이드에서 이런 문제를 이전에 여러 번 본 적이 있습니다. @saj가 최근 이 문제에 대해 작업을 진행한 적이 있습니다.

정리하자면, PG 업그레이드 시 libc 변경으로 인해 DB의 정렬 규칙(collation)이 보이지 않는 곳에서 변경되는 경우가 있습니다. 이 경우 선택의 여지 없이 재인덱싱을 수행해야 합니다.

사용자에게 발생한 문제는 다음과 같습니다:

  1. 주요 버전 업그레이드를 수행했습니다.
  2. 인덱스가 일부 손상되었습니다.
  3. talk@remobjects.com 사용자에 대한 두 번째 삽입(insert)이 발생했습니다. 인덱스가 이를 허용하지 않음에도 불구하고 중복된 행이 생성되었습니다.
  4. 해당 행을 수정(touch)하려 했으나, 무관한 컬럼을 업데이트할 수 없어 이 문제가 드러났습니다.

해결 방법은 다음과 같습니다:

  • talk@remobjects.com 이메일을 공유하는 두 사용자의 사용자 ID를 찾아보세요.
  • 그중 한 사용자의 이메일을 삭제하거나 변경하세요.
  • 원래 계획대로 진행하세요.
  • 다른 문제를 찾기 위해 서둘러 전체 DB 재인덱싱을 수행하세요.

귀하의 해결책으로 문제가 해결되기는 했지만, "업그레이드"는 이미 지나갔습니다(더 이상 업데이트가 없음). 이 마이그레이션을 다시 실행하려면 특별히 해야 할 일이 있나요? 중복된 이메일은 당연히 삭제했습니다.

네, db 재인덱싱을 꼭 실행하세요.

다음과 같이 시도해 보세요:

REINDEX DATABASE VERBOSE

인덱스가 모두 정상적인 상태인지 확인하려면 이 작업을 수행하는 것이 매우 중요합니다.

이런 문제에 직면하기 전에, 포럼이 “건강한” 상태인지 주기적으로 확인할 수 있는 방법이 있을까요?