Ошибка: существует табличное пространство для таблицы 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

В моем случае единственным решением было:

  1. CREATE TABLE bad_table ENGINE = MyISAM...
  2. rm bad_table.ibd
  3. 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

Единственный способ, которым это работало для меня, было:

  1. Создать похожую таблицу
  2. Скопируйте файлы .frm и .idb новой аналогичной таблицы в имя поврежденной таблицы.
  3. Исправить разрешения
  4. Перезапустите MariaDB
  5. Оставьте испорченный стол

Ответ 21

если у вас есть эта проблема, и у вас нет другой опции, измените движок на любой другой движок, такой как "myisam", а затем попытайтесь создать таблицу.

отказ от ответственности: это не действительный ответ, так как у вас могут быть ограничения внешнего ключа, которые не будут поддерживаться другим механизмом хранения. У каждого механизма хранения есть своя специальность для хранения и доступа к данным, эти пункты также должны приниматься во внимание.

Ответ 22

Пожалуйста, ОТКРЫВАЙТЕ табличное пространство до ИМПОРТА

У меня такое же решение проблемы ниже

  1. Сначала вам нужно отказаться от имени своей базы данных. если ваша база данных не удаляется, вы меня потопили. Для системы Windows ваш каталог будет C: /xampp/mysql/data/yourdabasefolder удалить "yourdabasefolder"

  2. Снова вам нужно создать новую базу данных и импортировать старый файл sql. Это будет работа

Спасибо

Ответ 23

Мне пришлось найти каталог данных MySQL:

SHOW VARIABLES WHERE Variable_Name LIKE "% dir"

Затем принудительно удалите эту базу данных:

sudo rm -rf

Ответ 24

Вы можете выполнить следующий запрос от имени пользователя root.

drop tablespace 'tableName'

Ответ 25

  • mysql -e "select @@datadir"

  • Перейдите в папку

  • sudo rm -rf DB_NAME