webentwicklung-frage-antwort-db.com.de

MySQL Table existiert nicht, aber es existiert ein Fehler

Weiß jemand, unter welchen Bedingungen Sie einen 1146: Table '<database>.<table>' doesn't exist-Fehler erhalten können, wenn Ihre Tabelle tatsächlich existiert?

Ich verwende denselben Code auf 5 Servern. Nur einer, den ich kürzlich gemietet habe, zeigt diesen Fehler. Ich vermute, dass es sich dabei um einen Fehler bei Einstellungen oder Installationen handelt. Ich kann meine SQL-Anweisung von der Kommandozeile aus gut ausführen. Natürlich kann ich die Tabelle auch von der Kommandozeile aus sehen. Ich erhalte keine Verbindungsfehler, wenn ich eine Verbindung aufbaue (ich verwende mysqli, btw).

Jede Hilfe wäre dankbar.

genaue Abfrage:

$sql = "SELECT DISTINCT(mm_dic_Word) AS Word FROM spider.mm_dictionary WHERE mm_dic_deleted=0";
19
Troy Knapp

Grundsätzlich glaube ich, dass das Problem, das ich erlebte, auf unterschiedliche Passwort-Hash-Längen zurückzuführen ist. In meinem Fall bekam ich einen neuen Server, machte einen kompletten mysql-Dump, der Passwörter und Benutzerinformationen übertrug. Der neue Server wurde bereits mit einem Root-Benutzer mit einem Hash von 16 Zeichen Länge initialisiert, aber mein alter Server verwendete die neueren Hash-Längen von 32 Zeichen.

Ich musste in my.conf gehen und die alten Passwörter auf 0 setzen (andernfalls jedes Mal, wenn ich versuchte, die Datenbank zu aktualisieren, das neue Update war 16 Zeichen lang). Ich habe dann alle Passwörter über den Befehl UPDATE mysql.user SET password=PASSWORD('password here'); auf das gleiche aktualisiert, und dann die Berechtigungen gelöscht. 

Natürlich ist es eine wirklich schlechte Idee, jeden Benutzer mit dem gleichen Passwort zu haben. Deshalb habe ich sie nach und nach geändert, nachdem ich die Funktionsfähigkeit bestätigt hatte.

Ich habe einen Blogeintrag geschrieben, der auf einige der anderen Dinge eingeht, die ich getan habe, die nicht funktioniert haben hier , bevor ich auf diese Lösung gestoßen bin (nur für den Fall, dass eine oder mehrere dieser Änderungen mein Ergebnis beeinflussten) Ich denke, dass die obige Lösung vollständig ist ... aber ich habe nicht versucht, den Fehler zu reproduzieren, daher kann ich nicht zu 100% sicher sein.

2
Troy Knapp

Das passierte mir einfach und nach einer Weile fand ich die Antwort in einem Blogartikel und wollte es auch hier stellen.

Wenn Sie das MySQL-Datenverzeichnis von /var/lib/mysql nach /path/to/new/dir kopieren, aber nur die Datenbankordner kopieren (dh mysql, wpdb, ecommerce usw.) UND Sie über innodb-Tabellen verfügen, werden Ihre innodb-Tabellen in 'show tables' angezeigt, jedoch mit Abfragen (select und describe) schlagen mit dem Fehler Mysql error: table db.tableName doesn't exist fehl. Sie sehen die Datei .frm im Verzeichnis db und wundern sich, warum.

Für innodb-Tabellen ist es wichtig, die ib*-Dateien zu kopieren, die in meinem Fall ibdata1, ib_logfile0 und ib_logfile1 waren. Nachdem ich die Übergabe gemacht hatte, um sicherzugehen, dass ich sie kopierte, funktionierte alles wie erwartet.

Wenn Ihre my.cnf-Datei "innodb_file_per_table" enthält, ist die .ibd-Datei im Verzeichnis db vorhanden, Sie benötigen jedoch weiterhin die ib * -Dateien.

44
Isaac

Die Verwendung von mysqlcheck wäre in diesem Fall in Ordnung - so können Sie Tabellenprobleme beseitigen und sie reparieren, wenn nötig.

4
David Ramirez

