PG13 互換性不具合

これはどのような内容ですか?

このマイグレーションでは、problem_check_trackers テーブルのインデックスに NULL NOT DISTINCT を導入します。DEV: Fix problem check tracker unique index not respecting NULLs by Drenmi · Pull Request #29169 · discourse/discourse · GitHub

問題点は何ですか?

デフォルトでは、一意インデックスを強制する目的でタプルの整合性をチェックする際、PostgreSQL は NULL を異なる値として扱います。このため、競合状態により { identifier: "rails_env", target: nil } を持つ複数のエントリが誤って作成される可能性がありました。これにより、実行時にエラーが発生していました。

どのように解決しますか?

既存のインデックスを削除し、NULLS NOT DISTINCT オプションを付けて再作成します。

問題点

しかし、NULLS NOT DISTINCT は Postgres 15 beta2 で導入されました。標準インストールされている現在の Postgres バージョンは Postgres 13 であり、この機能はサポートされていません。

結果

  • PG13 では、NULLS NOT DISTINCT は無視されるため、この変更は効果がありません(ソース)。
  • PG15 サーバーから PG13 サーバーへのバックアップの復元を試みると、以下のエラーで失敗します。
ERROR:  syntax error at or near "NULLS"
LINE 1: ...m_check_trackers USING btree (identifier, target) NULLS NOT DISTINCT ...
^
EXCEPTION: psql failed:                                                              ^
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'

(完全な行: CREATE UNIQUE INDEX index_problem_check_trackers_on_identifier_and_target ON public.problem_check_trackers USING btree (identifier, target) NULLS NOT DISTINCT;

@tgxworld @drenmi

「いいね!」 9

@drenmi マイグレーションを元に戻し、別の解決策を再検討する必要があるようです。これは、セルフホスト型インストールでエラーが発生している原因である可能性が高いです。

「いいね!」 8

ここに、PG13 でも機能するはずの PR を作成しました。:pray:

このケースが実際にどの程度現実的であるか、また、それを回避するためにどの程度投資すべきかを検討中です。:pray:

「いいね!」 1

他の人のことは話せませんし、自分が本当に代表的なのかどうかも分かりません(おそらくそうではないでしょう)が、その変更が行われた後、3日の間に2回遭遇しました…

ですので、回避策(そして元に戻すこと!)をいただけると大変助かります。

「いいね!」 1

これで回避策ができたので、PG15でも機能するはずです。NULLS NOT DISTINCTを削除できるようになります。

興味本位ですが、PG13にPG15のバックアップを復元する必要があったのはどのような状況だったのでしょうか? :slightly_smiling_face: (上記のタスクには影響しませんが、可能な限り「実世界」で何が起こっているのかを理解しようとしています。)

「いいね!」 1

バックアップを復元しようとしていたクライアントが1社いました(自己ホストで、知識レベルを超えたことを試していたのだと思います :upside_down_face:)。また、カスタムプラグイン開発目的でステージングサイトをセットアップするように依頼されたクライアントがもう1社おり、CDCKホスティングからバックアップを取得しました。

一般的に、バックアップメタデータに組み込まれたバージョン管理メカニズムは、何かが破損する可能性があるかどうかを事前に判断するのに非常に役立ちますが、このような状況*は地雷のようなものです :slight_smile:

(*実際、マイグレーションのバージョン管理でカバーされていないもう1つのことは、古いタイムスタンプのマイグレーションがメインに挿入された場合ですが、これは脱線です)

「いいね!」 3

情報ありがとうございます、@RGJ さん!:pray:

NULLS NOT DISTINCT OPTION を削除する PR が公開されました。

「いいね!」 3

問題はすでに解決されているようですが、実際の経験として付け加えると、次のような問題がありました。Discourseホストインスタンスで作成されたバックアップを、開発環境のセットアップの一部としてDockerを使用してローカルにセットアップした開発コンテナに復元しようとした際に、この問題が発生しました。DiscourseホスティングはPG 15を実行していますが、開発環境は13のようです。

「いいね!」 2

はい、これが問題の根本原因です。オープンソースコンテナを 15 に更新する必要があります。数か月かけて対応します。

「いいね!」 4

このトピックは9日後に自動的に閉じられました。返信はもうできません。