Существует несколько случаев, когда выдается эта ошибка:
Используется старая версия MySQL (до 3.23.0), а размещенная в памяти временная таблица становится больше, чем
tmp_table_size
байтов. Для решения этой проблемы можно использовать опцию-O tmp_table_size=#
, чтобыmysqld
увеличил размер временных таблиц, или опцию SQLSQL_BIG_TABLES
, перед тем как выдать сомнительный запрос (see Раздел 5.5.6, «Синтаксис командыSET
»). Можно также запускатьmysqld
с опцией--big-tables
- эффект здесь будет таким же, как и от использованияSQL_BIG_TABLES
для всех запросов. В версии MySQL 3.23 размещенные в памяти временные таблицы после того, как размер таблицы превыситtmp_table_size
, автоматически преобразуются в расположенные на диске таблицы типаMyISAM
.Используются таблицы
InnoDB
и исчерпалось место в табличном пространствеInnoDB
. В таком случае следует увеличить табличное пространствоInnoDB
.Используются таблицы
ISAM
илиMyISAM
в операционной системе, которая поддерживает файлы размером до 2 Гб, и файл данных или индексный файл достигли этого предела.-
Используются таблицы
MyISAM
, и размер требуемых данных или индекса превышает тот, который предусматривался MySQL при выделении указателей (еслиMAX_ROWS
не указано вCREATE TABLE
, MySQL выделяет указатели, предусматривающие размещение только 4 Гб данных). Проверить максимальные размеры данных/индекса можно посредствомSHOW TABLE STATUS FROM database LIKE 'table_name';
или с помощью
myisamchk -dv база_данных/таблица
. Если проблема связана с указателями, то это можно исправить с помощью команды наподобие следующей:ALTER TABLE table_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
Указывать
AVG_ROW_LENGTH
нужно только для таблиц с полями типаBLOB/TEXT
, поскольку в этом случае MySQL не может оптимизировать требуемое пространство, исходя только из количества строк.