MySQL Datenbank klonen

Frosch trägt Aktenstapel
Hinweis: da vor Kurzem die Software hinter diesem Blog umgestellt wurde, kann es Umstimmigkeiten bei der Darstellung dieser Inhalte und den RSS-Feeds geben. Über Hinweise bei Problemen an info@v-gar.de wäre ich sehr dankbar.

Bei der Softwareentwicklung ist es manchmal nötig, zum Testen von z.B. Migrationen die Datenbank eines Livesystems zu klonen, d.h. diese an eine andere Stelle zu kopieren. Dieser Artikel erklärt, wie das geht.

Unter MySQL und Linux ist das Vorhaben mit einem sehr einfachen Kommando möglich:

DB auf anderen Host klonen

mysqldump --add-drop-table --no-create-db --databases dbname1 -uDBUSER1 -pPASSWORD1 -h 192.168.100.1 | mysql -h 192.168.100.2 -uDBUSER2 -pPASSWORD2 dbname1

Der Kern des Kommandos ist relativ einfach und einleuchtend: erst wird ein mysqldump erstellt, der per Pipe sofort in eine SQL-Shell geleitet wird. Konkret kommt es auch auf die Optionen an, die je nach Anwendungsfall angepasst werden müssen. So habe ich in diesem Beispiel auf dem Zielhost (192.168.100.2) die Datenbank bereits (ohne weitere Tabellen) erstellt und bestimmte Rechte den Benutzern zugewiesen. Deswegen nutze ich die Option --no-create-db. Damit unter dem Szenario aber die Tabellen sauber gelöscht werden, wird --add-drop-table benötigt. Die konkrete Befehlsreferenz (insb. für die Optionen) lässt sich in der MariaDB-Dokumentation einsehen.

Hinweis: die Option -h wird nur benötigt, wenn auf einem anderen Host gearbeitet werden soll. Die beispielhaft gewählten Adressen müssen dann entsprechend angepasst werden.

Knackpunkt bei dieser Variante ist, dass die geklonte Datenbank den gleichen Datenbanknamen trägt (deswegen macht dies nur bei zwei Hosts Sinn).

DB auf gleichen Host klonen

mysqldump --add-drop-table --no-create-db --databases dbname1 -uDBUSER1 -pPASSWORD1 -h 127.0.0.1 | sed --expression='s/dbname1/dbname2/g' | mysql -h 127.0.0.1 -uDBUSER2 -pPASSWORD2 dbname2

Um der geklonten Datenbank einen anderen Namen zu geben, kann sich an einem Trick bedient und der mysqldump noch einmal durch sed geschoben werden, um den Datenbanknamen auszutauschen.

1 Kommentar

Kommentar verfassen