Upgrade schlägt während der Migration fehl

Hallo,

wir versuchen, eine sehr alte Discourse-Installation (v1.2.4) auf die neueste Version 2.3.1 zu aktualisieren. Unsere ersten Test-Migrationen mit v2.2.0 verliefen überraschend gut, und der Migrationsprozess wurde ohne Probleme abgeschlossen.
Nun versuchen wir jedoch, den Prozess in den letzten Stufen gegen v2.3.1 auszuführen, und erhalten folgenden Fehler:

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)

Dies scheint durch „20120816050526_add_unique_constraint_to_user_actions.rb" verursacht zu werden. Wenn ich mir die Tabelle „schema_migrations" in der Datenbank anschaue, scheint diese Migration bereits angewendet worden zu sein. Diese Migration wurde offenbar bereits 2012 hinzugefügt.

Haben Sie eine Idee, warum „bundle exec rake db:migrate" bereits angewendete Migrationen erneut ausführt, oder was wir falsch machen?
Ich weiß, dass die Quellversion ziemlich alt ist, aber wie bereits erwähnt, haben wir bereits erfolgreiche Ergebnisse erzielt.

Mit freundlichen Grüßen

Ich habe diesen Fehler missverstanden. Entschuldigung für die Verwirrung. Offensichtlich hat das nichts mit der erwähnten Migrationsdatei zu tun.
Jedenfalls scheint es einen vorhandenen Index für einen Eintrag in user_actions zu geben. Ich habe das mit folgender Abfrage überprüft:

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;

Diese Abfrage liefert 0 Ergebnisse. Es muss also einen Index ohne zugehörigen Datensatz geben.

Wenn ich ähnliche Probleme hatte, habe ich das Objekt gelöscht, das dupliziert werden sollte. Das ist wahrscheinlich nicht sehr hilfreich.

Oder vielleicht solltest du sicherstellen, dass du beim Erstellen des Backups im Nur-Lese-Modus warst?

Oder stellen Sie vielleicht sicher, dass Sie beim Erstellen des Backups im Nur-Lese-Modus waren?\n\nJa, das könnte das Problem sein. Wir haben den Dump erstellt, während die Datenbank in Benutzung war. Beim ersten Versuch hat es funktioniert. Ich werde einen weiteren erstellen und es erneut versuchen.

Hallo. Es scheint, als wäre unsere user_actions-Tabelle beschädigt worden. Ich konnte das beheben, indem ich VACUUM (VERBOSE,ANALYZE,DISABLE_PAGE_SKIPPING) user_actions ausgeführt habe. Trotzdem vielen Dank für deinen Rat!
Es fehlten mehrere Einträge in der Sichtbarkeitskarte, was zu doppelten Schlüsseln führte.