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?
./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.
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 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