MySQL: Table is full
Рубрика: Development, MySQL | 5 February 2007, 15:29 | Vadim Voituk
Есть в MySQL такая неприятная вещь как “Table is full”.
Суть её заключается в том, что в какой-то наступает момент количество данных в таблице превышает 4 гигабайта, и MySQL отказывается выполнять INSERT/UPDATE-запросы.
Ноги этой “бяки” ростут из ограничения на максимальный размер файла на некоторых платформах.
Решается достаточно просто:
ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
где MAX_ROWS – ограничение на количество записей в таблице, AVG_ROW_LENGTH – усредненное количество данный в одной записи (используется только для таблиц с BLOB и TEXT полями).
Но это в случае если ваша файловая система поддерживает файлы размером более 4Гб. Если же это не так, то решение не столь примитивное – необходимо разбивать таблицу на разделы (partitions).
Теперь расскажу почему “table is full” доставляет кучу проблем:
1. При создании таблицы ни один разработчик не указывает MAX_ROWS, потому ошибка возникает на работающих решениях в самый неожиданный момент. (Меня почему-то такое счастье постоянно настигает на выходных)
2. При указании очень большого значения MAX_ROWS, MySQL молча “ложит” на это значение и прописывает “max_rows=4294967295″. Таким образом выше 4-х миллиардов записей все-равно не прыгнешь.
3. Решение с проблемы с помошью PARTITIONS работает только на MySQL >= 5.1
4. И как вы думаете сколько времени выполняется указанный выше ALTER TABLE на 4 Гб данных? А сервис все это время находится в состоянии, близкому к коме.
Целью данной заметки не было формирование какого-либо мнения/вывода о MySQL, а скорее желание предупредить рядового разработчика о возможной проблеме и ознакомить с некоторыми способами её решения.

Увидел себя у тебя в ссылках (кстати, проверь спеллинг) – спасибо!
“От нашего стола” добавил твой блог к себе в сайдбар и в агрегатор. Будем дружить семьями :]
Спасибо, спеллинг проверил.
Рядовым разработчикам скорее желательно подумать, зачем им таблицы размером больше 4 Гб ;-)
4 Гб – это не так то и много
А для любого ресурса с миллионом хитов в день – это цветочки.
У меня выдал такую ошибку при размере таблицы в 10 мб.
Тип InnoDB.
При изменении типа в MyISAM запрос выполнился без ошибок.
Куда копать?
Проверь значение innodb_log_file_size.
Уверен что у тебя оно стоит равное 10Мб
“max_rows=4294967295″ – там тупо 4 байта на количество рядов, видимо. Отсюда форсированный 0xFFFFFFFF.