インポート失敗:`could not create unique index`

よし、無事に復旧してオンラインに戻れました。@Falco さん、ヒントをありがとうございます。

他の人の問題解決の参考になればと思い、今回行った対応をまとめました。

まず、破損したインデックスがいくつかあり、それがインポートの失敗を引き起こしていました。重複を手動で削除することで修正することができました。また、username_lower が重複しているユーザーが8名いました(Mike や Marco といった名前が多すぎたためです)。これらは usernameusername_lower の両方を更新して名前を変更しました。ユーザーデータを確認したところ、最初の破損は2019年12月に発生していたことが分かりました。

「バックアップ作成」→「バックアップ復元」→「重複エラー発生」→「修正」というサイクルを繰り返す代わりに、すべてのインデックスを再構築することにしました。以下のクエリで一意制約を持つすべてのインデックスを検出しました。

select idx.relname as index_name, 
       insp.nspname as index_schema,
       tbl.relname as table_name,
       tnsp.nspname as table_schema
from pg_index pgi
  join pg_class idx on idx.oid = pgi.indexrelid
  join pg_namespace insp on insp.oid = idx.relnamespace
  join pg_class tbl on tbl.oid = pgi.indrelid
  join pg_namespace tnsp on tnsp.oid = tbl.relnamespace
where pgi.indisunique -- << 一意インデックスのみ
  and tnsp.nspname = 'public'

すべてのインデックスが正常に動作するようになった後、バックアップを作成し、新しいインスタンスに正しくインポートできました。マイグレーションも期待通りに実行され、インスタンスを切り替えてサービスを開始することができました :+1: Discourse の堅牢さに乾杯です :beers:

@Falco さん、再度ありがとうございます。
良い週末を :slight_smile: