Ich verwende diese Schritte, um eine Tabelle zu erstellen my_user
, die bereits vorhanden war, aber irgendwie aus meiner Datenbank verschwunden ist 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)
Versuchte # mysqladmin flush-tables
und wiederholte die obigen Schritte, aber es war nicht hilfreich. Auch der mysql
Dienst neu gestartet , aber nicht gut.
Irgendwelche Ideen? Google hat mich bisher gescheitert. Vielen Dank.
Zusatzinformation:
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
aber der Fehlermy_db.user
CREATE TABLE
Code von der Doctrine ORM Library (PHP) generiert.Antworten:
InnoDB-Architektur
ANALYSE
my_user.frm
undmy_user.ibd
Dateien verloren. Das Datenwörterbuch enthält noch einen Eintrag für diese Tabelle.DROP TABLE my_user;
da mysqld nach demmy_user.frm
ersten sucht . Da diesmy_user.frm
nicht der Fall ist , kann die Tabelle nicht gelöscht werden.my_user.frm
nicht vorhanden, können Sie nicht ausführen,CREATE TABLE my_user ...
da mysqld der Ansicht ist, dass es in Ordnung ist, die Tabelle zu erstellen, aber dann auf die Speicher-Engine verzichtet. InnoDB sagt "Ich habe bereits die tablespace_id von my_user registriert".Diese Abfolge von Ereignissen kann bewiesen werden, wenn Sie die Tabelle mit MyISAM erstellen. mysqld wird es zulassen. Sobald Sie zu InnoDB wechseln, kehren Sie direkt zum Datenwörterbuch zurück, das bei diesem einen Eintrag fehlerhaft ist.
Ich habe zwei Vorschläge
VORSCHLAG # 1
Erstellen Sie die Tabelle nicht mehr mit diesem Namen. Verwenden Sie einen anderen Tabellennamen
Dies führt dazu, dass Sie den Tabellennamen in Ihrem Anwendungscode ändern
VORSCHLAG # 2
Ich habe dieses Problem bereits in meiner Post- InnoDB-Tabelle behandelt. SELECT gibt ERROR 2006 (HY000) zurück: Der MySQL-Server ist verschwunden (nach einem Stromausfall).
quelle
ib_logfile0
undib_logfile1
(zusammen mitibdata1
). Nach dem Import konnte ich diemy_user
Tabelle ohne Probleme erstellen . Vielen Dank, Rolando!DROP TABLE
. Es stimmt etwas nicht.Nur um meine Lösung hinzuzufügen, da ich ein ähnliches Problem hatte.
TL; DR
Detail
Ich bin in eine schlimme Situation geraten, in der eine ALTER TABLE-Anweisung fehlgeschlagen ist, weil ein Fremdschlüssel nicht früher gelöscht wurde. Dies führte zu einigen Inkonsistenzen im InnoDB-Datenwörterbuch (wahrscheinlich aufgrund von http://bugs.mysql.com/bug.php?id=58215 ).
Verwandte Frage hier: /programming/16857451/error-in-foreign-key-constraint-on-a-droped-table
Fehler beim Umbenennen von './db/#sql-482c_8448f' in './db/visits' (Fehler: 150)
Da ich die Tabelle # sql-482c_8448f nicht für Besuche wiederherstellen konnte, habe ich beschlossen, sie aus einer Sicherung erneut zu importieren, die kurz vor der Änderung durchgeführt wurde. Dies schlug jedoch fehl. Zur Untersuchung:
SQL / Fehler
Der Versuch, die Tabelle ohne den Fremdschlüssel neu zu erstellen, verursachte einen Fehler 150
Der Versuch, es mit zu erstellen, verursachte einen Fehler 121
Schließlich habe ich einen neuen Fremdschlüsselnamen verwendet. Ich hatte nicht erwartet, dass dies funktioniert, aber es ermöglichte die Erstellung der Tabelle.
Durch einfaches Löschen der Tabelle wurde anschließend der fehlerhafte Datensatz in INFORMATION_SCHEMA.INNODB_SYS_FOREIGN entfernt und ein Import mit dem ursprünglichen Fremdschlüsselnamen ermöglicht.
quelle
Es gibt einen einfachen Weg, dies zu umgehen, obwohl Sie dies unter bestimmten Umständen zugegebenermaßen nicht möchten. Da dieses Problem auf einer internen InnoDB-Referenz beruht, können Sie diese Tabelle einfach mit demselben Namen und denselben Spalten nur mit einer anderen Speicher-Engine erstellen. Ich bin auf einem MySQL-Slave darauf gestoßen, und obwohl der Master, von dem ich replizierte, InnoDB war, habe ich diese eine Tabelle mit MyISAM neu erstellt und konnte sie wieder in Betrieb nehmen. Ich habe InnoDB speziell für meine Speicher-Engine auf dem Master ausgewählt, und auf einigen Tabellen wäre es auch für den Slave wichtig, aber in diesem Fall hatte es keine Auswirkungen auf diesen Slave für diese eine Tabelle, also war es ein schneller Weg um dieses Problem zu umgehen. Das Löschen der gesamten Datenbank wäre ein viel größeres Projekt gewesen.
quelle
Was für mich funktioniert hat war:
mysqlfrm
Oraclemysql-utitilies
** (da ich keine andere Kopie / Sicherung der Struktur hatte), z./usr/bin/mysqlfrm --diagnostic /tmp/tablebackup/MyTable.frm
MyTable
dann habe ich jetzt eine TabelleMyTableB
mit der Struktur der ursprünglichen Tabelle erstellt).RENAME TABLE `MyTableB` TO `MyTable`;
(Beachten Sie, dass dies nur funktioniert , wenn Sie nicht habeninnodb_force_recovery
in Ihrem Setmy.cnf
)ALTER TABLE `MyTable` DISCARD TABLESPACE;
.ibd
(nur die .ibd-Datei, nicht die .frm-Datei) zurück in das MySQL-Datenbankverzeichnis, aus dem sie ursprünglich verschoben wurde (es sollte derzeit keine .ibd-Datei vorhanden sein, da diese von der entfernt wirdDISCARD TABLESPACE
Befehl)ALTER TABLE `MyTable` IMPORT TABLESPACE;
* Ich habe mysql nach diesem Schritt neu gestartet, bin mir aber nicht sicher, ob dies erforderlich ist
** MySQL-Dienstprogramme müssen möglicherweise
mysql-connector-python
zuerst installiert werdenquelle
Sie haben Tabellendaten verloren, aber der Datensatz zu dieser Tabelle ist noch in "mysql / data / ibdata1" vorhanden. Die einfachste Lösung besteht darin, diese Tabelle in einer anderen Datenbank zu erstellen und anschließend Dateien zu kopieren:
zu deinen eigenen:
quelle