导入失败,提示“无法创建唯一索引”

好的,我们终于挺过来了,现在已恢复在线。感谢 @Falco 的提示。

为了帮助其他人解决类似问题,以下是我们采取的措施总结。

我们遇到了几个损坏的索引,导致导入失败。通过手动删除重复项,我们成功修复了问题。此外,还有 8 个用户的 username_lower 字段重复(比如太多的 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: