Отлично, мы выбрались и снова онлайн. Спасибо за подсказки, @Falco.
Чтобы помочь другим с их проблемами, вот подробный разбор того, что мы сделали.
У нас было несколько повреждённых индексов, из-за чего импорт не удавался. Нам удалось исправить это, удалив дубликаты вручную. Также у 8 пользователей были дублирующиеся значения username_lower (слишком много Mike и Marco). Мы переименовали их, обновив и username, и username_lower. Из данных пользователей мы увидели, что первое повреждение произошло в декабре 2019 года.
Вместо цикла «создать резервную копию» → «восстановить из резервной копии» → «ошибка из-за дубликатов» → «исправить», мы решили перестроить все индексы. Мы нашли все индексы с уникальными ограничениями с помощью следующего запроса:
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.
Хороших выходных ![]()