RDS Postgres 13.7 の `entity2char` が既に存在するため、復元に失敗しました

"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 を使用しています。展開されていないデータベースは 126GB なので、30GB の圧縮データベースの復元を実行するために 200GB のディスクが必要だと信じて数日費やした後、以下のエラーが発生しました。

...
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

既存のデータベースから削除する方法について、何かヒントはありますか?最初のGoogle検索ではうまくいきませんでした。

データベースから削除せず、バックアップから削除してください。

データベースから削除するところでした。SQL の drop function entity2char; の方がはるかに簡単に見えます。

\df で一覧表示できました。

データベースから削除しても何か問題が発生すると思いますか?

待ってください…そして、本番データベースを起動したい新しいイメージに復元するというこの演習の目的は、最新の Discourse をインストールしてデータベースを移行するときに、Discourse が既存の本番データベースで機能することを確認することです。そのため、ステージングで復元するためにデータベースを変更しても意味がありません。

はい、まさにその通りです。

そして、これです :wink:

機能するかもしれないのは、復元する直前にターゲットデータベースインスタンスで関数名を変更してみることです。ただし、これはテストしていません。

したがって、(ターゲットDBで)

  • ALTER FUNCTION entity2char RENAME TO e2c_outoftheway
  • 復元
  • ALTER FUNCTION entity2char RENAME TO e2c_from_backup
  • ALTER FUNCTION e2c_outoftheway RENAME TO entity2char
「いいね!」 1

ああ!つまり、ステージングデータベースにすでにその関数があり、バックアップにもその関数が含まれていて、それが同じ関数であると認識できないほど愚かだということですか?

ステージング/ターゲットサイトのデータベースを削除して再作成した方がいいのでしょうか?

しかし、あなたのアイデアの方が簡単そうです。

編集:わかりました、関数名を変更して、現在復元中です。約1時間後にそれが機能したかどうかを確認できます。

そして、バックアップに含まれているentity2char関数が、既存のデータベースとうまく連携しないのではないかという懸念がありますか?新しいデータベースを作成して復元した方がいいかもしれません。 anyway、xx-discourse-database-5という名前はあまり好きではありません。

編集:さて、さらに修正しなければならない問題があるようです。

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

新しいデータベースから始めるのが良い方法かもしれません。

データベースをドロップ、作成、マイグレーションしてからリストアするのが解決策でした。マイグレーション手順をスキップすべきでした。

ご協力いただいた @RGJ および @gerhard さん、ありがとうございました。いただいたヒントが解決の助けとなりました。

常にデータベースを最初にドロップしないのは、失敗した場合に元に戻すことができないためでしょう。

「いいね!」 1