J'utilise ces étapes pour créer une table my_user
, qui existait déjà mais qui a en quelque sorte disparu de ma base de données 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)
J'ai essayé # mysqladmin flush-tables
et répété les étapes ci-dessus mais cela n'a pas été utile. En outre, redémarré le mysql
service, mais pas bon.
Des idées? Google m'a échoué jusqu'à présent. Merci.
Informaitons supplémentaires:
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
mais l'erreur concernemy_db.user
...CREATE TABLE
code est généré par la bibliothèque Doctrine ORM (PHP).Réponses:
Architecture InnoDB
UNE ANALYSE
my_user.frm
etmy_user.ibd
. Le dictionnaire de données a toujours une entrée pour cette table.DROP TABLE my_user;
car mysqld recherche lemy_user.frm
premier. Comme ce n'est pas le casmy_user.frm
, le tableau ne peut pas être supprimé.my_user.frm
n'existe pas, vous ne pouvez pas exécuterCREATE TABLE my_user ...
car mysqld pense qu'il est OK de créer la table, mais passe ensuite au moteur de stockage. InnoDB dit "J'ai déjà enregistré le tablespace_id de my_user".Cette séquence d'événements peut être prouvée si vous créez la table à l'aide de MyISAM. mysqld le permettra. Une fois que vous passez à InnoDB, il revient directement au dictionnaire de données, qui est défectueux sur cette seule entrée.
J'ai deux suggestions
SUGGESTION # 1
Ne créez plus la table avec ce nom. Utilisez un nom de table différent
Cela vous amènera à changer le nom de la table dans votre code d'application
SUGGESTION # 2
J'ai déjà traité ce problème dans mon article. La table InnoDB SELECT renvoie ERREUR 2006 (HY000): le serveur MySQL est parti (après une panne de courant)
la source
ib_logfile0
etib_logfile1
(avecibdata1
). Après l'importation, j'ai pu créer lamy_user
table sans aucun problème. Merci Rolando!DROP TABLE
. Quelque chose ne va pas.Juste pour ajouter ma solution car j'ai eu un problème similaire.
TL; DR
Détail
J'ai rencontré la situation désagréable où une instruction ALTER TABLE a échoué car une clé étrangère n'a pas été supprimée plus tôt. Cela a conduit à des incohérences dans le dictionnaire de données InnoDB (probablement en raison de http://bugs.mysql.com/bug.php?id=58215 ).
Question connexe ici: /programming/16857451/error-in-foreign-key-constraint-on-a-droped-table
Erreur lors du renommage de './db/#sql-482c_8448f' en './db/visits' (errno: 150)
Comme je n'ai pas pu récupérer la table # sql-482c_8448f aux visites, j'ai décidé de la réimporter à partir d'une sauvegarde effectuée juste avant la modification. Mais cela a échoué. Enquête:
SQL / Erreurs
La tentative de recréation de la table sans la clé étrangère a provoqué une erreur 150
Essayer de le créer avec a provoqué une erreur 121
Finalement, j'ai utilisé un nouveau nom de clé étrangère. Je ne m'attendais pas à ce que cela fonctionne, mais cela a permis de créer la table.
Il suffit de supprimer la table après avoir supprimé l'enregistrement erroné dans INFORMATION_SCHEMA.INNODB_SYS_FOREIGN, permettant une importation avec le nom de clé étrangère d'origine.
la source
Il existe un moyen simple de contourner ce problème, mais il est vrai que, dans certaines circonstances, vous pouvez ne pas vouloir le faire. Étant donné que ce problème découle d'une référence interne InnoDB, vous pouvez simplement créer cette table avec le même nom, les mêmes colonnes, en utilisant uniquement un moteur de stockage différent. J'ai rencontré cela sur un esclave MySQL, et même si le maître à partir duquel je répliquais était InnoDB, j'ai recréé cette seule table avec MyISAM et j'ai pu me remettre en marche. J'ai spécifiquement choisi InnoDB pour mon moteur de stockage sur le maître, et sur certaines tables, ce serait également important pour l'esclave, mais dans ce cas, cela n'a eu aucun impact sur cet esclave pour cette seule table, donc c'était un moyen rapide pour contourner ce problème. Supprimer toute la base de données aurait été un projet beaucoup plus important.
la source
Ce qui a fonctionné pour moi, c'est:
mysqlfrm
d'Oraclemysql-utitilies
** (car je n'avais pas d'autre copie / sauvegarde de la structure) par exemple:/usr/bin/mysqlfrm --diagnostic /tmp/tablebackup/MyTable.frm
MyTable
alors j'ai maintenant créé une tableMyTableB
avec la structure de la table d'origine)RENAME TABLE `MyTableB` TO `MyTable`;
(notez que cela ne fonctionne que si vous ne pas avoirinnodb_force_recovery
défini dans votremy.cnf
)ALTER TABLE `MyTable` DISCARD TABLESPACE;
.ibd
fichier d' origine (uniquement le fichier .ibd, pas le fichier .frm) dans le répertoire de base de données mysql d'où il a été initialement déplacé (il ne devrait pas y avoir de fichier .ibd existant pour le moment car il est supprimé par leDISCARD TABLESPACE
commander)ALTER TABLE `MyTable` IMPORT TABLESPACE;
* J'ai redémarré mysql après cette étape mais je ne suis pas sûr que cela soit nécessaire
** Les utilitaires mysql peuvent nécessiter une installation
mysql-connector-python
préalablela source
Vous avez perdu les données de la table, mais l'enregistrement sur cette table existe toujours dans "mysql / data / ibdata1". La solution la plus simple consiste à créer cette table dans une autre base de données, puis à copier des fichiers:
à vous:
la source