فشل الترقية أثناء الهجرة

مرحبًا،

نحن نحاول تحديث تثبيت قديم جدًا من Discourse (الإصدار 1.2.4) إلى أحدث إصدار v2.3.1. كانت هجرات الاختبار الأولى التي قمنا بها باستخدام الإصدار 2.2.0 ناجحة بشكل مفاجئ، وانتهت عملية الهجرة دون أي مشاكل.
لكننا الآن نحاول تشغيلها في المراحل النهائية مقابل الإصدار 2.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” لهجرات تم تطبيقها بالفعل، أو ما الذي نفعله بشكل خاطئ؟
أعلم أن إصدار المصدر قديم جدًا، ولكن كما ذكرت، حصلنا بالفعل على نتائج ناجحة.

مع خالص التحية

لقد فسّرت خطأً هذا الخطأ. آسف جدًا على الالتباس. من الواضح أنه لا علاقة له بملف الهجرة المذكور. على أي حال، يبدو أن هناك فهرسًا موجودًا لإدخال في user_actions. لذا قمت بفحص ذلك باستخدام:

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;

تعطي هذه الاستعلام 0 نتائج. إذن يجب أن يكون هناك فهرس بدون مجموعة بيانات مقابلة له.

عندما واجهتُ مشاكل مشابهة، قمتُ بحذف العنصر الذي كان يحاول نسخه. وهذا على الأرجح ليس مفيدًا جدًا.

أو ربما تأكد من أنك في وضع القراءة فقط عند إجراء النسخة الاحتياطية؟

أو ربما تأكد من أنك في وضع القراءة فقط عند إجراء النسخ الاحتياطي؟

نعم، ربما هذه هي المشكلة. قمنا بإنشاء الملف المصدري بينما كانت قاعدة البيانات قيد الاستخدام. نجح في المحاولة الأولى. سأقوم بإنشاء آخر مرة وأحاول مرة أخرى.

مرحبًا. بدا أن جدول user_actions لدينا تالف. تمكنت من إصلاح ذلك بتشغيل VACUUM (VERBOSE,ANALYZE,DISABLE_PAGE_SKIPPING) user_actions. لكن شكرًا لك على نصيحتك! كانت هناك عدة إدخالات مفقودة من خريطة الرؤية مما أدى إلى مفاتيح مكررة.