移行中にアップグレードが失敗

こんにちは、

Discourse の非常に古いバージョン(v1.2.4)を最新バージョン(v2.3.1)に更新しようとしています。まず v2.2.0 を使用してテスト移行を行ったところ、予想外にうまくいき、移行プロセスは問題なく完了しました。

しかし、最終段階で v2.3.1 に対して同じ操作を実行すると、以下のエラーが発生します。

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)

このエラーは「20120816050526_add_unique_constraint_to_user_actions.rb」というマイグレーションファイルが原因のようです。データベースの「schema_migrations」テーブルを確認すると、このマイグレーションは既に適用されているようです。このマイグレーションは 2012 年に追加されたもののようです。

なぜ「bundle exec rake db:migrate」が既に適用済みのマイグレーションを実行しているのか、あるいは何が間違っているのか、ご存知でしょうか?
ソースのバージョンはかなり古いことは承知していますが、前述の通り、テスト移行では成功していました。

よろしくお願いいたします。

I’ve misinterpreted this error. So sorry for the confusion. Obviously it has nothing to do with the mentioned migration-file.
Anyway, there seems to be an existing index for an entry in user_actions. So I checked that with:

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;

This query gives me 0 Results. So there must be an index without a corresponding dataset.

When I’ve had similar problems I’ve deleted the thing that it was trying to duplicate. That’s likely not very helpful.

Or maybe make sure that you were in read-only when you make the backup?

「いいね!」 3

Or maybe make sure that you were in read-only when you make the backup?

Yes maybe that’s the problem. We’ve created the dump while the database was in use. Worked at the first try. I’ll create another one and try again.

「いいね!」 1

Hi. It seemed our user_actions table got corrupted. I could fix that by running VACUUM (VERBOSE,ANALYZE,DISABLE_PAGE_SKIPPING) user_actions. But thanks anyway for your advise!
There where several entries missing from the visibility map which produced duplicated keys.

「いいね!」 2