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, а скорее желание предупредить рядового разработчика о возможной проблеме и ознакомить с некоторыми способами её решения.

Комментариев: 8

8 Responses to “MySQL: Table is full”

Комментарии:

  1. Скакунов Александр

    Увидел себя у тебя в ссылках (кстати, проверь спеллинг) – спасибо!

    “От нашего стола” добавил твой блог к себе в сайдбар и в агрегатор. Будем дружить семьями :]

  2. vadim

    Спасибо, спеллинг проверил.

  3. Михаил

    Рядовым разработчикам скорее желательно подумать, зачем им таблицы размером больше 4 Гб ;-)

  4. vadim

    4 Гб – это не так то и много
    А для любого ресурса с миллионом хитов в день – это цветочки.

  5. Volniy

    У меня выдал такую ошибку при размере таблицы в 10 мб.
    Тип InnoDB.
    При изменении типа в MyISAM запрос выполнился без ошибок.
    Куда копать?

  6. Vadim Voituk

    Проверь значение innodb_log_file_size.
    Уверен что у тебя оно стоит равное 10Мб

  7. md5

    “max_rows=4294967295″ – там тупо 4 байта на количество рядов, видимо. Отсюда форсированный 0xFFFFFFFF.

  8. Naik

    Возможно, просто кончилось место на жестком диске

Leave a Reply