Ich werde in diesem Artikel beschreiben, wie ich eine MySQL Datenbank von einem anderen Server importieren kann, wenn mir kein Dump zur Verfügung steht. Voraussetzung ist lediglich, dass man auf das Data Verzeichnis des Fremdservers noch zugreifen kann.
Meine Ausgangssituation ist eine Festplatte mit Daten, die zuvor bereits unter einer Windows 7 Installation genutzt wurden. Diese Installation wurde kompromittiert und kann nicht mehr verwendet werden. Also habe ich die Festplatte mit dem Betriebssystem ausgebaut und durch eine neue Festplatte ersetzt. Auf dieser Festplatte habe ich Xubuntu Linux installiert. Auf dem Windows System kann ich den MySQL Server nicht mehr starten und daher auch keinen Dump der Datenbanken mehr machen.
Die Anleitung geht daher von einem Linux System aus. Man benötigt dazu ein Terminal-Fenster und einen laufenden MySQL Server. Für die SQL-Befehle benötigt man entweder die MySQL Kommandozeile, MySQL Workbench oder phpMyAdmin.
Zuerst erstelle ich auf dem neuen, laufenden MySQL Server eine neue Datenbank mit dem Namen derjenigen Datenbank, die ich importieren möchte.
create database mydb;
Danach öffne ich unter Linux ein Terminal Fenster. Ich gehe auf die Datenfestplatte in das Verzeichnis, in welchem sich das datadir des alten MySQL Servers befindet. Ich wechsele in das Unterverzeichnis der Datenbank, die ich importieren möchte. In meinem Beispielfall also
cd mydb
Für jede in diesem Verzeichnis befindliche Tabelle, also alle Dateien mit der Endung *.frm, führe ich den folgenden Befehl im Terminal aus
mysqlfrm --diagnostic [tabellenname].frm
Für [tabellenname] setzt Du bitte den Namen der jeweiligen Tabelle ein.
Nach Bestätigen des Befehls durch die Enter-Taste bekommt man u.a. einen SQL-Befehl angezeigt, mit dem die Tabelle angelegt werden kann. Z.B.
CREATE TABLE `accounts` (
`account_name` varchar(300) NOT NULL,
PRIMARY KEY `PRIMARY` (`account_name`)
) ENGINE=InnoDB;
Es kann bei manchen Tabellen passieren, dass bestimmte Informationen, wie z.B. “Character Set” nicht ausgelesen werden können und dann sieht der SQL-Befehl wie folgt aus:
CREATE TABLE `users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(135) CHARACTER SET <UNKNOWN> DEFAULT NULL,
`password` varchar(135) CHARACTER SET <UNKNOWN> DEFAULT NULL,
`profile` text CHARACTER SET <UNKNOWN> DEFAULT NULL,
PRIMARY KEY `PRIMARY` (`user_id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB;
In einem solchen Fall muss der Teil “CHARACTER SET <UNKNOWN>” herausgelöscht werden.
Dieser generierte SQL-Code wird nun in die Zwischenablage kopiert und in das MySQL Frontend Deiner Wahl eingefügt. Ich benutze phpMyAdmin dazu. Dann den Befehl innerhalb der neu angelegten Datenbank ausführen.
Damit hätte ich schon einmal die Tabelle generiert. Im nächsten Schritt will ich noch die Daten in die Tabelle importieren.
Hinweis: Dies funktioniert nur für Tabellen, die mit der INNODB-Engine laufen. MYISAM-Tabellen lassen sich auf diese Weise nicht importieren!
Zum Importieren der Daten muss ich auf das datadir des laufenden MySQL Servers zugreifen können. Hierzu gebe ich im Terminal folgenden Befehl ein:
sudo -i
Ich werde aufgefordert, dass root Passwort einzugeben. Damit habe ich Adminrechte innerhalb des Terminals. Ich kann nun in das Verzeichnis /var/lib/mysql wechseln, wozu ich mit einem normalen User keine Berechtigung hätte.
Als nächstes gehe ich auf den MySQL Server und löse die Verbindung des RDBMS zum Tablespace der Tabelle, die ich importieren will.
ALTER TABLE [tabellenname] DISCARD TABLESPACE;
Durch diesen Befehl wird in dem Datenverzeichnis die Datei [tabellenname].ibd gelöscht.
Nun kopiere ich die *.ibd vom alten Server in das Datenverzeichnis des neuen Servers.
cp /media/[username]/[zahl]/mysql/[datenbankname]/[tabellenname].ibd /var/lib/mysql/[datenbankname]
Hier musste ich etliche Platzhalter einbauen, weil das Quellverzeichnis bei Dir auch ganz anders aussehen könnte. In meinem Fall habe ich die Daten auf einer dedizierten Datenfestplatte. Wird diese unter Linux eingebunden und gemountet, so erscheint diese unter der Bezeichnung
/media/adrian/26B6A54BB6A51BF5/
Das könnte bei Dir anders aussehen. Auf dieser Festplatte habe ich unter dem Verzeichnis mysql das datadir für meinen alten MySQL Server. Darunter befinden sich Unterverzeichnisse für alle Datenbanken und die Dateien für die Tabellen. So kommt der oben gezeigte Pfad zustande.
Nachdem ich die Datei mit den Daten vom alten Server kopiert habe, muss ich mit dieser Datei noch zwei Dinge tun. Zunächst muss die Datei der richtigen Gruppe und dem richtigen User auf dem Linux System zugeordnet werden.
chown mysql:mysql [tabellenname].ibd
Sowohl die MySQL Gruppe, als auch der User heißt “mysql”. Das erklärt die Syntax für den obigen Befehl. Danach müssen noch die Rechte auf Dateiebene festgelegt werden.
chmod 640 [tabellenname]
Nun ist alles bereit, um diese neue Datei mit dem RDBMS zu verbinden. In MySQL gebe ich nun folgenden Befehl ein.
ALTER TABLE [tabellenname] IMPORT TABLESPACE;
Wenn ich jetzt ein SELECT-Befehl absetze, sehe ich, dass die Daten in der Tabelle erscheinen. Dieses Procedere wiederhole ich jetzt mit allen Tabellen aus der Datenbank und habe damit meine Daten vom alten MySQL Server in die neue MySQL Server Installation importiert.
Fragen oder Feedback zu diesem Artikel