Почему Memory-таблицы нужно использовать аккуратно
В последний месяц уже несколько раз сталкиваюсь с тем, что на этом форуме переполняется таблица присутствующих онлайн участников. При каждом действии пользователя для неё делается UPDATE, поэтому когда-то давно для ускорения работы форума я поставил ей тип хранения (storage engine) — Memory, т.е. хранение данных в памяти. Долгое время всё нормально работало, но оказалось, что это плохое решение, не устойчивое к DDoS-атакам. В последнее время с диапазонов Яндекса боты стали ходить целыми подсетями /24, а для каждого гостя в этой таблице делается отдельная запись, а в Memory-таблицах число строк ограничено. Как следствие таблица переполнялась и сайт становился недоступен для гостей с ошибкой 503 до момента, пока по cron не запускалась очистка.
В итоге я решил преобразовать таблицу онлайн-пользователей из Memory в обычную InnoDB и получил неожиданную ошибку: errno: 140 "Wrong create options". Сначала думал, что проблема в переполненности таблицы, но очистка не помогла. После недолгих поисков выяснилось, что дело в формате строк: у меня использовался ROW_FORMAT=FIXED, а InnoDB такое не поддерживает. Помог запрос, который одновременно меняет и тип таблицы, и формат строк:
ALTER TABLE intb_online ENGINE=InnoDB ROW_FORMAT=DYNAMIC;