"EXCEPTION : psql a échoué : DETAIL : La clé (post_id)=(36946) est dupliquée."

J’essaie de migrer mon serveur vers un nouvel hôte, j’ai donc téléchargé un fichier de sauvegarde et je l’ai téléversé sur le nouvel hôte. J’ai installé une nouvelle copie de Discourse et j’ai suivi les instructions pour le faire depuis la ligne de commande :

Malheureusement, la commande discourse restore databasename échoue avec :

ALTER TABLE
ALTER TABLE
ALTER TABLE
ERROR:  could not create unique index "posts_search_pkey"
DETAIL:  Key (post_id)=(36946) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (post_id)=(36946) is duplicated.
/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'

Il semble y avoir un problème avec le fichier de base de données ? Quelqu’un peut-il m’indiquer comment résoudre cette erreur ? J’ai toujours accès au serveur d’origine, qui semble fonctionner correctement.

Existe-t-il une commande SQL ou autre chose que je peux exécuter pour analyser (et corriger ?) la base de données avant de télécharger une sauvegarde ?

Il semble que vous ayez un index corrompu. Quelle version de postgres utilisez-vous ?

Il y a quelques sujets à ce sujet. Vous pouvez essayer de réindexer cette table sur l’instance en cours d’exécution, puis supprimer ou corriger les identifiants en double.

Oui, je pense qu’il est corrompu. J’adorerais que quelqu’un puisse me dire comment le réparer :slight_smile:

Postgres est 13.6. J’essaie de le déplacer vers une nouvelle instance sur un serveur différent.

J’ai essayé rake search:reindex à l’intérieur du conteneur Docker, et cela échoue avec :

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

Est-il possible de simplement supprimer l’enregistrement fautif et de réindexer ou quelque chose comme ça ?

Toute aide est appréciée !

Ouais, je recommande juste de supprimer la ligne, la façon la plus simple de procéder

2 « J'aime »

Quelqu’un peut-il me donner des commandes psql que je peux utiliser pour identifier et supprimer les lignes fautives ?

Merci, c’est apprécié !

Je pense que c’est quelque chose comme ça

./launcher enter app
su - postges
psql discourse
select id from post_search_data were post_id>86918 and post_id<86921;
--- quand vous obtenez l'id ----
delete from post_search_data where id=ID_FROM_LAST_QUERY

Il pourrait y avoir plus.

Peut-être que quelqu’un d’autre peut fournir plus d’aide, mais c’est à peu près tout ce que je pense pouvoir faire sans être connecté à votre serveur. Si vous avez besoin de plus d’aide, vous pouvez publier sur Marketplace ou me contacter directement.

Ou peut-être qu’il est sûr de simplement l’effacer et de le faire régénérer, mais je ne suis pas tout à fait sûr de cela.

Merci pour votre aide, les gars.

J’ai pu faire ce qui suit :

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

Une fois que tout semblait correct, j’ai effectué une sauvegarde complète et l’ai restaurée sur un nouveau serveur sans problème.

J’apprécie le temps de chacun. J’adore discourse !

Leçon apprise : vérifiez vos sauvegardes de temps en temps pour vous assurer qu’elles sont bonnes :slight_smile: Je conserve des sauvegardes quotidiennes, et aussi des « instantanés » mensuels. La sauvegarde la plus ancienne que j’avais sans base de données corrompue datait de 4 mois :frowning:

5 « J'aime »

Génial ! Je suis ravi que vous ayez réussi !

@sam Ce qui est troublant, c’est que je pensais que l’explication était qu’il s’agissait d’un problème avec PG<13, mais vous utilisez PG13.

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