Ошибка: существует табличное пространство для таблицы xxx. Пожалуйста, ОТКРЫВАЙТЕ табличное пространство до ИМПОРТА
Я новичок в MySQL, и я получаю довольно интересную ошибку, по которой я не могу найти никакой помощи через google и поиск в стеке.
Я запускаю локальный сервер MySQL 5.6.10 на MacOS 10.8.3 и управляю своей базой данных с помощью основных средств Navicat для MySQL.
Ошибка, которую я получаю, заключается в том, что после запуска и управления моей базой данных просто отлично в течение нескольких дней/недель, что-то вызывает (оно выглядит неполным) удаляет некоторые из таблиц, которые я создал с помощью запросов из Navicat.
Когда я пытаюсь выполнить запросы с использованием этих таблиц, Navicat затем предупреждает меня, что конкретная таблица не существует. Пока все хорошо - здесь идет хорошая часть:
Когда я пытаюсь СОЗДАТЬ таблицу, например. "temp", который ранее был там, появляется следующее сообщение об ошибке:
Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.
Однако, если я попытаюсь удалить таблицу или попытаюсь отбросить табличное пространство для этой таблицы, используя
DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;
Появляются следующие сообщения об ошибках:
Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist
Итак, это означает, что мне рекомендуется отказаться от табличного пространства, но когда я пытаюсь сделать это, таблица не существует. Возможно ли, что существует какой-то остаток этой таблицы в другом месте, где запрос DISCARD не проверяется? И есть ли у кого-нибудь идея, что может вызвать все это - совершенно случайно, как кажется?
Как я уже сказал, я новичок в этом вопросе и почти не знаю. Я подозреваю, что перезагрузка моего ноутбука, т.е. Перезагрузка моего локального сервера MySQL, или, возможно, права доступа пользователя могут иметь отношение к этому, но я просто выдвигаю гипотезу здесь.
Ответы
Ответ 1
Немного поздно, но, как правило, я видел, как эта проблема возникает, когда вы получаете ошибку "tablespace full" при запуске в режиме "innodb_file_per_table". Не вдаваясь в подробности (подробнее здесь), табличное пространство сервера базы данных определяется параметром innodb_data_file_path и по умолчанию довольно мало. Даже сделанное больше, "табличное пространство заполнено" все еще может возникать с большими запросами и такими (в нем хранится множество нестандартных "вещей", откат журналов, кешей и т.д.).
В любом случае, я обнаружил, что если вы смотрите в каталоге ОС, где хранятся файлы за таблицей, /var/lib/mysql по умолчанию в OSX,/usr/local/var/mysql с homebrew iirc, Вы можете найти потерянный файл tablename.ibd без обычного файла tablename.frm. Если вы переместите этот .ibd файл в безопасное временное место (просто для того, чтобы быть в безопасности), это должно устранить проблему.
$ ls /var/lib/mysql
table1.frm
table1.idb
table2.frm
table2.ibd
table3.idb <- problem table, no table3.frm
table4.frm
table4.idb
$ mkdir /tmp/mysql_orphans
$ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/
Остерегайтесь, однако, убедитесь, что изначально возникла проблема, например. длинный рабочий запрос, заблокированная таблица и т.д..... В противном случае вы просто закончите с другим сиротским .ibd файлом, когда вы попробуете второй раз.
Ответ 2
Пользователи Xampp и Mamp
Имела ту же ошибку при импорте базы данных (после ее опорожнения) через MySQL. Я обнаружил, что у меня был файл tablename.ibd
а все остальные были удалены. Я удалил его вручную из mysql/data/database_name
и ошибка исчезла.
Ответ 3
Для WAMP [Windows 7 Ultimate x64-bit] Пользователи:
Я согласен с тем, что сказал DangerDave, и поэтому я предоставляю ответ для пользователей WAMP.
Примечание.. Прежде всего, вам нужно перейти в папку ..\WAMP\Bin\MySQL\MySQL [ваша версия MySQL]\.. p >
Теперь вы увидите папки всех ваших баз данных
- Дважды щелкните папку базы данных, у которой есть таблица с нарушением, чтобы ее открыть.
- Не должно быть файла
[Your offending MySQL table name].frm
, вместо этого должен быть файл [Your offending MySQL table name].ibd
- Удалить
[Your offending MySQL table name].ibd
- Затем удалите его из корзины.
- Затем запустите свой MySQL-запрос в базе данных, и вы закончили
Ответ 4
Если после удаления вы снова создадите .idb
, прочитайте этот ответ.
Вот как это работает со мной. У меня был файл .idb
без него, соответствующий .frm
, и всякий раз, когда я удаляю файл .idb
, база данных воссоздает его снова. и я нашел решение в одной строке в MySQL документации (табличное пространство не существует часть)
1- Создайте соответствующий файл .frm в каком-либо другом каталоге базы данных и скопируйте его в каталог базы данных, где находится бесхозная таблица.
2- Выпустите DROP TABLE для оригинальной таблицы. Это должно успешно удалить таблицу, и InnoDB должен напечатать предупреждение в журнал ошибок об отсутствии файла .ibd.
Я скопировал другой файл таблицы .frm
и назвал его как мою отсутствующую таблицу, затем сделал обычный запрос удаления таблицы и вуаля, он работал, и таблица удалялась нормально!
у меня система XAMPP на windows MariaDB v 10.1.8
Ответ 5
В моем случае единственным решением было:
- CREATE TABLE
bad_table
ENGINE = MyISAM... - rm bad_table.ibd
- DROP TABLE
bad_table
Ответ 6
Это именно то, что я делал в mariadb 10.2.16 на fedora, когда у меня была таблица, которая показывала те же самые ошибки в файле журнала, я полагаю...
2018-07-11 9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file.
2018-07-11 9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918
пробег и ошибки могут отличаться, но я предполагаю, что основным из них является
...already exists though the corresponding table did not exist in the InnoDB data dictionary...
с таблицей удаления не работает так же хорошо, как с изменением таблицы...
MariaDB [database_name]> drop table innodb_table;
ERROR 1051 (42S02): Unknown table 'database_name.innodb_table'
MariaDB [database_name]> alter table innodb_table discard tablespace;
ERROR 1146 (42S02): Table 'database_name.innodb_table' does not exist
создать таблицу также не удается так:
MariaDB [database_name]> create table innodb_table('id' int(10) unsigned NOT NULL);
ERROR 1813 (HY000): Tablespace for table ''database_name'.'innodb_table'' exists. Please DISCARD the tablespace before IMPORT
чтобы это исправить, сначала я сделал
create table innodb_table2('id' int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)
затем в каталоге /var/lib/mysql/database_name я выполнил следующие действия в качестве пользователя root, подтвердив перезапись innodb_table.ibd, вызвавшую у нас проблемы
cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb
затем в консоли mysql я выполнил успешную команду удаления для обеих таблиц
MariaDB [database_name]> drop table innodb_table;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8
Current database: database_name
Query OK, 0 rows affected (0.08 sec)
MariaDB [database_name]> drop table innodb_table2;
Query OK, 0 rows affected (0.25 sec)
и теперь все квадраты, и я могу воссоздать одну таблицу...
MariaDB [database_name]> create table innodb_table ('id' int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)
ОБНОВЛЕНИЕ: я собирался добавить в
restorecon -Rv /var/lib/mysql/database_name
Команда после копирования базы данных, чтобы получить все контексты selinux так, как они должны быть, даже если мы удаляем их из База данных почти сразу, но в качестве альтернативы вы можете просто добавить опция --archive или -a для двух команд cp, так что да, на самом деле опция архива сокращает это:
cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
restorecon -Rv /var/lib/mysql/database_name
systemctl restart mariadb
к следующему, что я думаю, лучше, и это сохраняет Selinux контекст, который установлен для уже созданной таблицы.
cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb
Я заменил приведенный выше длинный список команд на более короткий список который может быть сокращен еще с *
Ответ 7
Решение
Однако более простой вариант заключается в следующем: перезапустите MySQL, затем выполните те же четыре шага, как указано ниже:
1) created a dummy table in the database;
2) discarded its tablespace;
3) moved the .ibd file into the database folder on the system;
4) attached the tablespace back to the table
Таким образом, идентификатор табличного пространства в словаре данных и файл совпадают; таким образом, импорт табличного пространства завершился успешно.
Это может дать вам большую уверенность в работе с некоторыми "недочётами" InnoDB в процессе восстановления или даже при передаче файлов.
ссылка
Ответ 8
Я получил ту же ошибку, что и на сервере wampserver при попытке создать таблицу пользователей. Я нашел файл users.ibd, и после того, как я удалил этот файл, я снова запустил команду migrate, и она сработала. Файл на моем компьютере с Windows был расположен в файле wamp/bin/mysql/mysql5.6.12/data/myproject.
Ответ 9
Удаление/перемещение tablename.ibd наверняка не сработало для меня.
Как я решил это
Поскольку я собирался удалить поврежденную и не существующую таблицу, я взял резервную копию других таблиц, перейдя в phpmyadmin- > database- > export- > selected tables в backup- > export (as.sql).
После этого я выбрал значок базы данных рядом с именем базы данных, а затем опустил его. Создал новую базу данных. Выберите новую базу данных- > import- > Выберите файл, который вы загрузили ранее, → щелкните по импорту. Теперь у меня есть старые рабочие таблицы и удалена поврежденная таблица. Теперь я просто создаю таблицу, которая выбрасывает ошибку.
Вероятно, у меня была более ранняя резервная копия поврежденной таблицы.
Ответ 10
Вот шаги решения:
- резервное копирование базы данных (структура с опцией drop и данными)
- остановить работу службы mysql
- удалить каталог базы данных вручную из mysql/data
- запустить mysql engine
- создать новую базу данных с любым именем, отличным от поврежденной базы данных
- создать отдельную таблицу с именем поврежденной таблицы внутри новой базы данных (это секрет). и лучше создать таблицу с точно такой же структурой.
- переименуйте базу данных в старую поврежденную базу данных
- восстановите резервную копию, и ваша таблица будет работать нормально.
Ответ 11
Эта ошибка возникает при приостановке некоторых функций. Подобно запуску запроса ниже с неправильным внешним ключом.
set foreign_key_checks=0
Ответ 12
В моем случае:
Сначала удалите tableName.ibd
из каталога базы данных из Mysql, а затем снова запустите:
ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;
Ответ 13
Попытка сбросить табличное пространство может привести к другим ошибкам. Для меня я получил следующую ошибку:
DROP TABLESPACE `tablename`
Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP'
Моим решением было отказаться от базы данных. Это приведет к удалению любых связанных с ним табличных пространств и позволит снова создать таблицы.
Ответ 14
Если у вас есть другой сервер с хорошей версией той же таблицы, вы можете сделать копию (table_copy), перенести table_copy на проблемный сервер. Затем удалите таблицу проблем и переименуйте table_copy в таблицу.
Ответ 15
Был этот вопрос несколько раз. Если у вас большая БД и вы хотите избежать резервного копирования/восстановления (с добавленной отсутствующей таблицей), попробуйте несколько раз взад и вперед:
ТАБЛИЦА DROP my_table;
ALTER TABLE my_table DISCARD TABLESPACE;
й -
rm my_table.ibd(сирота без соответствующего my_table.frm), расположенная в каталоге /var/lib/mysql/my _db/
- и затем -
СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ my_table
(...)
Ответ 16
Была такая же проблема; Я заваривал добавленный [email protected]
(после ранее имевшего 5.5).
Значение по умолчанию для innodb_file_per_table=1
: innodb_file_per_table=1
а в 5.5 - innodb_file_per_table=0
.
В вашем существующем файле ibdata1
(объединенные данные ibdata1
) будут по-прежнему ibdata1
ссылки на таблицы, которые вы пытаетесь создать/удалить. Либо измените innodb_file_per_table
на 0, либо удалите файл данных ibdata1 (это потеряет все ваши данные, поэтому обязательно запустите mysqldump или у вас есть дамп.sql).
Другой [email protected]
умолчанию, который [email protected]
меня, - это отсутствие порта, поэтому сетевое [email protected]
умолчанию не было для UNIX-сокетов, и клиент mysql продолжал сообщать:
ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32
Я добавил <string>--port=3306</string>
в массив .plist
, но вы также можете указать port=3306
в my.cnf
Запустите brew services stop [email protected]
внесите изменения, затем brew services start [email protected]
Ответ 17
Для меня это помогло просто перейти в каталог MYSQL DATA в каталоге /var/lib/mysql/{db_name} (linux) и drop {table_name}.ibd, который был таким же, как имя папки.
Ответ 18
Я удаляю только свою старую БД, расположенную в моем локальном хосте, прямо из wamp, Stop all services, Перейдите в wamp/bin/mysql/mysql [version]/data, и я нашел БД с проблемами, я удаляю его и снова запускаю wamp все службы, снова создайте свою базу данных, и все будет сделано, теперь вы можете импортировать свои таблицы,
Ответ 19
Способ, которым я решил "решить" эту проблему, довольно раздражает, но есть сценарий, который его обрабатывает.
По сути, вам нужно, чтобы ibdata1
и ib_logfile*
(они содержат, среди прочего, сопоставления внешних ключей). Единственный безопасный способ сделать это - экспортировать все ваши базы данных, остановить mysql, удалить файлы, запустить mysql, а затем импортировать файлы.
Скрипт, который помогает решить эту проблему, - https://github.com/uberhacker/shrink-ibdata1, хотя заявленная цель этого скрипта отличается, он решает проблему.
Ответ 20
Единственный способ, которым это работало для меня, было:
- Создать похожую таблицу
- Скопируйте файлы .frm и .idb новой аналогичной таблицы в имя поврежденной таблицы.
- Исправить разрешения
- Перезапустите MariaDB
- Оставьте испорченный стол
Ответ 21
если у вас есть эта проблема, и у вас нет другой опции, измените движок на любой другой движок, такой как "myisam", а затем попытайтесь создать таблицу.
отказ от ответственности:
это не действительный ответ, так как у вас могут быть ограничения внешнего ключа, которые не будут поддерживаться другим механизмом хранения. У каждого механизма хранения есть своя специальность для хранения и доступа к данным, эти пункты также должны приниматься во внимание.
Ответ 22
Пожалуйста, ОТКРЫВАЙТЕ табличное пространство до ИМПОРТА
У меня такое же решение проблемы ниже
-
Сначала вам нужно отказаться от имени своей базы данных. если ваша база данных не удаляется, вы меня потопили. Для системы Windows ваш каталог будет C: /xampp/mysql/data/yourdabasefolder удалить "yourdabasefolder"
-
Снова вам нужно создать новую базу данных и импортировать старый файл sql. Это будет работа
Спасибо
Ответ 23
Мне пришлось найти каталог данных MySQL:
SHOW VARIABLES WHERE Variable_Name LIKE "% dir"
Затем принудительно удалите эту базу данных:
sudo rm -rf
Ответ 24
Вы можете выполнить следующий запрос от имени пользователя root.
drop tablespace 'tableName'
Ответ 25