EXCEPCIÓN: psql falló: DETALLE: La clave (post_id)=(36946) está duplicada.

Estoy intentando migrar mi servidor a un nuevo host, así que descargué un archivo de copia de seguridad y lo subí al nuevo host. Instalé una copia nueva de Discourse y seguí las instrucciones para hacerlo desde la línea de comandos:

Desafortunadamente, el comando discourse restore databasename falla con:

ALTER TABLE
ALTER TABLE
ALTER TABLE
ERROR:  no se pudo crear el índice único «posts_search_pkey»
DETAIL:  La clave (post_id)=(36946) está duplicada.
EXCEPTION: psql falló: DETAIL:  La clave (post_id)=(36946) está duplicada.
/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'

¿Parece que hay algo mal con el archivo de la base de datos? ¿Alguien puede darme alguna indicación sobre cómo puedo solucionar este error? Todavía tengo acceso al servidor original, que parece estar funcionando bien.

¿Hay algún comando SQL o algo que pueda ejecutar que analice (¿y arregle?) la base de datos antes de descargar una copia de seguridad?

Parece que tienes un índice dañado. ¿Qué versión de postgres es esta?

Hay varios temas sobre esto. Puedes intentar volver a indexar esa tabla en la instancia en ejecución y luego eliminar o corregir los ID duplicados.

Sí, creo que está corrupto. Me encantaría que alguien me dijera cómo arreglarlo :slight_smile:

Postgres es 13.6. Estoy intentando moverlo a una nueva instancia en un servidor diferente.

Intenté rake search:reindex dentro del contenedor docker, y falla con:

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

¿Es posible simplemente eliminar el registro infractor y volver a indexar o algo así?

¡Cualquier ayuda es apreciada!

Sí, recomiendo simplemente eliminar la fila, es la forma más sencilla de seguir adelante.

2 Me gusta

¿Alguien puede darme algunos comandos de psql que pueda usar para identificar y eliminar las filas problemáticas?

¡Gracias, se agradece!

Creo que es algo así como

./launcher enter app
su - postges
psql discourse
select id from post_search_data were post_id>86918 and post_id<86921;
--- cuando obtengas el id ----
delete from post_search_data where id=ID_FROM_LAST_QUERY

Podría haber más.

Quizás alguien más pueda brindar más ayuda, pero eso es todo lo que creo que puedo hacer sin estar conectado a tu servidor. Si necesitas más ayuda, puedes publicar en Marketplace o contactarme directamente.

O quizás sea seguro simplemente borrarlo y que se regenere, pero no estoy muy seguro de eso.

Gracias por la ayuda, chicos.

Pude hacer lo siguiente:

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

Una vez que todo pareció estar bien, hice una copia de seguridad completa y la restauré en un servidor nuevo sin problemas.

Agradezco el tiempo de todos. ¡Me encanta Discourse!

Lección aprendida: revisa las copias de seguridad de vez en cuando para asegurarte de que estén bien :slight_smile: Mantengo copias de seguridad diarias y también “instantáneas” mensuales. La copia de seguridad más antigua que tenía que no tenía una base de datos corrupta tenía 4 meses :frowning:

5 Me gusta

¡Genial! ¡Me alegro mucho de que lo hayas conseguido!

@sam Lo preocupante es que pensé que la explicación era que esto era un problema con PG<13, pero tú estás ejecutando PG13.

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