Ich möchte in diesem Guide zeigen wie einfach eine MySQL Datenbank von einem Server auf einen den anderen Server übertragen werden kann oder dupliziert wird. Es gibt natürlich mehrere Wege bzw. Programme von Drittanbietern, die einen Transfer (Sicherung) vereinfachen oder auch grafisch darstellen. Ich erkläre hier aber bewusst den Weg auf der Linux Konsole.
MySQL Datenbank sichern
Die MySQL Datenbank, mit dem Namen datenbank1, wird mit dem Befehl „mysqldump“ gesichert. Es wird dabei ein Abbild (dump) von datenbank1 nach /usr/src/datenbank1.sql geschrieben. Das MySQL Root Passwort wird nach der Eingabe abgefragt.
[bash]mysqldump -u root -p datenbank1 > /usr/src/datenbank1.sql[/bash]Datenbank Dump auf den neuen Server transferieren
Dieser Schritt kann übersprungen werden, wenn die Datenbank auf dem gleichen Datenbankserver kopiert werden soll.
Da die Datenbank nun in eine .sql Datei exportiert wurde kann sie auf den neuen Server (am Beispiel IP: 192.168.1.155) übertragen werden. Eine einfache Möglichkeit bietet der Befehl „scp“. Das Programm ist auf allen gängigen Linux Distributionen vorinstalliert und sehr einfach zu bedienen. (Ihr könnt die Datei auch manuell oder mit rsync transferieren)
[bash]scp /usr/src/datenbank1.sql root@192.168.1.155:/usr/src/[/bash]Nach der Passworteingabe wird die Datei datenbank1.sql auf den neuen Server übertragen.
Datenbank am neuen Server erstellen
Auf dem Zielserver müssen wir nun eine neue MySQL Datenbank erstellen, in die der MySQL Dump vom alten Server eingespielt wird. Es können natürlich spezielle Berechtigungen gesetzt werden, das würde aber diesen Beitrag sprengen. Daher wird der Datenbankuser mit grant all privileges auf datenbank1 angelegt und dabei auf den localhost begrenzt.
[bash]mysql -u root -p[/bash]Neue MySQL Datenbank (datenbank1) erstellen:
[bash]create database datenbank1;[/bash]MySQL Datenbankbenutzer (dein-user) mit dem Passwort (dein_passwort) anlegen
[bash]grant all privileges on datenbank1.* to ‚dein_user’@’localhost‘ identified by ‚dein_passwort‘ with grant option;[/bash]MySQL Datenbank wiederherstellen
Der MySQL Datenbank dump (datenbank1.sql) wird nun am neuen Server in die zuvor erstelle neue Datenbank (datenbank1) wiederhergestellt. Das MySQL root Passwort wird nach der Eingabe abgefragt.
[bash]mysql -u root -p datenbank1 < /usr/src/datenbank1.sql[/bash] [sam id=“2″ codes=“true“]Gesamten MySQL Datenbankserver mit mehreren Datenbanken transferieren
Wer einen größeren MySQL Datenbankserver mit vielen Datenbanken transferieren möchte, der sollte sich am alten Server die Datenbank „mysql“ mit dumpen, da dort die User Informationen, Rechte und Passwörter gespeichert sind. So ist es nicht notwendig, neben den Datenbanken auch noch die User und Passwörter anzulegen.
Kurze Zusammenfassung:
[bash]mysqldump -u root -p mysql > /usr/src/mysql.sqlscp /usr/src/mysql.sql root@192.168.1.155:/usr/src/
mysql -u root -p mysql < /usr/src/mysql.sql[/bash]
Nach dem Einspielen sollte unbedingt noch ein flush privileges auf der Datenbank durchgeführt werden:
[bash]mysqladmin -u root -p flush-privileges[/bash]
Wenn man nicht mehr genau weiss welche grants der User auf dem alten System hatte kann ich auch
show grants for ‚dein-user’@’localhost‘;
sehr empfehlen. Selbes gilt für die Datenbank selbst. Wurde die mit anderen Lokalisierung als der default oder ähnliches angelegt findet man das schön mit
show create database datenbank1;
heraus 😉
Danke noqqe für den Tipp! Funktioniert wirklich prima!
Gruß
Patrick
locked denn mysqldump per default die komplette Datenbank während des Dumps?
Ja standardmäßig wird mysqldump mit dem Parameter –opt aufgerufen, und dieser beinhaltet den flag –lock-tables. Wenn man den Lock umgehen möchten dann kann man bei mysqldump den flag –skip-lock-tables oder –lock-tables=false setzen.
Gruß
Patrick
Das einzige was mich an deiner Lösung stört ist der Speicherort des Dumps: /usr/src/.
Meiner Meinung sollte man Daten auch nur in dafür vorgesehenen Pfaden speichern.
Hier ergibt sich evtl. auch noch das Problem: Der Dump wird in der Regel mit der Berechtigung: -rw-r–r– angelegt, da heißt: Er ist von allen(!) lesbar! Je nach Daten könnte dies ein Problem sein.
LG
Erik
Bei den meisten Systemen (bspw. Debian) sind die root-Zugangsdaten der mysqldatenbank in einer cnf-Datei gespeichert. Diese sollte man nutzen. Wenn man Skriptgesteuert was machen will müsste man sonst user und pw direkt angeben, wodurch sie in der Prozessliste landen. Ich würde es also so machen:
mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --skip-extended-insert --skip-comments datenbank > datenbank.sql
Die beiden extra Parameter sorgen dafür, dass der dump sich nur verändert, wenn auch wirklich in der Datenbank änderungen vorgenommen wurden. Damit kann man die Dumps auch gut in git oder bzr speichern.
Ich habe dazu auch ein kleines Skript gebastelt. Mehr dazu habe ich hier niedergeschrieben:
http://wiki.ubuntuusers.de/MySQL/Backup#Automatisches-inkrementelles-Backup
Hat jemand erfahrungen wie lange so etwas mit einer sehr großen Datenbank dauert? Ich habe hier ein 14GB mysql DB die ich umziehen will, aber mir fehlen da komplett die Erfahrungen.
14 Gb ist wirklich riesig. das könnte schon einige Probleme bereiten. ich würde aber gefühlsmäßig sagen, dass du je nach Anzahl der einträge eine Stunde bis mehrere Stunden benötigen wirst. Dabei wird aber wahrscheinlich deine Performance auf 100 % schiessen. also denk daran, dass für die Zeit der Rechner erstmla nicht genutzt werden kann.
Noch ein Tipp für die Leute, die die MySQL Datenbank transferieren möchten, weil sie WordPress umziehen müssen: Da gibt es ein schönes Plugin namens „Duplicator“, das die ganze Arbeit erledigt (inklusive Import auf dem neuen Hosting). Oder man kann die Verwaltung infiniteWP verwenden, was aber eher für Leute geeignet ist, die häufiger den Bedarf haben, WordPress Blogs zu transferieren.
Grüße!
Jens
@Adam:
also ich habe hier bei mir auf einem der Server eine Datenbank aus der produktiven Umgebung, die 13Gb groß ist. Da wir jede Nacht ein MSQL-Dump davon gemacht.
Das lasse ich dann auch jeden Morgen für eine Testumgebung auf einem anderen Server einspielen…geht alles wunderbar und dauert in unserer Umgebung etwa 50 Minuten.
Gruß
Ähnliches Szenario auch bei uns. Ich sichere jeden Tag eine Cloud Datenbank auf einen Backupserver und spiele diese anschließend in einer Dev Umgebung ein. Die Datenbank hat in etwa 9 GB – dauert ein wenig länger, weil das direkt vom Internet gezogen wird, aber funktionier völlig problemlos.
Hallo,
Ich bin recht neu in Ubuntu / MySql und wollte gerne einen Benutzer erstellen, der nur ein Backup erstellen kann und sonst nichts.
Könntet ihr mir mit den Rechten bitte helfen?
ich kenne nur
„grant all privileges on datenbank1.* TO ‚backup’@’localhost‘;“
das als lösungsansatz.
Ihr kennt doch bestimmt bessere Möglichkeiten oder?
Gruß Timo
danke für die anleitung, die mir wirklich weitergeholfen hat. allerdings auch nicht ganz bis zum ziel, denn beim versuch, den dump wieder zu importieren, bekomme ich folgende fehlermeldung: „ERROR 1136 (21S01) at line 219: Column count doesn’t match value count at row 194“ – wie kann das sein, wo es sich doch um einen 1:1-dump handelt???
Ich habe ein anderes Szenario.
Mein alter Server wurde gekapert, der Datenbankdienst ist nicht mehr lauffähig.
Ich habe jedoch die Datenbank-Verzeichnisse und Dateien sichern können.
Kann ich diese irgendwie wieder beleben?
Und wie macht man das mit Windows? Ist da der CMD unter Admin auch so einfach machbar wie unter Linux?
Oder bedarf es da andere Methoden. Würde gerne Datenbanken miteinander verbinden, so dass ich unterm Strich nur eine verwalte, aber Änderungen auf beide DBs zutreffen.