Я обновляю сайт, и процесс завершается ошибкой: PG::NotNullViolation: ERROR: column "private_message" contains null values. Я не могу найти, где существует столбец private_message. Неофициальных плагинов нет.
О, подождите. Вот это:
(Полный трассировочный вывод можно получить, запустив задачу с флагом --trace)
I, [2020-08-18T18:19:13.253667 #1] INFO -- : == 20200818084329 UpdatePrivateMessageOnPostSearchData: миграция =============
-- execute("DELETE FROM post_search_data\nWHERE post_id IN (\n SELECT posts.id\n FROM posts\n LEFT JOIN topics ON topics.id = posts.topic_id\n WHERE topics.id IS NULL\n)\n")
-> 21.9072s
-- execute("DELETE FROM post_search_data\nWHERE post_id IN (\n SELECT post_search_data.post_id\n FROM post_search_data\n LEFT JOIN posts ON posts.id = post_search_data.post_id\n WHERE posts.id IS NULL\n)\n")
-> 47.2663s
-- execute("UPDATE post_search_data\nSET private_message = true\nFROM posts\nINNER JOIN topics ON topics.id = posts.topic_id AND topics.archetype = 'private_message'\nWHERE posts.id = post_search_data.post_id\n")
-> 107.2137s
-- execute("UPDATE post_search_data\nSET private_message = false\nFROM posts\nINNER JOIN topics ON topics.id = posts.topic_id AND topics.archetype <> 'private_message'\nWHERE posts.id = post_search_data.post_id\n")
-> 834.3738s
-- change_column_null(:post_search_data, :private_message, false)
Привет, @tgxworld, думаю, это может быть связано с
Хм, это странно… Не могли бы вы выполнить следующие запросы в консоли Rails и предоставить мне результаты?
DB.query_single(<<~SQL)
SELECT COUNT(*) FROM post_search_data
SQL
DB.query_single(<<~SQL)
SELECT COUNT(*)
FROM post_search_data
LEFT JOIN posts ON posts.id = post_search_data.post_id
LEFT JOIN topics ON topics.id = posts.topic_id
WHERE topics.id IS NULL
SQL
DB.query_single(<<~SQL)
SELECT COUNT(*)
FROM post_search_data
LEFT JOIN posts ON posts.id = post_search_data.post_id
WHERE posts.id IS NULL
SQL
DB.query_single(<<~SQL)
SELECT COUNT(*)
FROM post_search_data
INNER JOIN posts ON posts.id = post_search_data.post_id
INNER JOIN topics ON topics.id = posts.topic_id
SQL
Извините, Алан. Да, проблема была решена. Спасибо за вашу помощь!
Для всех остальных, у кого возникла эта проблема: если вы выполните обычную команду ./launcher rebuild app, у вас не должно возникнуть трудностей, за исключением того, что ваш сайт может быть недоступен в течение длительного времени, пока часть bootstrap процесса rebuild переносит базу данных. Это безопасный и простой вариант, и если у вас не установка на 2 контейнера, вы всё равно поступите именно так.
Я не хотел, чтобы сайт был недоступен на протяжении всего процесса bootstrap. Для этого крупного форума (5 млн постов и ~50 тыс. просмотров страниц в день?) моим решением (которое я нашёл только с помощью Алана) было запуск bootstrap с отключёнными миграциями после обновления (миграции заняли практически нулевое время), затем запустить новый контейнер и выполнить миграции после обновления (миграции заняли 20–40 минут — я не особо следил за временем).
Если кому-то это интересно, я позже узнал, что выполнение обновления через docker_manager делает этот процесс гораздо более плавным, поэтому я рекомендую этот способ, если у кого-то есть большой форум и проблемы с запуском bootstrap.