Миграция не удалась при обновлении до последней версии от ~3 недель назад

Не удалось выполнить 1 миграцию!

Не удалось выполнить миграцию по умолчанию
<StandardError: Произошла ошибка, все последующие миграции отменены:

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>

Подскажите, пожалуйста, что можно сделать, чтобы преодолеть эту проблему?

Ох… мы уже сталкивались с этим при крупных обновлениях версий PostgreSQL. @saj недавно работал над чем-то подобным здесь.

Если говорить подробно, то при некоторых обновлениях PostgreSQL настройки сортировки базы данных могут измениться из-за обновлений в libc. В таком случае у вас не остаётся выбора — необходимо выполнить переиндексацию.

Вот что произошло в вашем случае:

  1. Вы выполнили крупное обновление.
  2. Ваш индекс стал частично повреждённым.
  3. Была выполнена повторная вставка пользователя для talk@remobjects.com — теперь у вас есть дублирующаяся строка, несмотря на то что индекс это запрещает.
  4. Мы попытались изменить строку, и это выявило проблему, так как система не смогла обновить несвязанное поле.

Решение:

  • Найдите идентификаторы двух пользователей, у которых указан один и тот же адрес электронной почты talk@remobjects.com.
  • Удалите или измените адрес электронной почты у одного из них.
  • Продолжайте работу по плану.
  • Срочно выполните полную переиндексацию базы данных, чтобы выявить другие возможные проблемы.

Ваше решение помогло, но «апгрейд» уже завершился (обновлений больше нет). Нужно ли мне что-то особенное сделать, чтобы перезапустить эти миграции? Я, конечно, удалил дубликаты email-адресов.

Да, обязательно выполните перестроение индексов базы данных.

Попробуйте:

REINDEX DATABASE VERBOSE

Это критически важно для того, чтобы убедиться, что все ваши индексы находятся в рабочем состоянии.

Есть ли способ периодически проверять, что форум «здоров», чтобы не столкнуться с подобной проблемой?