Échec de la mise à jour lors de la migration

Bonjour,

Nous essayons de mettre à jour une très ancienne installation de Discourse (v1.2.4) vers la dernière version v2.3.1. Nos premières migrations de test utilisant la v2.2.0 se sont déroulées de manière surprenante et le processus de migration s’est terminé sans aucun problème.
Mais maintenant, nous tentons d’exécuter cela dans les étapes finales contre la v2.3.1 et nous obtenons l’erreur suivante :

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "idx_unique_rows"
DETAIL:  Key (action_type, user_id, target_topic_id, target_post_id, acting_user_id)=(15, 1140990, 9346002, 9431164, 419835) already exists.
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.0.2/lib/patches/db/pg.rb:110:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.0.2/lib/patches/db/pg.rb:110:in `async_exec'
(eval):24:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_sql-0.2.2/lib/mini_sql/postgres/connection.rb:118:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mini_sql-0.2.2/lib/mini_sql/postgres/connection.rb:90:in `exec'
/var/www/discourse/plugins/discourse-solved/plugin.rb:64:in `block in activate!'
/var/www/discourse/lib/plugin/instance.rb:328:in `block in notify_after_initialize'
/var/www/discourse/lib/plugin/instance.rb:326:in `each'
/var/www/discourse/lib/plugin/instance.rb:326:in `notify_after_initialize'
/var/www/discourse/config/application.rb:292:in `each'
/var/www/discourse/config/application.rb:292:in `block in <class:Application>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/lazy_load_hooks.rb:69:in `block in execute_hook'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/lazy_load_hooks.rb:62:in `with_execution_control'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/lazy_load_hooks.rb:67:in `execute_hook'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/lazy_load_hooks.rb:52:in `block in run_load_hooks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/lazy_load_hooks.rb:51:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/lazy_load_hooks.rb:51:in `run_load_hooks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/application/finisher.rb:75:in `block in <module:Finisher>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/initializable.rb:32:in `instance_exec'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/initializable.rb:32:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/initializable.rb:61:in `block in run_initializers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/initializable.rb:60:in `run_initializers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/application.rb:361:in `initialize!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/config/environment.rb:7:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291:in `block in require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:257:in `load_dependency'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291:in `require'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/application.rb:337:in `require_environment!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-5.2.3/lib/rails/application.rb:520:in `block in run_tasks_blocks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
/var/www/discourse/bin/bundle:5:in `load'
/var/www/discourse/bin/bundle:5:in `<main>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)

Cela semble être causé par “20120816050526_add_unique_constraint_to_user_actions.rb” et si je regarde dans la table de base de données “schema_migrations”, il semble que cela ait déjà été appliqué. Comme cette migration semble avoir été ajoutée en 2012.

Avez-vous des idées sur la raison pour laquelle “bundle exec rake db:migrate” exécute des migrations déjà appliquées ou sur ce que nous faisons de mal ?
Je sais que la version source est assez ancienne, mais comme mentionné, nous avons déjà obtenu des résultats réussis.

Cordialement

J’ai mal interprété cette erreur. Toutes mes excuses pour la confusion. Évidemment, cela n’a rien à voir avec le fichier de migration mentionné.
Quoi qu’il en soit, il semble qu’il existe déjà un index pour une entrée dans user_actions. J’ai donc vérifié cela avec :

SELECT *
FROM user_actions
WHERE action_type=15
    AND user_id=1140990
    AND target_topic_id=9346002
    AND target_post_id=9431164
    AND acting_user_id=419835;

Cette requête me renvoie 0 résultat. Il doit donc exister un index sans jeu de données correspondant.

Quand j’ai rencontré des problèmes similaires, j’ai supprimé l’élément qu’il tentait de dupliquer. Cela n’est probablement pas très utile.

Ou peut-être assurez-vous d’être en mode lecture seule lorsque vous effectuez la sauvegarde ?

Ou peut-être assurez-vous d’être en mode lecture seule lors de la sauvegarde ?

Oui, c’est peut-être le problème. Nous avons créé le dump alors que la base de données était en cours d’utilisation. Cela a fonctionné du premier coup. Je vais en créer un autre et réessayer.

Bonjour. Il semble que notre table user_actions ait été corrompue. J’ai pu la réparer en exécutant VACUUM (VERBOSE,ANALYZE,DISABLE_PAGE_SKIPPING) user_actions. Merci tout de même pour votre conseil !
Plusieurs entrées manquaient dans la carte de visibilité, ce qui a généré des clés dupliquées.