Könnte es sein, dass Ihr einziger Server eine Linux-Box ist? MySQL ist unter Linux case case, aber unter Windows unempfindlich.

2
Jan Thomä

Ich hatte einmal ein solches Verhalten. Später entdeckte ich, dass der von mir verwendete JDBC-Treiber meine Abfrage in Kleinbuchstaben geändert hatte, sodass ich meine Datenbank (die gemischte Großbuchstaben verwendete) nicht damit erreichen konnte, obwohl mein Code die richtigen gemischten Buchstaben verwendete.

1
Ray

Dies passierte mir, als ich versuchte, eine Tabelle mit UPPERCASE auszuwählen und der Tabellenname klein geschrieben war.

Um diese Frage zu lösen, habe ich "lower_case_table_names = 1" in meine.cnf-Datei eingefügt.

1
Allan Zeidler

Wenn Sie als jemand angemeldet sind, der nicht berechtigt ist, diese Datenbank/Tabelle anzuzeigen, erhalten Sie wahrscheinlich dieses Ergebnis. Verwenden Sie in der Befehlszeile dasselbe Login wie über mysqli?

0
mveerman

Es könnte damit zusammenhängen, dass InnoDB- und MyISAM-Tabellen zusammen vorhanden sind. Wenn Sie die Datenbankdateien kopieren, ist MyISAM in Ordnung und InnoDB wird angezeigt, funktioniert jedoch nicht.

0
gdelfino

Ich habe dies auf einem centos 6.4-System mit mysql 5.1 und einem xfs-Dateisystem gesehen. 

Die Tabellen werden mit 'Tabellen anzeigen' angezeigt, aber ein Auswählen oder Beschreiben schlägt fehl, und die Tabelle enthält keine vorhandene Nachricht, wie Sie beschrieben haben. Die Dateien sind dort, wo ich sie erwarte.

Das System lief über Monate hinweg einwandfrei. Nach einem Neustart des Dienstes mysqld, nachdem /etc/my.cnf geändert wurde, um table_cache auf 512 statt 256 zu setzen, ging es seitwärts.

Arcconf zufolge glaubt der Schlachtzugscontroller, dass alles in Ordnung ist. xfs_check findet nichts. Die Systemereignisliste von IPMI ist eindeutig. dmesg zeigt einige Beschwerden von iptables über das Tracking von Verbindungen und das Löschen von Paketen, daher waren wir möglicherweise DOS-Dateien. Da jedoch nichts auf dem Server läuft, sehe ich nicht, wie sich dies auf die MySQL-Datenintegrität auswirken könnte.

Am Ende habe ich den Slave als Master befördert und das System neu geladen. Jetzt frage ich mich, was den Fehler verursacht haben könnte und ob die Wahl von xfs auf centos 6.4 immer noch eine stabile Wahl ist oder ob der Täter mysql 5.1 war. 

Ach ja und ändere niemals ein laufendes System :)

0
Michael Will

Mac OS X? STOPP, kopiere noch nichts ... 

Ich hatte dieses Problem ein paar Mal bei Mavericks. MySQL ist nicht mehr enthalten, aber meine Installation entspricht im Wesentlichen dem, was Sie auf Snow Leopard erwarten würden, denke ich, anstatt auf MAMP oder so.

Nach der Migration von einem Computer zu einem anderen hatte ich dieses Problem. Es war das Ergebnis des MySQL-Kontrollfelds, das mysqld startete, anstatt es auf der Befehlszeile zu starten. (Bei der Migration vergisst das etwas veraltete Kontrollfeld, dass Sie es NICHT beim Booten starten sollen.)

Schauen Sie sich die Prozesse (oben oder Aktivitätsmonitor) auf meinem System an: Wenn der Besitzer root ist, wurde er vom Systemstart gestartet und funktioniert nicht ordnungsgemäß. Der richtige Prozess wird _mysql als Besitzer haben. 

Manchmal laufen beide Prozesse nebeneinander!

Seltsamerweise können Sie alles tun, einschließlich der Verwendung von mysql über die Befehlszeile. Obwohl innodb-Tabellen aufgelistet sind, erzeugen sie bei der Abfrage jedoch keinen Fehler.

Dies scheint ein Eigentumsproblem zu sein, das auch auf anderen Systemen zutreffen kann.

0
Phreditor