好的,我们终于挺过来了,现在已恢复在线。感谢 @Falco 的提示。
为了帮助其他人解决类似问题,以下是我们采取的措施总结。
我们遇到了几个损坏的索引,导致导入失败。通过手动删除重复项,我们成功修复了问题。此外,还有 8 个用户的 username_lower 字段重复(比如太多的 mike 和 marco)。我们通过更新 username 和 username_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'
所有索引恢复正常后,我们成功创建备份,并在新实例中正确导入。迁移按预期运行,我们切换了实例,系统现已正常运行
为 Discourse 的韧性干杯 ![]()
再次感谢 @Falco。
祝大家周末愉快 ![]()