Столбец Postgres слишком большой, чтобы его можно было очистить - PullRequest
0 голосов
/ 24 июня 2019

Чуть менее 2 часов назад я заметил большую проблему в моем коде.Из-за случайного бесконечного цикла for я заполнил столбец List.keywords в моей базе данных гигантским фрагментом текста.Все заблокировано.

Когда я понял ошибку, я изменил свой код, чтобы очистить этот столбец при каждом сохранении записей.Все продолжало блокировать.

Я попытался перенести базу данных с помощью рельсовых миграций remove_column :lists, :keywords.Эта миграция тоже не удалась.

Хотя эта последняя миграция должна была что-то сделать, так как теперь код снова быстрый.За исключением Lists (где столбец keywords дал мне проблему).При сохранении List на это уходит около 5 секунд.Чтение быстротак медленно.

Как вы, ребята, решите это?

1 Ответ

0 голосов
/ 24 июня 2019

Проблема заключалась в том, что при вызове записи List эта попытка была бы загружена в память. Колонна была настолько огромной, что даже это не сработало бы в Rails.

Мое разрешение после разговора с инженером Postgres:

Я вошел в свою производственную консоль postgres на heroku, используя heroku pg:psql -a <myapp>. Я проверил, какое значение было для Списка 2203

SELECT "keywords"
FROM "lists"
WHERE id = 2203;

Я увидел, что в этом огромный кусок текста, и был очень счастлив, потому что впервые увидел проблему. Для начала я хотел очистить этот список

-- Doing this in a transaction, so if I don't like what happened, I can call ROLLBACK; to start over
BEGIN;
UPDATE "lists"
WHERE id = 2203
SET keywords = '';

SELECT "keywords"
FROM "lists"
WHERE id = 2203;

-- I was happy with the result as it was empty, so I committed the transaction
COMMIT;
-- If you're not happy, do ROLLBACK; to start over

Хорошо, это был один List готово, время сделать все из них

-- not setting the WHERE as I want to do this on all of them.
BEGIN;
UPDATE "lists"
SET keywords = '';

-- here you can SELECT to do some checks at some records, see if they are empty.

COMMIT;

Вуаля, мое Rails-приложение снова начало работать быстро и больше ничего не забилось.

Надеюсь, это поможет кому-то в будущем. Вероятно, я.

...