Ich versuche, .frm (SQL-Datendateien) in Textdateien zu konvertieren. Der Grund dafür ist, dass ich sehen möchte, wie die SQL-Engine die Daten „hinter den Kulissen“ speichert. Beispiel: Bei Verwendung von „ENUM“ speichert SQL einen „INTEGER“ namens „INDEX“. Wenn also jemand eine Software oder Methode zum Konvertieren von .frm in .txt kennt, danke an alle und einen schönen Tag.
Antwort1
Dieser Artikel beschreibt eine bewährte Vorgehensweise:
Die Grundlagen sind nicht allzu schwer zu verstehen, aber die Details sind knifflig. Der erste Teil dieses Problems besteht darin, die Tabellendefinition aus den .frm-Dateien zu extrahieren. Den zweiten Teil des Problems werde ich in einem anderen Beitrag behandeln. Sie könnten ein Programm schreiben, das die .frm-Datei liest, analysiert und die Tabellendefinition ausgibt, aber das ist eine Menge Arbeit – insbesondere, wenn Sie MySQL dazu bringen können, dies für Sie zu tun. So würden Sie dies für die Datei foo.frm tun.
mysql> CREATE TABLE `test`.`foo` (id int) ENGINE=InnoDB;
Wir haben eine InnoDB-Tabelle namens foo erstellt. MySQL hat eine foo.frm- und eine foo.ibd-Datei in $datadir/test geschrieben. Außerdem wurde ein Eintrag dieser Tabelle im Datenwörterbuch erstellt.
mysql> FLUSH TABLES;
Dies führt dazu, dass MySQL alle offenen Tabellen schließt und den Abfragecache leert. Die Idee besteht darin, MySQL dazu zu zwingen, die gerade erstellte Tabelle „foo“ zu vergessen.
bash# cp foo.frm /var/lib/mysql/test;
Wir haben gerade die Tabellendefinition für test.foo überschrieben. Wir haben es im laufenden Betrieb gemacht, während MySQL noch lief.
mysql> SHOW CREATE TABLE `test`.`foo`;
Dadurch wird die Tabellendefinition für die Datei foo.frm ausgegeben, die wir gerade in das Testverzeichnis kopiert haben. MySQL wird wahrscheinlich etwas verwirrt sein, da die Informationen in der .frm-Datei wahrscheinlich nicht mit denen im Systemtabellenbereich übereinstimmen. Sie werden wahrscheinlich eine Meldung wie diese in Ihrem Fehlerprotokoll sehen:
[FEHLER] Die Tabelle ./test/foo hat keinen Primärschlüssel im InnoDB-Datenwörterbuch, aber einen in MySQL! Wenn Sie die Tabelle mit einer MySQL-Version < 3.23.54 erstellt und keinen Primärschlüssel definiert haben, sondern einen eindeutigen Schlüssel mit allen Spalten ungleich NULL, dann behandelt MySQL diesen Schlüssel intern als Primärschlüssel. Sie können diesen Fehler beheben, indem Sie dump + DROP + CREATE + erneut importieren.
Das ist aber OK, räumen Sie einfach auf.
mysql> DROP TABLE `test`.`foo`;
Um die Unannehmlichkeit zu vermeiden, dies für mehrere Hundert Tabellen durchführen zu müssen, verwenden Sie das unter folgender Adresse bereitgestellte Skript:Bluegecko-Artikel. Du solltest sortiert sein. Chagbert.