Ein besonderes Problem mit Tabellen besteht darin, dass der
MySQL-Server Data Dictionary-Informationen in
.frm
-Dateien in Datenbankverzeichnissen
ablegt, während InnoDB
die Informationen
auch in sein eigenes Data Dictionary innerhalb der
Tablespace-Dateien speichert. Wenn Sie
.frm
-Dateien verschieben oder der Server
inmitten einer Data Dictionary-Operation abstürzt, kann es
geschehen, dass die Speicherorte der
.frm
-Dateien hinterher nicht mehr zu den
Angaben im InnoDB
-internen Data Dictionary
passen.
Eine gescheiterte CREATE TABLE
-Anweisung ist
ein Symptom für ein nicht mehr synchrones Data Dictionary. Wenn
dies passiert, schauen Sie im Fehlerlog des Servers nach. Wird
dort behauptet, dass die Tabelle im
InnoDB
-internen Data Dictionary bereits
existiert, so haben Sie in den
InnoDB
-Tablespace-Dateien, eine verwaiste
Tabelle, zu der keine .frm
-Datei gehört.
Die Fehlermeldung sieht wie folgt aus:
InnoDB: Error: table test/parent already exists in InnoDB internal InnoDB: data dictionary. Have you deleted the .frm file InnoDB: and not used DROP TABLE? Have you used DROP DATABASE InnoDB: for InnoDB tables in MySQL version <= 3.23.43? InnoDB: See the Restrictions section of the InnoDB manual. InnoDB: You can drop the orphaned table inside InnoDB by InnoDB: creating an InnoDB table with the same name in another InnoDB: database and moving the .frm file to the current database. InnoDB: Then MySQL thinks the table exists, and DROP TABLE will InnoDB: succeed.
Nach den Instruktionen der Fehlermeldung können Sie die
verwaiste Tabelle löschen. Wenn Sie DROP
TABLE
immer noch nicht ausführen können, kann das
Problem auch an der AutoVervollständigung von Namen durch den
mysql-Client liegen. Um dieses zu verhindern,
starten Sie den mysql-Client mit der
--disable-auto-rehash
-Option und versuchen noch
einmal Ihr DROP TABLE
. (Bei eingeschalteter
Namensvervollständigung versucht mysql eine
Liste von Tabellennamen zu erstellen. Das scheitert, wenn ein
Problem wie das oben beschriebene auftritt.)
Ein anderes Symptom für ein nicht mehr synchrones Data
Dictionary liegt vor, wenn MySQL meldet, dass eine
.InnoDB
-Datei nicht geöffnet werden kann:
ERROR 1016: Can't open file: 'child2.InnoDB'. (errno: 1)
Im Fehlerlog können Sie dann eine Nachricht wie diese vorfinden:
InnoDB: Cannot find table test/child2 from the internal data dictionary InnoDB: of InnoDB though the .frm file for the table exists. Maybe you InnoDB: have deleted and recreated InnoDB data files but have forgotten InnoDB: to delete the corresponding .frm files of InnoDB tables?
Dies bedeutet, dass Sie eine verwaiste
.frm
-Datei haben, zu der es in
InnoDB
keine Tabelle gibt. Die verwaiste
.frm
-Datei können Sie dann manuell
löschen.
Wenn MySQL mitten in einer ALTER
TABLE
-Operation abstürzt, haben Sie hinterher
vielleicht eine verwaiste temporäre Tabelle im
InnoDB
-Tablespace. Mit
innodb_table_monitor
sehen Sie dann eine
Tabelle namens #sql-...
aufgeführt. Sie
können SQL-Anweisungen auf Tabellen ausführen, deren Name das
Zeichen ‘#
’ enthält, wenn Sie
den Namen in Backticks setzen. So können Sie die verwaiste
Tabelle wie jede andere auch mit den zuvor beschriebenen
Methoden löschen. Achtung: Um eine Datei in der Unix-Shell zu
kopieren oder umzubenennen, müssen Sie den Dateinamen, wenn er
‘#
’ enthält, in doppelte
Anführungszeichen setzen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.