RGJ
(Richard - Communiteq)
2024 年 10 月 15 日午後 10:28
1
これはどのような内容ですか?
このマイグレーションでは、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
tgxworld
(Alan Tan)
2024 年 10 月 15 日午後 11:20
2
@drenmi マイグレーションを元に戻し、別の解決策を再検討する必要があるようです。これは、セルフホスト型インストールでエラーが発生している原因である可能性が高いです。
「いいね!」 8
ted
(Ted Johansson)
2024 年 10 月 18 日午前 4:35
11
ここに、PG13 でも機能するはずの PR を作成しました。
main ← fix/problem-check-target-pg13
opened 03:40AM - 18 Oct 24 UTC
### What is this change?
In #29169 we added a `NULLS NOT DISTINCT` option to … the unique index on `problem_check_trackers`. This is to enforce uniqueness even when the `target` is `NULL`. (Postgres considers all `NULL`s to be distinct by default.)
However, this only works in PG15. In PG13 it does nothing.
This commit adds a default dummy string value `__NULL__` to `target`. Since it's a string, PG13 will be able to correctly identify duplicate records.
### Is it safe to run this?
Adding a default value will lock the table and can cause issues on large tables, but the `problem_check_trackers` table is constrained by the number of problem check classes, and is in the ballpark of 10-100 rows.
このケースが実際にどの程度現実的であるか、また、それを回避するためにどの程度投資すべきかを検討中です。
「いいね!」 1
RGJ
(Richard - Communiteq)
2024 年 10 月 18 日午前 7:33
12
他の人のことは話せませんし、自分が本当に代表的なのかどうかも分かりません(おそらくそうではないでしょう)が、その変更が行われた後、3日の間に2回遭遇しました…
ですので、回避策(そして元に戻すこと!)をいただけると大変助かります。
「いいね!」 1
ted
(Ted Johansson)
2024 年 10 月 21 日午前 3:38
13
これで回避策ができたので、PG15でも機能するはずです。NULLS NOT DISTINCTを削除できるようになります。
興味本位ですが、PG13にPG15のバックアップを復元する必要があったのはどのような状況だったのでしょうか? (上記のタスクには影響しませんが、可能な限り「実世界」で何が起こっているのかを理解しようとしています。)
「いいね!」 1
RGJ
(Richard - Communiteq)
2024 年 10 月 21 日午前 5:35
14
バックアップを復元しようとしていたクライアントが1社いました(自己ホストで、知識レベルを超えたことを試していたのだと思います )。また、カスタムプラグイン開発目的でステージングサイトをセットアップするように依頼されたクライアントがもう1社おり、CDCKホスティングからバックアップを取得しました。
一般的に、バックアップメタデータに組み込まれたバージョン管理メカニズムは、何かが破損する可能性があるかどうかを事前に判断するのに非常に役立ちますが、このような状況*は地雷のようなものです
(*実際、マイグレーションのバージョン管理でカバーされていないもう1つのことは、古いタイムスタンプのマイグレーション がメインに挿入された場合ですが、これは脱線です)
「いいね!」 3
ted
(Ted Johansson)
2024 年 10 月 22 日午前 2:29
16
情報ありがとうございます、@RGJ さん!
NULLS NOT DISTINCT OPTION を削除する PR が公開されました。
main ← dev/remove-nulls-not-distinct-from-problem-check-trackers
opened 02:28AM - 22 Oct 24 UTC
### What is this change?
We added `NULLS NOT DISTINCT` to a unique index on `… problem_check_trackers`.
This option is only available in PG15+. It does not in itself break PG13, but restoring a PG15+ backup to PG13 currently errors out. It seems this is an operation that's more common than we first thought.
This commit fixes that by removing the `NULLS NOT DISTINCT`.
### Don't we need it, since we added it?
We already have another, backwards-compatible approach to do the same thing in place, so this shouldn't change existing behaviour.
「いいね!」 3
gpoole
(Greg Poole)
2024 年 10 月 23 日午前 1:16
17
問題はすでに解決されているようですが、実際の経験として付け加えると、次のような問題がありました。Discourseホストインスタンスで作成されたバックアップを、開発環境のセットアップの一部としてDockerを使用してローカルにセットアップした開発コンテナに復元しようとした際に、この問題が発生しました。DiscourseホスティングはPG 15を実行していますが、開発環境は13のようです。
「いいね!」 2
sam
(Sam Saffron)
2024 年 10 月 23 日午前 1:27
18
はい、これが問題の根本原因です。オープンソースコンテナを 15 に更新する必要があります。数か月かけて対応します。
「いいね!」 4
ted
(Ted Johansson)
クローズされました:
2024 年 11 月 18 日午前 12:00
20
このトピックは9日後に自動的に閉じられました。返信はもうできません。