Чуть менее 2 часов назад я заметил большую проблему в своем коде. Из-за случайного бесконечного цикла for я заполнил столбец List.keywords в моей базе данных гигантским фрагментом текста. Все заблокировано.
Когда я понял ошибку, я изменил свой код, чтобы очищать этот столбец при каждом сохранении записей. Все постоянно блокировалось.
Я попытался перенести базу данных с помощью миграции на рельсы remove_column :lists, :keywords. Эта миграция тоже не удалась.
Хотя эта последняя миграция должна была что-то сделать, так как теперь код снова стал быстрым. За исключением Lists (где столбец keywords дал мне проблему). При сохранении List это занимает около 5 секунд. Читается быстро.
Если я сделаю heroku pg:psql и проверю таблицу списков, столбец keywords все еще там, поэтому я предполагаю, что там все еще находятся все данные и почему таблица такая медленная.
Как бы вы решили это?





Проблема заключалась в том, что вызов записи List пытался загрузить ее в память. Колонка была настолько огромной, что даже она не работала в Rails.
Я вошел в свою производственную консоль postgres на героку, используя 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 снова начало работать быстро, и больше ничего не засорялось.
Надеюсь, это может помочь кому-то в будущем. Наверное, я.
Почему миграция не удалась? В чем ошибка?