Fallo en la migración al actualizar a la última versión de hace ~3 semanas

¡Fallaron 1 migraciones!

Falló la migración predeterminada
#<StandardError: Ha ocurrido un error, todas las migraciones posteriores se cancelaron:

PG::UniqueViolation: ERROR:  se viola el valor de clave duplicado en la restricción única «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>

¿Alguien sabe qué puedo hacer para superar esto?

Oh … ya hemos visto esto antes en las actualizaciones de versiones principales de PG. @saj trabajó recientemente en algo aquí.

La larga historia es que en algunas actualizaciones de PG, la intercalación de la base de datos cambia y se debe a que libc cambia cosas. No tienes más remedio que volver a indexar.

Lo que te pasó es que:

  1. Hiciste una actualización importante
  2. Tu índice se corrompió un poco
  3. Se realizó una segunda inserción de un usuario para talk@remobjects.com - ahora tienes una fila duplicada a pesar de que el índice lo prohíbe.
  4. Tocamos la fila y esto resalta el problema porque no puede actualizar una columna no relacionada.

La solución es:

  • Encuentra los IDs de los 2 usuarios que comparten el correo electrónico talk@remobjects.com.
  • Elimina o renombra el correo electrónico de uno de ellos.
  • Continúa como estaba planeado.
  • Realiza una reindexación completa de la base de datos urgentemente para detectar otros problemas.

Tu solución lo resolvió, pero la “actualización” ya pasó (y no hay más actualizaciones); ¿necesito hacer algo especial para volver a ejecutar estas migraciones? Yo, por supuesto, eliminé los correos electrónicos duplicados.

Sí, asegúrate de ejecutar una reindexación de la base de datos

Intenta:

REINDEX DATABASE VERBOSE

Es fundamental que lo hagas para asegurarte de que tus índices estén en buen estado.

1 me gusta

¿Hay alguna forma de comprobar que un foro está "sano" de vez en cuando, antes de encontrarse con este tipo de problemas?

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.