2010-07-14 15 views
21

Ich möchte das mit einem Code tun und nicht mit einem Tool wie "MySQL Migration Toolkit". Der einfachste Weg, den ich kenne, besteht darin, eine Verbindung (unter Verwendung von MySQL-Konnektoren) zu DB1 zu öffnen und seine Daten zu lesen. Öffnen Sie die Verbindung zu DB2 und schreiben Sie die Daten dorthin. Gibt es einen besseren/einfachsten Weg?Wie kann ich Daten zwischen 2 MySQL-Datenbanken übertragen?

+1

zwei Datenbanken auf demselben Server oder zwei Datenbanken auf verschiedenen Servern? –

+0

@Itay: Ich bin mir noch nicht sicher, ob sie auf dem gleichen Server sind oder nicht? Ich weiß, dass dies einen Unterschied macht, aber ich kam nicht auf die Idee, sie zu fragen.Ich werde morgen tun. – Morano88

Antwort

20

Zuerst kann ich Dich nicht in der Lage zu übernehmen werde einfach kopieren das data/-Verzeichnis, denn wenn Sie dann Ihren vorhandenen Snapshot/Backup/Restore verwenden, wird es wahrscheinlich ausreichen (und Ihre Backup/Restore-Prozeduren testen).

In diesem Fall, wenn die beiden Tabellen die gleiche Struktur haben, ist der schnellste und ironisch einfachste Weg, SELECT ... INTO OUTFILE ... an einem Ende und LOAD DATA INFILE ... on zu verwenden das andere.

Ausführliche Informationen finden Sie unter http://dev.mysql.com/doc/refman/5.1/en/load-data.html und .../select.html.

Für triviale Tabellen folgendes funktioniert:

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

Wir haben auch FIFOs zum großen Effekt verwendet, um den Overhead tatsächlich das Schreiben auf die Festplatte zu vermeiden, oder wenn wir aus irgendeinem Grund auf die Festplatte schreiben müssen, um es durch gzip zu leiten.

dh.

mkfifo /tmp/myfifo 
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz & 
... SEL 

ECT... INTO OUTFILE '/tmp/myfifo' ..... 
wait 

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo & 
... LOAD DATA INFILE /tmp/myfifo ..... 
wait 

Grundsätzlich ein lenken Sie die Tabellendaten zu einem FIFO Sie es komprimieren können, munge es, oder Tunnel es über ein Netzwerk nach Herzenslust.

+0

Danke, obwohl es in der dev.mysql-Handbuch ist, aber es funktioniert nicht proberly. Es gibt mir diesen Fehler: Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, für die richtige Syntax in der Nähe von '\ n' 'in Zeile 1) Es akzeptiert nicht' \ n '.. warum? – Morano88

+0

Stack Overflow hat die Beispielabfrage beschädigt. In der Quelle wurde der Schrägstrich in der ESCAPED BY-Klausel mit Escapezeichen versehen, aber das Escapezeichen wurde bei der Konvertierung in HTML verloren. Tut mir leid, dass ich die Korruption nicht bemerkt habe - ich habe es oben behoben. – Recurse

+0

Dies ist genau das, was ich brauche, um die Sicherung einer recht großen Datenbank zu beschleunigen, aber ich kann Ihr Beispiel nicht zum Laufen bringen. Ich kann den FIFO erstellen, und wenn ich mit mysqldump auf die Pipe dumpe, funktioniert es gut. Wenn ich jedoch versuche, über SELECT ... INTO OUTFILE in die Pipe zu gelangen, bekomme ich den Fehler, dass "myfifo bereits existiert". –

11

Die FEDERATED Speicher-Engine? Es ist nicht der schnellste im ganzen Haufen, aber für eine einmalige, zufällige oder kleine Datenmenge. Nehmen wir an, Sie sprechen von 2 Servern. Mit 2 Datenbanken auf ein und demselben Server wird es einfach sein:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename; 
+0

Vielen Dank, ich bin mir noch nicht sicher, ob die 2 Datenbanken auf dem gleichen Server sind oder nicht. – Morano88

+0

Das war fantastisch für meine Situation. Prost :) – Nick

+0

Arbeitete großartig mit Amazon RDS, wo Sie keinen Zugriff auf die zugrunde liegende Maschine haben, auf der die MySQL-Instanz ausgeführt wird, was Lösungen mit INFILE/OUTFILE ausschließt. – Andz

1

Sie mysqldump und mysql (die Kommandozeilen-Client) verwenden können. Dies sind Kommandozeilen-Tools und in der Frage, die Sie schreiben, möchten Sie sie nicht verwenden, aber sie trotzdem zu benutzen (selbst wenn Sie sie aus Ihrem Code heraus ausführen) ist der einfachste Weg; mysqldump löst viele Probleme.

Sie können select s von einer Datenbank und insert zum anderen machen, was ziemlich einfach ist. Aber wenn Sie auch das Datenbankschema (create table s usw.) übertragen müssen, wird es etwas komplizierter, weshalb ich mysqldump empfehle. Aber viele PHP-MySQL-Admin-Tools tun dies auch, also können Sie sie benutzen oder ihren Code ansehen.

Oder vielleicht können Sie MySQL-Replikation verwenden.

+0

Funktioniert das (Auswählen, Einfügen), wenn sich die beiden Datenbanken auf 2 verschiedenen Servern befinden? Nein Ich möchte nur Daten migrieren, nicht Tabellenkreationen .. etc. – Morano88

+0

Ja, Sie haben tvo Verbindungen - für jeden Server eine - in einer Verbindung führen Sie SELECT, dann in der anderen INSERT mit den Daten, die von diesem SELECT zurückgegeben . – Messa

0

Wenn Sie Binärlogging auf Ihrem aktuellen Server (und haben alle sind Protokolle) aktivieren Sie Setup-Replikation für den zweiten Server

Verwandte Themen