Восстановление не удалось: `entity2char уже существует' RDS Postgres 13.7

Я пытаюсь восстановить базу данных, созданную на "Discourse 2.9.0.beta10 - https://github.com/discourse/discourse version 8d3fe3ddc5d38ab02a8f5c6aed7ebf7a6bcfbfec", в версию Discourse 2.9.0.beta12 - https://github.com/discourse/discourse version d4371a9ffcc6c727105a880b4b70c715ed0283cb. Обе версии используют RDS Postgres 13.7. Несжатая база данных занимает 126 ГБ, поэтому после нескольких дней убеждения, что для восстановления сжатой базы данных размером 30 ГБ мне нужен диск объёмом 200 ГБ, я получаю следующую ошибку:

...
SET
CREATE TYPE
ERROR:  функция "entity2char" уже существует с теми же типами аргументов
EXCEPTION: psql failed: ERROR:  функция "entity2char" уже существует с теми же типами аргументов
/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" уже существует ничего не даёт, и я не вижу функцию 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 в базе данных, из которой была сделана резервная копия, но не смог её обнаружить.

Какова история этого форума? На какой версии PostgreSQL и Discourse он был запущен? Был ли он когда-либо на Bitnami или у каких-то сомнительных хостеров?

Похоже, дамп базы данных по какой-то причине содержит ссылку на функцию entity2char. Её удаление должно исправить проблему, если в дампе нет других лишних элементов.

Есть ли у вас подсказка, как удалить его из существующей базы данных? Моя первая подсказка от Google не сработала.

Не удаляйте его из базы данных, удалите из резервной копии.

Я был в шаге от удаления этого из базы данных, так как кажется, что гораздо проще сделать то, что предлагает 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

Ага! Значит, проблема в том, что в промежуточной базе данных эта функция уже есть, и в резервной копии она тоже присутствует, а система слишком «глупа», чтобы понять, что это одна и та же функция.

Может, мне просто удалить и заново создать базу данных на промежуточном/целевом сервере?

Но ваша идея кажется немного проще.

РЕДАКТИРОВАНИЕ: ОК, я переименовал функцию и сейчас выполняю восстановление. Примерно через час я узнаю, сработало ли это.

И дело в том, что функция entity2char, которая переносится вместе с резервной копией, как-то не будет работать с существующей базой данных? Может, лучше создать новую базу данных и восстановить её туда? В любом случае, название xx-discourse-database-5 мне не очень нравится.

РЕДАКТИРОВАНИЕ: Ну, похоже, мне ещё предстоит отловить несколько кротов.

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

Возможно, начинать с новой базы данных — это правильный путь.

Решение заключалось в том, чтобы удалить, создать и выполнить миграцию базы данных перед восстановлением. Мне следовало попробовать пропустить шаг миграции.

Спасибо за помощь, @RGJ и @gerhard. Ваши подсказки помогли мне разобраться в этом.

Думаю, причина, по которой не стоит всегда сначала удалять базу данных, в том, что при сбое вы не сможете откатиться назад.