استعادة فشل `entity2char موجود بالفعل' RDS Postgres 13.7

أحاول استعادة قاعدة بيانات تم إنشاؤها على \"Discourse 2.9.0.beta10 - https://github.com/discourse/discourse version 8d3fe3ddc5d38ab02a8f5c6aed7ebf7a6bcfbfec\"\u003e
واستعادتها إلى Discourse 2.9.0.beta12 - https://github.com/discourse/discourse version d4371a9ffcc6c727105a880b4b70c715ed0283cb\"\u003e. كلاهما يستخدم RDS Postgres 13.7. قاعدة البيانات غير المضغوطة بحجم 126 جيجابايت، لذلك بعد قضاء يومين في الاعتقاد بأنني بحاجة إلى قرص بحجم 200 جيجابايت لتشغيل هذه الاستعادة لقاعدة البيانات المضغوطة بحجم 30 جيجابايت، أحصل على هذا:

...
SET
CREATE TYPE
ERROR:  function "entity2char" already exists with same argument types
EXCEPTION: psql failed: ERROR:  function "entity2char" already exists with same argument types
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
...

البحث عن "entity2char" already exists لا يعثر على شيء ولا أرى entity2char في النواة أو أي من الإضافات. ولا أراها في retort أيضًا، والتي كنت آمل في إلقاء اللوم عليها، لكن إزالتها لم تساعد.

هذه هي الإضافات:

         - git clone https://github.com/discourse/discourse-adplugin.git
         - git clone https://github.com/discourse/discourse-affiliate.git
         - git clone https://github.com/discourse/discourse-bbcode.git
         - git clone https://github.com/discourse/discourse-canned-replies.git
         - git clone https://github.com/discourse/discourse-data-explorer.git
         - git clone https://github.com/discourse/discourse-prometheus.git
         - git clone https://github.com/discourse/discourse-push-notifications.git
         - git clone https://github.com/discourse/discourse-signatures.git
         - git clone https://github.com/discourse/discourse-user-notes.git
         - git clone https://github.com/discourse/discourse-spoiler-alert.git
         - git clone https://github.com/discourse/discourse-cakeday.git
         - git clone https://github.com/discourse/discourse-checklist.git
         - git clone https://github.com/discourse/discourse-calendar.git
         - git clone https://github.com/discourse/discourse-reactions.git

وحاولت البحث عن دالة entity2char في قاعدة البيانات التي قمت بعمل نسخة احتياطية منها ولم أتمكن من العثور عليها.

ما هو تاريخ هذا المنتدى؟ على أي إصدارات من Postgres و Discourse بدأ؟ هل كان على Bitnami أو أحد تلك الاستضافات المشبوهة؟

إعجاب واحد (1)

يبدو أن تفريغ قاعدة البيانات يحتوي على مرجع لدالة entity2char لسبب ما. إزالتها يجب أن تجعلها تعمل ما لم يكن هناك أشياء أخرى في التفريغ لا ينبغي أن تكون هناك.

إعجاب واحد (1)

هل لديك تلميح حول كيفية إزالته من قاعدة البيانات الحالية؟ أول تلميح لي من جوجل لم ينجح.

لا تقم بإزالته من قاعدة البيانات، بل قم بإزالته من النسخة الاحتياطية.

كنت على بعد ثوانٍ من حذفه من قاعدة البيانات، حيث يبدو أنه من الأسهل بكثير القيام بأي شيء لدى SQL لـ

   drop function entity2char;

تمكنت من سردها باستخدام \\df
هل تعتقد أنه إذا قمت بإزالته من قاعدة البيانات فسوف يتسبب ذلك في تعطل شيء ما؟
انتظر. . . . والنقطة من هذا التمرين لاستعادة قاعدة بيانات الإنتاج إلى الصورة الجديدة التي أود إطلاقها هي التأكد من أن discourse سيعمل مع قاعدة بيانات الإنتاج الحالية عند تثبيت أحدث إصدار من Discourse وترحيل قاعدة البيانات، لذلك فإن تعديل قاعدة البيانات لاستعادتها على مرحلة الاختبار لا معنى له.

نعم بالضبط هذا

وهذا :wink:

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

لذلك (على قاعدة البيانات الهدف)

  • ALTER FUNCTION entity2char RENAME TO e2c_outoftheway
  • استعادة
  • ALTER FUNCTION entity2char RENAME TO e2c_from_backup
  • ALTER FUNCTION e2c_outoftheway RENAME TO entity2char
إعجاب واحد (1)

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

ربما يجب علي فقط إسقاط قاعدة البيانات وإنشائها في موقع المرحلة/الهدف؟

لكن فكرتك تبدو أسهل قليلاً.

تعديل: حسنًا، لقد أعدت تسمية الدالة وأقوم بالاستعادة الآن. في غضون ساعة تقريبًا، يمكنني معرفة ما إذا كانت قد نجحت.

والقلق هو أن دالة entity2char التي يتم نقلها مع النسخة الاحتياطية لن تعمل بطريقة ما مع قاعدة البيانات الموجودة؟ ربما يجب علي فقط إنشاء قاعدة بيانات جديدة تمامًا واستعادتها إليها. أنا لست من المعجبين الحقيقيين بالاسم xx-discourse-database-5 على أي حال.

تعديل: حسنًا، يبدو أن هناك المزيد من المشاكل التي سأحتاج إلى معالجتها.

ERROR:  function "replace_mentions" already exists with same argument types

ربما البدء بقاعدة بيانات جديدة هو الحل.

كان الحل هو حذف قاعدة البيانات وإنشائها وترحيلها قبل إجراء الاستعادة. كان ينبغي عليّ محاولة تخطي خطوة الترحيل.

شكرًا لمساعدتكما، @RGJ و @gerhard. كانت تلميحاتكما مفيدة في فهمي لهذا الأمر.

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

إعجاب واحد (1)