استعادة النسخة الاحتياطية فشلت: فشل في إنشاء فهرس postgres

مرحبًا بالجميع،

لقد قمت بتشغيل Discourse بسلاسة لسنوات عديدة.

اليوم، حاولت إجراء ترقية عبر واجهة الويب من إصدار 2.4.0beta-شيء ما إلى الإصدار الحالي (2.5.0beta5). لم تسر الأمور على ما يرام. لم أقم بتدوين ملاحظات جيدة، لكن يبدو أن PostgreSQL لم يبدأ بشكل صحيح بسبب أن مجلد بيانات postgres ليس مملوكًا للمستخدم الصحيح.

ظننت أنني سأحاول استنساخ حاوياتي القديمة وملف app.yml إلى app2 والاستعادة من نسخة احتياطية. تم بناء الحاوية الجديدة وتبعيت التعليمات الخاصة بتشغيل نسخة احتياطية من سطر الأوامر (Restore a backup from the command line - #12). يفشل الأمر “discourse restore ” بالخطأ التالي:

ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL:  Key (path, incoming_domain_id)=(//viewer/, 16) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(//viewer/, 16) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:95:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:49:in `run'
script/discourse:143:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
script/discourse:284:in `<top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Trying to rollback...
Rolling back...
Cleaning stuff up...

أي اقتراحات حول كيفية المتابعة ستكون موضع ترحيب كبير.

شكرًا!
–دستين

مرحبًا داستن. نأسف لسماع أنك تواجه مشكلة.

لديك فهرس تالف. يرجى الاطلاع على PostgreSQL 12 update - #238.

شكرًا لك على ردك. في النهاية، بدلاً من محاولة إنشاء تطبيق جديد واستعادته من نسخة احتياطية، عدت إلى تطبيقي الأصلي وقمت بتشغيل الأمر ./launcher rebuild app عدة مرات (بصلاحيات الجذر root، وهو ما لم أكن لأظن أنه ضروري، لكنني أعتقد أنني قمت بإعداد موقعي بصلاحيات الجذر root في الأصل، لذا فإن هذا منطقي)، والآن عاد موقعي للعمل! رائع!

تذكّرني ألا ألمس زر “الترقية” الذي يبدو وديعًا دون داعٍ أبدًا!

شكرًا،
–داستن

ما زال لديك الفهرس التالف. ما زلت تريد ألا يكون تالفًا.

واو، سيكون فعلاً رائعاً لو أن عملية الترقية يمكنها معالجة بعض هذه المشكلات!

إذًا، بعد تثبيت إضافة مستكشف البيانات والتجول في فهرس incoming_referers، وحذف الفهارس الأخرى المدرجة في الاستعلام هنا:

لكنني ما زلت أحصل على:

discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING:  cannot reindex invalid index "pg_toast.pg_toast_19337_index_ccnew" concurrently, skipping
WARNING:  cannot reindex invalid index "pg_toast.pg_toast_19337_index_ccnew1" concurrently, skipping

وهذه لا تريد أن تُحذف!

# drop index pg_toast_19337_index_ccnew1;
ERROR:  index "pg_toast_19337_index_ccnew1" does not exist

أوه، تحتاج إلى بادئة pg_toast:

discourse=# drop index pg_toast.pg_toast_19337_index_ccnew1;
DROP INDEX
discourse=# drop index pg_toast.pg_toast_19337_index_ccnew;
DROP INDEX
discourse=# REINDEX SCHEMA CONCURRENTLY public;
REINDEX

نعم، نولي اهتمامًا وثيقًا لمشكلة الفهارس التالفة، ونعتذر عن الصعوبات التي واجهتها. نظريًا، لا ينبغي أن يكون هذا ممكنًا، لكنكما تعلمون ما يُقال عن الفرق بين النظرية والتطبيق. أتمنى أن يكون إصدار PG12 أكثر مقاومةً لـ… مهما يكن هذا الأمر.

هذا خبر جيد. هذا في الأساس أول عثرة في الطريق واجهتها بعد سنوات من الاستخدام الذي لا يتطلب اهتمامًا (فغالبًا ما أنسى حتى الجهاز الذي يعمل عليه).
شكرًا لك،
–دستين