Ich bin ziemlich neu in MySQL und erhalte einen ziemlich interessanten Fehler, bei dem ich über Google und die Stackoverflow-Suche keine Hilfe finden kann.
Ich verwende einen lokalen Server von MySQL 5.6.10 unter MacOS 10.8.3 und verwalte meine Datenbank über Navicat Essentials für MySQL.
Der Fehler, den ich bekomme, ist, dass nach dem Ausführen und Verwalten meiner Datenbank für ein paar Tage / Wochen etwas ausgelöst wird, um einige der Tabellen, die ich mithilfe von Abfragen in Navicat erstellt habe, zu löschen (es scheint unvollständig zu sein).
Wenn ich versuche, Abfragen mit diesen Tabellen auszuführen, warnt mich Navicat, dass die jeweilige Tabelle nicht vorhanden ist. So weit so gut - hier kommt der gute Teil:
Wenn ich versuche, die zuvor vorhandene Tabelle mit dem Namen "temp" zu erstellen, wird die folgende Fehlermeldung angezeigt:
Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.
Wenn ich jedoch versuche, die Tabelle zu löschen oder den Tabellenbereich für diese Tabelle zu verwerfen, verwenden Sie
DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;
Ich erhalte folgende Fehlermeldungen:
Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist
Das bedeutet, dass mir empfohlen wird, den Tabellenbereich zu verwerfen, aber wenn ich dies versuche, existiert die Tabelle nicht. Ist es möglich, dass sich eine Art Rest dieser Tabelle an einer anderen Stelle befindet, an der die DISCARD-Abfrage nicht überprüft wird? Und hat jemand eine Idee, was all das auslösen könnte - völlig zufällig, wie es scheint?
Wie gesagt, ich bin neu in diesem Thema und ziemlich ahnungslos. Ich vermute, dass ein Neustart meines Laptops, dh ein Zurücksetzen meines lokalen MySQL-Servers oder möglicherweise Benutzerberechtigungen damit zu tun haben, aber ich gehe hier nur von einer Hypothese aus.
quelle
Antworten:
Ein bisschen spät hier, aber im Allgemeinen ist dieses Problem aufgetreten, wenn beim Ausführen im Modus "innodb_file_per_table" der Fehler "Tablespace full" angezeigt wird. Ohne zu sehr ins Detail zu gehen (mehr hier ), wird der Tabellenbereich des Datenbankservers durch die Einstellung innodb_data_file_path definiert und ist standardmäßig eher klein. Selbst wenn der Tablespace voll ist, kann er bei größeren Abfragen und dergleichen immer noch auftreten (viele Nicht-Tabellen-Inhalte werden dort gespeichert, Protokolle, Caches usw. werden rückgängig gemacht).
Wie auch immer, ich habe festgestellt, dass, wenn Sie in das Betriebssystemverzeichnis schauen, in dem die Dateien pro Tabelle gespeichert sind, / var / lib / mysql standardmäßig unter OSX, / usr / local / var / mysql mit homebrew iirc, eine finden verwaiste Datei tablename.ibd ohne die normale Begleitdatei tablename.frm. Wenn Sie diese .ibd-Datei an einen sicheren temporären Speicherort verschieben (nur um sicher zu gehen), sollte dies das Problem beheben.
Eine Einschränkung: Stellen Sie sicher, dass alles, was das Problem ursprünglich verursacht hat, z. B. eine Abfrage mit langer Laufzeit, eine gesperrte Tabelle usw., gelöscht wurde. Andernfalls erhalten Sie beim zweiten Versuch nur eine andere verwaiste .ibd-Datei.
quelle
/usr/local/mysql/data
statt gespeichert/var/lib/mysql/
. Ansonsten das Problem perfekt gelöst.Xampp- und Mamp-Benutzer
Hatte den gleichen Fehler beim Importieren einer Datenbank (nach dem Leeren) über MySQL. Ich stellte fest, dass ich eine
tablename.ibd
Datei übrig hatte, während alle anderen gelöscht wurden. Ich habe es manuell gelöschtmysql/data/database_name
und der Fehler war verschwunden.quelle
Für WAMP-Benutzer [Windows 7 Ultimate x64-bit]:
Ich stimme dem zu, was DangerDave gesagt hat, und stelle daher eine Antwort für WAMP-Benutzer zur Verfügung .
Jetzt sehen Sie Ordner aller Ihrer Datenbanken
[Your offending MySQL table name].frm
, stattdessen sollte es eine Datei geben[Your offending MySQL table name].ibd
[Your offending MySQL table name].ibd
quelle
Wenn Sie die
.idb
Datei nach dem Löschen erneut erstellen, lesen Sie diese Antwort.So hat es bei mir funktioniert. Ich hatte die
.idb
Datei ohne entsprechende.frm
und wenn ich die.idb
Datei lösche , erstellt die Datenbank sie erneut. und ich fand die Lösung in einer Zeile in der MySQL- Dokumentation ( Tablespace existiert nicht Teil)Ich habe eine andere Tabellendatei kopiert
.frm
und sie wie meine fehlende Tabelle benannt, dann eine normale Drop-Table-Abfrage durchgeführt und voila, es hat funktioniert und die Tabelle wird normal gelöscht!Mein System ist XAMPP unter Windows MariaDB 10.1.8
quelle
In meinem Fall war die einzige Arbeitslösung:
bad_table
ENGINE = MyISAM ...bad_table
quelle
Dies ist genau das, was ich in Mariadb 10.2.16 auf Fedora getan habe, als ich eine Tabelle hatte, die genau die gleichen Fehler in der Protokolldatei zeigte, nehme ich an ...
Ihr Kilometerstand und Ihre Fehler können variieren, aber der wichtigste, den ich annehme, ist
mit Drop-Tabelle funktioniert nicht so gut wie Tabelle ändern ...
Das Erstellen einer Tabelle schlägt ebenfalls folgendermaßen fehl:
Um dies zu beheben, habe ich zuerst getan
dann habe ich im Verzeichnis / var / lib / mysql / database_name Folgendes als root ausgeführt, um das Überschreiben von innodb_table.ibd zu bestätigen, was zu Problemen geführt hat
Dann gab ich in der MySQL-Konsole einen erfolgreichen Drop-Befehl für beide Tabellen aus
und jetzt ist alles quadratisch und ich kann die eine einzige Tabelle neu erstellen ...
quelle
In meinem Fall:
Entfernen Sie zuerst
tableName.ibd
in Ihrem Datenbankverzeichnis von MySQL und führen Sie dann Folgendes aus:quelle
Ich habe den gleichen Fehler beim Ausführen auf wampserver erhalten, als ich versucht habe, eine Benutzertabelle zu erstellen. Ich habe eine Datei users.ibd gefunden und nachdem ich diese Datei gelöscht habe, habe ich den Befehl migrate erneut ausgeführt und es hat funktioniert. Die Datei auf meinem Windows-Computer befand sich in wamp / bin / mysql / mysql5.6.12 / data / myproject.
quelle
Lösung
Die einfachere Option ist jedoch folgende: Starten Sie MySQL neu und führen Sie dann die folgenden vier Schritte aus:
Auf diese Weise stimmten die Tablespace-ID im Datenwörterbuch und die Datei überein. Damit war der Import des Tablespace erfolgreich.
Dies kann Ihnen mehr Vertrauen in den Umgang mit einigen der InnoDB- "Gotchas" während des Wiederherstellungsprozesses oder sogar der Dateiübertragung geben.
ref
quelle
Hier sind die Lösungsschritte:
quelle
Hatte dieses Problem mehrmals. Wenn Sie eine große Datenbank haben und versuchen möchten, Sicherung / Wiederherstellung (mit hinzugefügter fehlender Tabelle) zu vermeiden, versuchen Sie es einige Male hin und her:
DROP TABLE my_table;
ALTER TABLE my_table DISCARD TABLESPACE;
-und-
rm my_table.ibd (verwaist ohne entsprechende my_table.frm) befindet sich im Verzeichnis / var / lib / mysql / my_db /
-und dann-
TABELLE ERSTELLEN, WENN NICHT EXISTIERT
my_table
(...)quelle
Das Löschen / Verschieben von tablename.ibd hat bei mir sicher nicht funktioniert.
Wie ich es gelöst habe
Da ich die beschädigte und nicht vorhandene Tabelle löschen wollte, habe ich eine Sicherungskopie der anderen Tabellen erstellt, indem ich zu phpmyadmin-> Datenbank-> Export-> Ausgewählte Tabellen zum Sichern-> Exportieren (als .sql) gegangen bin.
Danach habe ich das Datenbanksymbol neben dem Datenbanknamen ausgewählt und dann gelöscht. Neue Datenbank erstellt. Wählen Sie Ihre neue Datenbank aus-> Importieren-> Wählen Sie die zuvor heruntergeladene Datei aus-> Klicken Sie auf Importieren. Jetzt habe ich meine alten Arbeitstabellen und habe die beschädigte Tabelle gelöscht. Jetzt erstelle ich einfach die Tabelle, die den Fehler ausgelöst hat.
Wahrscheinlich hatte ich eine frühere Sicherung der beschädigten Tabelle.
quelle
Dieser Fehler tritt auf, wenn Sie einige Funktionen anhalten. Als würde man die folgende Abfrage mit einem falschen Fremdschlüssel ausführen.
quelle
Hatte genau das gleiche Problem; Ich hatte hinzugefügt
[email protected]
(nachdem ich zuvor 5.5 hatte).Die Standardeinstellungen für 5.6 sind,
innodb_file_per_table=1
während sie in 5.5 sindinnodb_file_per_table=0
.Ihre vorhandene
ibdata1
Datei (die kombinierten Innodb-Daten) enthält weiterhin Verweise auf die Tabellen, die Sie erstellen / löschen möchten. Wechseln Sie entwederinnodb_file_per_table
zurück zu 0 oder löschen Sie die ibdata1-Datendatei ( dadurch gehen alle Ihre Daten verloren. Stellen Sie daher sicher, dass Sie sie zuerst mysqldumpen oder bereits einen .sql-Speicherauszug haben ).Die andere
[email protected]
Standardeinstellung, die mich gebissen hat, war das Fehlen eines Ports. Daher wurden im Netzwerk standardmäßig Unix-Sockets verwendet, und der MySQL-Client meldete weiterhin:Ich
<string>--port=3306</string>
habe dem.plist
Array hinzugefügt , aber Sie können auchport=3306
in Ihrem angebenmy.cnf
Führen
brew services stop [email protected]
Sie dann Ihre Änderungen ausbrew services start [email protected]
quelle
Der Versuch, den Tablespace zu löschen, kann zu anderen Fehlern führen. Für mich habe ich folgenden Fehler erhalten:
Meine Lösung bestand darin, die Datenbank zu löschen. Dadurch werden alle damit verbundenen Tabellenbereiche entfernt und Sie können die Tabellen erneut erstellen.
quelle
rm -r
. Es ist irritierend, aber auch nicht auffällig.Wenn Sie einen anderen Server mit einer guten Version derselben Tabelle haben, können Sie eine Kopie (table_copy) erstellen und die table_copy auf den Problemserver übertragen. Löschen Sie dann die Problemtabelle und benennen Sie table_copy in table um.
quelle
Für mich hat es geholfen, einfach in das MYSQL DATA-Verzeichnis unter / var / lib / mysql / {Datenbankname} (Linux) zu wechseln und die .ibd- Datei {Tabellenname} zu löschen , die mit dem Ordnernamen identisch war.
quelle
Ich lösche nur meine alte Datenbank in meinem lokalen Host direkt aus wamp, stoppe alle Dienste, gehe zu wamp / bin / mysql / mysql [version] / data und habe die Datenbank mit Problemen gefunden. Ich lösche sie und starte erneut alle Dienste. Erstellen Sie erneut Ihre Datenbank und es ist fertig. Jetzt können Sie Ihre Tabellen importieren.
quelle
Die Art und Weise, wie ich dieses Problem "lösen" konnte, ist ziemlich ärgerlich, aber es gibt ein Skript, das es behandelt.
Im Wesentlichen müssen Sie die
ibdata1
undib_logfile*
Dateien (sie die Zuordnungen von Fremdschlüssel enthalten, unter anderem) gehen weg. Der einzig sichere Weg, dies zu tun, besteht darin, alle Ihre Datenbanken zu exportieren, MySQL zu stoppen, die Dateien zu entfernen, MySQL zu starten und dann die Dateien zu importieren.Das Skript , das dieses Problem lösen hilft ist https://github.com/uberhacker/shrink-ibdata1 , obwohl das erklärte Ziel dieses Skripts ist anders, es tut das Problem lösen.
quelle
Der einzige Weg, wie es für mich funktionierte, war:
quelle
Wenn Sie dieses Problem haben und keine andere Option haben, ändern Sie die Engine in eine andere Engine wie 'myisam', und versuchen Sie, die Tabelle zu erstellen.
Haftungsausschluss: Dies ist keine gültige Antwort, da Sie möglicherweise Fremdschlüsseleinschränkungen haben, die von einer anderen Speicher-Engine nicht unterstützt werden. Jede Speicher-Engine hat ihre eigene Spezialität zum Speichern und Zugreifen auf Daten. Diese Punkte müssen ebenfalls berücksichtigt werden.
quelle
Bitte verwerfen Sie den Tablespace vor IMPORT
Ich habe die gleiche Problemlösung unten
Zuerst müssen Sie Ihren Datenbanknamen löschen. Wenn Ihre Datenbank nicht gelöscht wird, haben Sie mich fließen lassen. Für Windows-Systeme lautet Ihr Verzeichnis C: / xampp / mysql / data / yourdabasefolder. Entfernen Sie "yourdabasefolder".
Wieder müssen Sie eine neue Datenbank erstellen und Ihre alte SQL-Datei importieren. Es wird Arbeit sein
Vielen Dank
quelle
Ich musste mein MySQL-Datenverzeichnis finden:
VARIABLEN ANZEIGEN, WO Variablenname WIE "% dir"
Dann erzwinge das Entfernen dieser Datenbank:
sudo rm -rf
quelle
Sie können die folgende Abfrage als MySQL-Root-Benutzer ausführen
quelle
Hey Entwickler verschwenden keine Zeit. Löschen Sie einfach die Datenbank mit den Tabellen und importieren Sie ganze Tabellen erneut. Zeit sparen = Zeit ist Geld. Prost.
quelle