MySQL Ошибка 1813 (HY000): Tablespace for table exists (Discard / Import tablespace)
Архитектура индивидуальных табличных пространств (innodb_file_per_table)
При включенном режиме innodb_file_per_table = 1 (активен по умолчанию во всех современных версиях MySQL) движок InnoDB хранит данные и индексы каждой таблицы в отдельном файле таблица.ibd в каталоге базы данных. Системная ошибка MySQL Error 1813 (SQLSTATE HY000): «Tablespace for table '`db`.`table`' exists. Please DISCARD the tablespace before IMPORT» возникает при попытке выполнить команду CREATE TABLE `table`, если на физическом диске в каталоге базы данных уже обнаружен существующий файл table.ibd, либо если в системном словаре InnoDB осталась невычищенная запись о предыдущем табличном пространстве с таким ID.
Бизнес-риски
Невозможность пересоздания упавших или случайно удаленных таблиц, блокировка автоматического деплоя и выполнения миграций.
Причины появления «осиротевших» (Orphan) табличных пространств
| Сценарий возникновения | Что произошло на уровне файловой системы / СУБД |
|---|---|
Аварийная остановка при DROP TABLE | Запись из словаря удалилась, но файл .ibd не успел удалиться с диска. |
| Ручное копирование файлов через ОС | Файлы скопированы в /var/lib/mysql/ без регистрации через IMPORT TABLESPACE. |
| Восстановление из снимка LVM / бэкапа | Рассинхронизация словаря данных в ibdata1 / mysql.ibd и физических файлов. |
Регламент очистки и повторной инициализации табличных пространств
Сценарий 1: Удаление физического осиротевшего файла .ibd с диска
Если таблица удалена из базы, но старый файл остался в файловой системе:
# 1. Проверьте наличие остаточного файла в каталоге базы данных:
sudo ls -la /var/lib/mysql/my_database/my_table.ibd
# 2. Переместите старый файл в резервную папку (или удалите):
sudo mv /var/lib/mysql/my_database/my_table.ibd /tmp/my_table_backup.ibd
# 3. В консоли MySQL повторите создание таблицы:
mysql -u root -p my_database
CREATE TABLE `my_table` ( id INT PRIMARY KEY, name VARCHAR(100) ) ENGINE=InnoDB;Сценарий 2: Очистка табличного пространства через процедуру DISCARD TABLESPACE
Если вы хотите импортировать готовый .ibd файл с другого сервера:
-- 1. Создайте пустую таблицу с ТОЧНО ТАКОЙ ЖЕ структурой:
CREATE TABLE `my_table` ( id INT PRIMARY KEY, name VARCHAR(100) ) ENGINE=InnoDB;
-- 2. Отсоедините и удалите вновь созданное табличное пространство:
ALTER TABLE `my_table` DISCARD TABLESPACE;
-- 3. Скопируйте ваш целевой .ibd файл в каталог базы данных через терминал:
-- sudo cp /backup/my_table.ibd /var/lib/mysql/my_database/
-- sudo chown mysql:mysql /var/lib/mysql/my_database/my_table.ibd
-- 4. Импортируйте пространство обратно в движок InnoDB:
ALTER TABLE `my_table` IMPORT TABLESPACE;Сценарий 3: Удаление зависшего пространства через DROP TABLESPACE (MySQL 8.0)
Если в MySQL 8.0 было создано общее табличное пространство (General Tablespace):
-- Просмотр зарегистрированных табличных пространств:
SELECT * FROM information_schema.innodb_tablespaces WHERE name LIKE '%my_table%';
-- Принудительное удаление зарегистрированного пространства:
DROP TABLESPACE `my_tablespace_name`;Типовые ошибки администраторов
- Удаление ibdata1 при ошибке 1813: Удаление главного файла
ibdata1полностью разрушает системный словарь данных и делает невозможным запуск ВСЕХ остальных баз данных на сервере. - Забытые права доступа после ручного копирования: Если скопировать файл
my_table.ibdот пользователяroot, MySQL не сможет открыть его из-за отсутствия прав у пользователяmysql.
Эксперты ITSTM проведут корректную синхронизацию системного словаря метаданных и восстановят целостность таблиц.
Частые вопросы (FAQ)
Почему нельзя просто скопировать .ibd файл в папку базы, как это делалось в MyISAM?
В InnoDB каждая таблица имеет внутренний 32-битный Tablespace ID, который обязан совпадать со служебным заголовком внутри ibdata1 / Data Dictionary. Простое копирование файлов вызовет рассинхронизацию ID.
Что делать, если при IMPORT TABLESPACE возникает ошибка 'Schema mismatch'?
Структура колонок (DDL) созданной пустой таблицы не совпадает с DDL оригинального .ibd файла. Структура должна быть абсолютно идентичной до последнего байта.
Где хранятся метаданные таблиц в MySQL 8.0 вместо старых .frm файлов?
В MySQL 8.0 файлы .frm упразднены. Все метаданные хранятся в транзакционном словаре данных внутри общего табличного пространства mysql.ibd.
Как сгенерировать DDL структуру из существующего .ibd файла?
Используйте утилиту dbsake (dbsake frmdump) или парсер ibd2sdi, встроенный в MySQL 8.0: ibd2sdi my_table.ibd.