MySQL Ошибка 1114 (HY000): The table 'table_name' is full
Причины переполнения таблиц в различных движках MySQL
Системный код MySQL Error 1114 (SQLSTATE HY000): «The table 'table_name' is full» свидетельствует о том, что целевая таблица достигла верхнего предела емкости, установленного на уровне конфигурации СУБД, параметров движка хранения (Storage Engine) или операционной системы. Механизм возникновения ошибки кардинально различается в зависимости от контекста:
- Движок MEMORY (HEAP): Таблица в оперативной памяти превысила лимит системной переменной
max_heap_table_size. - Неявные временные таблицы (Implicit Temporary Tables): Сложный аналитический запрос с тяжелыми
GROUP BY / DISTINCT / ORDER BYсоздал временную таблицу в памяти, которая уперлась в лимитtmp_table_size. - Табличные пространства InnoDB (System Tablespace): Системный файл
ibdata1или отдельный.ibdфайл достиг максимального фиксированного размера или уперся в лимит файловой системы (диск заполнен).
Бизнес-риски
Аварийная остановка записи клиентских сессий, сбой выполнения поисковых фильтров в интернет-магазинах, невозможность формирования регламентных отчетов.
Диагностика ограничений по типам таблиц
| Тип таблицы / Движок | Контролирующий параметр | Действие по устранению |
|---|---|---|
| Временные таблицы в RAM | tmp_table_size и max_heap_table_size | Синхронное увеличение обоих параметров в my.cnf. |
| Таблицы движка MEMORY | max_heap_table_size | Увеличение лимита и выполнение ALTER TABLE t ENGINE=MEMORY. |
| InnoDB системный файл | innodb_data_file_path | Добавление флага :autoextend. |
Регламент увеличения лимитов и устранения ошибки Table is full
Сценарий 1: Увеличение размера временных таблиц в памяти (tmp_table_size)
Для предотвращения сброса временных таблиц на диск или их переполнения:
# 1. Проверка текущих лимитов в консоли MySQL (значения в байтах):
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';
# 2. Динамическое увеличение до 256 МБ (оба параметра должны быть равны!):
SET GLOBAL tmp_table_size = 268435456;
SET GLOBAL max_heap_table_size = 268435456;
# 3. Персистентное сохранение в my.cnf:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
tmp_table_size = 256M
max_heap_table_size = 256MСценарий 2: Исправление размера MEMORY-таблицы приложения
Если приложение использует постоянную таблицу с ENGINE=MEMORY:
-- 1. Увеличьте лимит сессии/сервера:
SET GLOBAL max_heap_table_size = 512 * 1024 * 1024;
-- 2. Пересоздайте структуру таблицы для применения нового лимита объема памяти:
ALTER TABLE `my_memory_table` ENGINE = MEMORY;Сценарий 3: Настройка авторасширения системного пространства InnoDB (ibdata1)
Если в конфигурации было задано фиксированное табличное пространство без autoextend:
# Проверьте секцию [mysqld] в my.cnf:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Конфигурация должна содержать autoextend:
[mysqld]
innodb_data_file_path = ibdata1:12M:autoextend
# Убедитесь, что включен режим отдельного файла на каждую таблицу:
innodb_file_per_table = 1Типовые ошибки администраторов
- Установка tmp_table_size = 8G на многопоточном сервере: Временные таблицы выделяются под каждый поток индивидуально. При 200 одновременных тяжелых запросах сервер мгновенно исчерпает всю оперативную память и упадет в OOM.
- Игнорирование движка TempTable в MySQL 8.0: В MySQL 8.0 за временные таблицы отвечает переменная
temptable_max_ram(по умолчанию 1 Гб), после чего данные сбрасываются в анонимные memory-mapped файлы.
Специалисты ITSTM настроят буферы временных таблиц, оптимизируют тяжелые SQL-запросы и предотвратят исчерпание RAM.
Частые вопросы (FAQ)
Почему при увеличении tmp_table_size ошибка 1114 осталась?
MySQL берет наименьшее значение из двух параметров: tmp_table_size и max_heap_table_size. Необходимо синхронно увеличивать ОБЕ переменные.
Что происходит с временной таблицей, когда она превышает tmp_table_size?
В MySQL 5.7 движок автоматически конвертирует ее во временную таблицу на диске (InnoDB/MyISAM). Если на диске в /tmp нет места, возвращается Ошибка 1114.
Как перевести таблицу MEMORY на стандартный диск InnoDB?
Выполните команду ALTER TABLE `my_table` ENGINE = InnoDB;.
Как мониторить, сколько временных таблиц создается на диске?
Следите за переменными SHOW STATUS LIKE 'Created_tmp_disk_tables'; и Created_tmp_tables;. Высокий процент Created_tmp_disk_tables говорит о нехватке буферов или отсутствии индексов.