Ich möchte ein Skript , das Kopien meiner aktuellen Datenbank schreiben , sitedb1
um sitedb2
auf der gleichen MySQL - Datenbankinstanz. Ich weiß, dass ich sitedb1 in ein SQL-Skript kopieren kann:
mysqldump -u root -p sitedb1 >~/db_name.sql
und importieren Sie es dann in sitedb2
. Gibt es einen einfacheren Weg, ohne die erste Datenbank in eine SQL-Datei zu kopieren?
Antworten:
Wie im Handbuch unter Kopieren von Datenbanken angegeben , können Sie den Speicherauszug direkt in den MySQL-Client leiten:
Wenn Sie MyISAM verwenden Sie können die Dateien kopieren, aber ich würde es nicht empfehlen. Es ist ein bisschen zwielichtig.
Integriert aus verschiedenen guten anderen Antworten
Sowohl
mysqldump
als auchmysql
Befehle akzeptieren Optionen zum Festlegen von Verbindungsdetails (und vieles mehr), wie z.Wenn die neue Datenbank noch nicht vorhanden ist, müssen Sie sie vorher erstellen (z
echo "create database new_db_name" | mysql -u <dbuser> -p
. B. mit ).quelle
mysqldump -uroot -p database1 | mysql -uroot -p database2
. Ich werde für beide Pws aufgefordert, kann aber nur einen eingeben. Die Eingabeaufforderung sieht folgendermaßen aus :Enter password: Enter password:
. Nach dem ersten pw wartet der Prozess für immer.Verwenden von MySQL-Dienstprogrammen
Die MySQL-Dienstprogramme enthalten das nette Tool,
mysqldbcopy
das standardmäßig eine Datenbank mit allen zugehörigen Objekten („Tabellen, Ansichten, Trigger, Ereignisse, Prozeduren, Funktionen und Zuweisungen auf Datenbankebene“) und Daten von einem DB-Server auf denselben oder einen anderen kopiert DB-Server. Es stehen viele Optionen zur Verfügung, um anzupassen, was tatsächlich kopiert wird.Um die Frage des OP zu beantworten:
quelle
mysqldump
basierte Lösung schlug fehl.sudo apt-get install mysql-utilities
, aber das ist sehr ordentlich. Kann ich das Passwort weglassen und aufgefordert werden, es einzugeben?mysqldbcopy
, Sie nach dem Passwort zu fragen. Zumindest konnte ich so etwas in der Dokumentation nicht finden. Sie können diese Funktionalität jedoch selbst erstellen. In Bash könnte das ungefähr so aussehen:mysqldbcopy --source=root:"$(read -sp 'Source password: ' && echo $REPLY)"@localhost --destination=root:"$(read -sp 'Destination password: ' && echo $REPLY)"@localhost sitedb1:sitedb2
--force
,mysqldbcopy
da ich die Zieldatenbank bereits erstellt hatte. Vielen Dank!quelle
Sie müssen den Befehl über das Terminal / die Eingabeaufforderung ausführen.
z.B:
mysqldump -u root test_db1 | mysql -u root test_db2
Dadurch wird test_db1 nach test_db2 kopiert und der Zugriff auf 'root' @ 'localhost' gewährt.
quelle
Am besten und einfachsten können Sie diese Befehle in Ihr Terminal eingeben und Berechtigungen für den Root-Benutzer festlegen. Funktioniert bei mir..!
quelle
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name
bei großen Datenbanken problematisch sein kann.Sie könnten verwenden (im Pseudocode):
Der Grund, warum ich die Syntax CREATE TABLE ... SELECT ... nicht verwende, besteht darin, Indizes beizubehalten. Dies kopiert natürlich nur Tabellen. Ansichten und Prozeduren werden nicht kopiert, obwohl dies auf die gleiche Weise erfolgen kann.
Siehe TABELLE ERSTELLEN .
quelle
Erstellen Sie zuerst die doppelte Datenbank:
Stellen Sie sicher, dass alle Berechtigungen usw. vorhanden sind und:
quelle
Sie können Folgendes tun:
quelle
Diese Anweisung wurde in MySQL 5.1.7 hinzugefügt, jedoch als gefährlich eingestuft und in MySQL 5.1.23 entfernt. Es sollte das Upgrade von Datenbanken vor 5.1 ermöglichen, um die in 5.1 implementierte Codierung für die Zuordnung von Datenbanknamen zu Datenbankverzeichnisnamen zu verwenden. Die Verwendung dieser Anweisung kann jedoch zum Verlust von Datenbankinhalten führen, weshalb sie entfernt wurde. Verwenden Sie RENAME DATABASE nicht in früheren Versionen, in denen es vorhanden ist.
Verwenden Sie stattdessen ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME, um die Aktualisierung der Datenbanknamen mit der neuen Codierung durchzuführen: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html
quelle
Ein einfacher Weg, dies zu tun, wenn Sie phpmyadmin installiert haben :
Gehen Sie zu Ihrer Datenbank, wählen Sie die Registerkarte "Operation", und Sie sehen den Block "Datenbank kopieren nach". Verwenden Sie es und Sie können die Datenbank kopieren.
quelle
Wie in Gregs Antwort erwähnt ,
mysqldump db_name | mysql new_db_name
ist dies die kostenlose, sichere und einfache Möglichkeit, Daten zwischen Datenbanken zu übertragen. Es ist jedoch auch sehr langsam .Wenn Sie Daten sichern möchten, es sich nicht leisten können, Daten (in dieser oder anderen Datenbanken) zu verlieren, oder andere Tabellen als verwenden
innodb
, sollten Sie diese verwendenmysqldump
.Wenn Sie nach etwas für die Entwicklung suchen, alle Ihre Datenbanken an anderer Stelle sichern lassen und das Löschen und Neuinstallieren
mysql
(möglicherweise manuell) problemlos durchführen möchten, wenn alles schief geht, habe ich möglicherweise nur die Lösung für Sie.Ich konnte keine gute Alternative finden, also habe ich ein Skript erstellt, um es selbst zu machen. Ich habe viel Zeit damit verbracht, dies zum ersten Mal zum Laufen zu bringen, und es macht mir ehrlich gesagt ein wenig Angst, jetzt Änderungen daran vorzunehmen. Innodb-Datenbanken sollten nicht so kopiert und eingefügt werden. Kleine Änderungen führen dazu, dass dies auf großartige Weise fehlschlägt. Ich hatte kein Problem, seit ich den Code fertiggestellt habe, aber das heißt nicht, dass Sie es nicht tun werden.
Systeme, auf denen getestet wurde (die jedoch möglicherweise immer noch ausfallen):
Was es macht
sudo
Berechtigungen ab und überprüft, ob Sie über genügend Speicherplatz verfügen, um die Datenbank zu klonenWie es mit vergleicht
mysqldump
In einer 3-GB-Datenbank würde die Verwendung von
mysqldump
undmysql
auf meinem Computer 40-50 Minuten dauern. Mit dieser Methode würde der gleiche Vorgang nur ~ 8 Minuten dauern.Wie wir es benutzen
Wir haben unsere SQL-Änderungen zusammen mit unserem Code gespeichert und der Upgrade-Prozess wird sowohl in der Produktion als auch in der Entwicklung automatisiert, wobei jede Reihe von Änderungen eine Sicherungskopie der Datenbank erstellt, um sie bei Fehlern wiederherzustellen. Ein Problem, auf das wir stießen, war, als wir an einem langfristigen Projekt mit Datenbankänderungen arbeiteten und die Zweige in der Mitte wechseln mussten, um einen oder drei Fehler zu beheben.
In der Vergangenheit haben wir eine einzige Datenbank für alle Zweige verwendet und mussten die Datenbank immer dann neu erstellen, wenn wir zu einem Zweig gewechselt sind, der nicht mit den neuen Datenbankänderungen kompatibel war. Und wenn wir zurückschalteten, mussten wir die Upgrades erneut ausführen.
Wir haben versucht
mysqldump
, die Datenbank für verschiedene Zweige zu duplizieren, aber die Wartezeit war zu lang (40-50 Minuten), und wir konnten in der Zwischenzeit nichts anderes tun.Diese Lösung verkürzte die Klonzeit der Datenbank auf 1/5 der Zeit (denken Sie an eine Kaffee- und Badezimmerpause anstelle eines langen Mittagessens).
Gemeinsame Aufgaben und ihre Zeit
Das Wechseln zwischen Zweigen mit inkompatiblen Datenbankänderungen dauert in einer einzelnen Datenbank mehr als 50 Minuten, jedoch nach der anfänglichen Einrichtungszeit mit
mysqldump
oder diesem Code überhaupt keine Zeit . Dieser Code ist zufällig ~ 5 mal schneller alsmysqldump
.Hier sind einige allgemeine Aufgaben und ungefähr, wie lange sie mit jeder Methode dauern würden:
Erstellen Sie einen Feature-Zweig mit Datenbankänderungen und führen Sie ihn sofort zusammen:
mysqldump
: 50-60 MinutenErstellen Sie einen Feature-Zweig mit Datenbankänderungen, wechseln Sie zu,
master
um einen Bugfix zu erhalten, bearbeiten Sie den Feature-Zweig und führen Sie Folgendes zusammen:mysqldump
: 50-60 MinutenErstellen Sie einen Feature-Zweig mit Datenbankänderungen, wechseln Sie
master
fünfmal zu einem Bugfix, während Sie den Feature-Zweig dazwischen bearbeiten, und führen Sie Folgendes zusammen:mysqldump
: 50-60 MinutenDer Code
Verwenden Sie dies nur, wenn Sie alles oben Gelesene gelesen und verstanden haben.
Wenn alles reibungslos verläuft, sollten Sie Folgendes sehen:
quelle
Neben Gregs Antwort ist dies der einfachste und schnellste Weg, wenn der
new_db_name
noch nicht existiert:quelle
Wenn Ihre ursprüngliche Datenbank Trigger enthält, können Sie den Fehler "Trigger existiert bereits" vermeiden, indem Sie vor dem Import einen Ersatz weiterleiten:
quelle
Ich glaube nicht, dass es dafür eine Methode gibt. Wenn PHPMyAdmin dies tut, wird die Datenbank ausgegeben und unter dem neuen Namen erneut eingefügt.
quelle