Я использую эти шаги для создания таблицы my_user
, которая уже существует, но каким-то образом исчезла из моей базы данных my_db
:
mysql> USE my_db;
mysql> DROP TABLE my_user;
mysql> ERROR 1051 (42S02): Unknown table 'my_user'
mysql> CREATE TABLE my_user (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255), group_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
mysql> ERROR 1005 (HY000): Can't create table 'my_db.my_user' (errno: -1)
Пробовал # mysqladmin flush-tables
и повторял шаги выше, но это не помогло. Также перезапустил mysql
сервис, но ничего хорошего.
Любые идеи? Google подвел меня до сих пор. Спасибо.
Дополнительная информация:
mysql> SHOW engine innodb STATUS;
------------------------
LATEST FOREIGN KEY ERROR
------------------------
140703 15:15:09 Error in foreign key constraint of table my_db/my_user
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
CONSTRAINT "FK_CFBD431E285FAC6D" FOREIGN KEY ("group_id") REFERENCES "my_group" ("id")
my_user
но ошибка оmy_db.user
...CREATE TABLE
код генерируется библиотекой Doctrine ORM (PHP).Ответы:
InnoDB Архитектура
АНАЛИЗ
my_user.frm
иmy_user.ibd
файлы. В словаре данных все еще есть запись для этой таблицы.DROP TABLE my_user;
потому что mysqld ищетmy_user.frm
первый. Так как это нетmy_user.frm
, таблицу нельзя удалить.my_user.frm
не существует, вы не можете запустить,CREATE TABLE my_user ...
потому что mysqld думает, что это нормально, чтобы создать таблицу, но затем откладывает на механизм хранения. InnoDB говорит: «У меня уже есть зарегистрированный tablespace_id my_user».Эта последовательность событий может быть доказана, если вы создадите таблицу, используя MyISAM. mysqld позволит это. Как только вы переключаетесь на InnoDB, он возвращается к словарю данных, который является ошибочным в этой записи.
У меня есть два предложения
ПРЕДЛОЖЕНИЕ № 1
Не создавайте таблицу с таким именем больше. Используйте другое имя таблицы
Это приведет к тому, что вы измените имя таблицы в коде приложения
ПРЕДЛОЖЕНИЕ № 2
Я имел дело с этой проблемой прежде, чем в моем посте таблица InnoDB SELECT возвращает ERROR 2006 (HY000): сервер MySQL пропал (после отключения питания)
источник
ib_logfile0
иib_logfile1
(вместе сibdata1
). После импорта я мог создатьmy_user
таблицу без проблем. Спасибо, Роландо!DROP TABLE
. Что-то не так происходит.Просто чтобы добавить свое решение, так как у меня была похожая проблема.
TL; DR
подробность
Я столкнулся с неприятной ситуацией, когда оператор ALTER TABLE не выполнялся из-за того, что внешний ключ ранее не удалялся. Это привело к некоторым несоответствиям в словаре данных InnoDB (возможно, из-за http://bugs.mysql.com/bug.php?id=58215 ).
Связанный вопрос здесь: /programming/16857451/error-in-foreign-key-constraint-on-a-droped-table
Ошибка при переименовании «./db/#sql-482c_8448f» в «./db/visits» (номер ошибки: 150)
Поскольку я не смог восстановить таблицу # sql-482c_8448f для посещений, я решил повторно импортировать ее из резервной копии, созданной непосредственно перед изменением. Однако это не удалось. По расследованию:
SQL / Ошибки
Попытка воссоздать таблицу без внешнего ключа вызвала ошибку 150
Попытка создать его вызвала ошибку 121
В конце концов я использовал новое имя внешнего ключа. Я не ожидал, что это сработает, но это позволило создать таблицу.
Простое удаление таблицы после этого удалило ошибочную запись в INFORMATION_SCHEMA.INNODB_SYS_FOREIGN, разрешив импорт с исходным именем внешнего ключа.
источник
Есть один простой способ обойти это, хотя по общему признанию, в определенных обстоятельствах вы можете не захотеть делать это. Так как эта проблема возникает из внутренней ссылки InnoDB, вы можете просто создать эту таблицу с тем же именем, теми же столбцами, только используя другой механизм хранения. Я столкнулся с этим на ведомом MySQL, и хотя мастер, с которого я реплицировал, был InnoDB, я заново создал эту таблицу с MyISAM и смог вернуться к работе. Я специально выбрал InnoDB для своего механизма хранения на ведущем устройстве, и для некоторых таблиц это было бы важно и для ведомого устройства, но в этом случае это не оказало никакого влияния на это ведомое устройство для этой таблицы, поэтому это был быстрый способ чтобы обойти эту проблему. Удаление всей базы данных было бы гораздо большим проектом.
источник
Что сработало для меня:
mysqlfrm
Oraclemysql-utitilies
** (потому что у меня не было другой копии / резервной копии структуры), например:/usr/bin/mysqlfrm --diagnostic /tmp/tablebackup/MyTable.frm
MyTable
то теперь я создал таблицуMyTableB
со структурой исходной таблицы)RENAME TABLE `MyTableB` TO `MyTable`;
(обратите внимание , что это работает только , если вы не былиinnodb_force_recovery
установить в вашемmy.cnf
)ALTER TABLE `MyTable` DISCARD TABLESPACE;
.ibd
файл (только файл .ibd, а не файл .frm) обратно в каталог базы данных mysql, откуда он был изначально перемещен (в этот момент не должно быть существующего файла .ibd, поскольку он удаляетсяDISCARD TABLESPACE
команда)ALTER TABLE `MyTable` IMPORT TABLESPACE;
* Я перезапустил mysql после этого шага, но не уверен, что это требуется
** mysql-утилиты могут потребовать установки в
mysql-connector-python
первую очередьисточник
Вы потеряли данные таблицы, но запись об этой таблице все еще существует в "mysql / data / ibdata1". Самое простое решение - создать эту таблицу в другой базе данных, а затем скопировать файлы:
к себе:
источник