Move a Discourse site to another VPS with rsync

Я это сделал, и 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;

Пока не закончились элементы для исправления. :slight_smile:

Я, наверное, мог бы использовать какой-нибудь трюк с внутренним соединением (или, возможно, немного Ruby), чтобы сделать всё одним запросом, но я не эксперт, и оказалось, что делать это вручную — это не часы работы. Но, надо сказать, это было скучно. :slight_smile:

Затем я выполнил REINDEX DATABASE discourse; без CONCURRENTLY, просто чтобы упростить задачу, удалил несколько индексов ccnew*, которые я пропустил ранее, и всё заработало.

Сайт был доступен всё время, простоя не было.

Независимо от того, было ли это необходимо, я точно чувствую, что мои данные теперь немного безопаснее, и я не катюсь к какому-то внезапному будущему бедствию.

Спасибо, что подтолкнули меня в правильном направлении, чтобы разобраться в этом, @pfaffman!

2 лайка