Я это сделал, и Postgres (и Discourse!) вроде бы довольны.
Я очистил их вручную, сделав URL-адреса уникальными с помощью шаблонов ** там, где это было уместно. Возможно, это был просто безобидный кэш, где я мог бы удалить дубликаты, но не хотел рисковать.
В моём случае был только один индекс, поэтому перестроение всех индексов, вероятно, было излишним, но честно говоря, мне стало спокойнее, зная, что я исправил всё.
После нескольких неудачных запусков перестроения, которые занимают около 30 секунд каждый и сообщают об одной проблеме, я использовал этот SQL-трюк, чтобы мгновенно получить полный список проблемных элементов:
discourse=# select topic_id, post_id, url, COUNT(*) from topic_links GROUP BY topic_id, post_id, url HAVING COUNT(*) > 1 order by topic_id, post_id;
topic_id | post_id | url | count
----------+---------+-------------------------------------------------------+-------
19200 | 88461 | http://hg.libsdl.org/SDL/rev/**533131e24aeb | 2
19207 | 88521 | http://hg.libsdl.org/SDL/rev/44a2e00e7c66 | 2
19255 | 88683 | http://lists.libsdl.org/__listinfo.cgi/sdl-libsdl.org | 2
19255 | 88683 | http://lists.libsdl.org/**listinfo.cgi/sdl-libsdl.org | 2
19523 | 90003 | http://twitter.com/Ironcode_Gaming | 2
(5 rows)
(5 оставшихся проблемных элементов в этом запросе, для примера.)
Затем я просматривал каждый пост, чтобы увидеть, что там было и что нужно исправить:
select * from topic_links where topic_id=19255 and post_id=88683
и затем исправлял один из них:
update public.topic_links set url='http://lists.libsdl.org/__listinfo.cgi/**sdl-libsdl.org' where id=275100;
Пока не закончились элементы для исправления. ![]()
Я, наверное, мог бы использовать какой-нибудь трюк с внутренним соединением (или, возможно, немного Ruby), чтобы сделать всё одним запросом, но я не эксперт, и оказалось, что делать это вручную — это не часы работы. Но, надо сказать, это было скучно. ![]()
Затем я выполнил REINDEX DATABASE discourse; без CONCURRENTLY, просто чтобы упростить задачу, удалил несколько индексов ccnew*, которые я пропустил ранее, и всё заработало.
Сайт был доступен всё время, простоя не было.
Независимо от того, было ли это необходимо, я точно чувствую, что мои данные теперь немного безопаснее, и я не катюсь к какому-то внезапному будущему бедствию.
Спасибо, что подтолкнули меня в правильном направлении, чтобы разобраться в этом, @pfaffman!