2009-05-01 10 views
23

Ist es möglich, eine Querserver Select Query mit MySQL Client zu schreiben. Grundsätzlich ist das Setup wie folgt.MySQL Cross Server Abfrage auswählen

Server IP           Datenbank
---------           --------
1.2.3.4          -Test
abcd           Test

Ich möchte eine Abfrage schreiben, die Zeilen aus einer Tabelle in der Test-Datenbank auf 1.2.3.4 auswählt und das Ergebnis in eine Tabelle in die Test-Datenbank auf abcd einfügt Meine Server sind Meilen voneinander entfernt, so werde ich eine öffnen SSH-Tunnel zur Verbindung der beiden.

Irgendwelche Zeiger?

Antwort

7

mysqldump könnte eine Lösung sein, wie bereits erwähnt, oder Sie könnten versuchen, die SELECT ... INTO OUTFILE und dann LOAD DATA INFILE ... Befehle verwenden.

MySQL hat die Federated Storage Engine, die für Sie nützlich sein könnte. Hier ist mehr Dokumentation darüber http://dev.mysql.com/doc/refman/5.0/en/federated-storage-engine.html Ich muss gestehen, dass ich keinen großen Erfolg damit hatte, aber es könnte für Sie arbeiten.

Die dritte Lösung wäre, die Arbeit in Ihrer Anwendung zu erledigen. Lesen Sie die Ergebnisse der SELECT Abfrage Zeile für Zeile und INSERT Zeile für Zeile zum anderen Server. Sie könnten jedoch einige Probleme mit Datentypen und der Handhabung von Nullen auf diese Weise bekommen.

2

Da der MySQL-Client nur auf einem Server zu einem Zeitpunkt eine Verbindung herstellen können, die kurze Antwort ist Nein. Aber es gibt immer einen Weg ...

Neuere Versionen von mysqldump Unterstützung ein --where Parameter, die verwendet werden können, Begrenzen Sie die Daten gedumpt. Das bedeutet, Sie haben eine Möglichkeit, eine einfache SELECT (d. H. Alle Spalten in einer Tabelle) auszuführen und gültige SQL zu INSERT es zu produzieren. Sie können dann die Ausgabe eines solchen Befehls mysqldump für den Quellserver an einen mysql-Befehl an den Zielserver übergeben.

Sie möchten wahrscheinlich ein paar Optionen wie --no-create-info und --no-add-locks auf dem mysqldump Befehl enthalten. Testen Sie es, bis die Ausgabe genau das ist, was Sie wollen.

+0

Wenn Sie überhaupt sind in In der Situation, in der der mysql-Client einen Join durchführt, sind Sie in Schwierigkeiten. Die richtige Lösung besteht darin, dass die Server miteinander kommunizieren und eine einzige Ergebnismenge generieren, die an den Client gesendet wird. MSSQL macht das möglich, indem es Ihnen ermöglicht, Server zu "verlinken" - und so zu konfigurieren, welche Anmeldeinformationen sie für die Verbindung usw. verwenden werden. Auf diese Server wird dann über einen Alias ​​zugegriffen. – Basic

+0

Ich brauchte ein wenig um zu lesen, um zu verstehen, worüber du geredet hast. Eine andere Antwort beschreibt, wie man das in MySQL macht, was wahrscheinlich eine allgemeinere Lösung ist als die, die ich gepostet habe. – staticsan

31

Wie wäre es mit föderierten Tabellen auf einem der Server? Erstellen Sie die föderierten Tabellen basierend auf den fernen Tabellen, die Sie in der Abfrage verwenden, und führen Sie die Abfrage so aus, als ob Ihre Datenbank vollständig lokal wäre. Beispiel unten von MySQL site

Die Prozedur für die Verwendung von FEDERATED-Tabellen ist sehr einfach. Normalerweise werden zwei Server ausgeführt, entweder auf demselben Host oder auf verschiedenen Hosts. (Es ist möglich, dass eine FEDERATED-Tabelle eine andere Tabelle verwendet, die von demselben Server verwaltet wird, auch wenn dies wenig sinnvoll ist.)

Zuerst müssen Sie eine Tabelle auf dem Remote-Server haben, auf den Sie zugreifen möchten durch Verwendung einer FEDERATED-Tabelle.Nehmen wir an, dass der Remote-Tabelle in der föderierten Datenbank und wird wie folgt definiert:

CREATE TABLE test_table (
    id  INT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL DEFAULT '', 
    other INT(20) NOT NULL DEFAULT '0', 
    PRIMARY KEY (id), 
    INDEX name (name), 
    INDEX other_key (other) 
) 
ENGINE=MyISAM 
CHARSET=latin1; 

Das Beispiel verwendet eine MyISAM-Tabelle, aber die Tabelle jede Speicher-Engine verwenden könnte.

nächste eine föderierte Tabelle auf dem lokalen Server erstellen für die Remote-Tabelle zugreifen:

CREATE TABLE federated_table (
    id  INT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL DEFAULT '', 
    other INT(20) NOT NULL DEFAULT '0', 
    PRIMARY KEY (id), 
    INDEX name (name), 
    INDEX other_key (other) 
) 
ENGINE=FEDERATED 
DEFAULT CHARSET=latin1 
CONNECTION='mysql://[email protected]_host:9306/federated/test_table'; 

(Vor MySQL 5.0.13, KOMMENTAR Verwendung statt CONNECTION.)

+0

In gewisser Weise ist dies die "richtige" Lösung, aber FEDERATED-Tabellen sind sehr langsam (fast alles wird naiv in einen vollständigen Tabellenscan konvertiert), daher sind sie möglicherweise keine Option, wenn Ihre Daten überhaupt groß sind. – Brilliand

+0

Federated behandeln den Index aus der Originaltabelle und Sie sollten diesen Index auf lokale auch respektieren, aber leider Abfragecache und schlechte Leistung bei massiven Einfügungen nicht verwenden –

Verwandte Themen