MySQL-Kreuz-Server Wählen Sie Abfrage
-
03-07-2019 - |
Frage
Ist es möglich, eine Quer Server Auswahlabfrage mit MySQL-Client zu schreiben. Grundsätzlich ist die Einrichtung ist wie folgt.
Server-IP-Datenbank
--------- --------
1.2.3.4 Test-
a.b.c.d Test
Ich möchte eine Abfrage schreiben, die Zeilen aus einer Tabelle in der Testdatenbank auf 1.2.3.4 und setzen Sie das Ergebnis in einer Tabelle in der Testdatenbank auf a.b.c.d
wählen wird
Meine Server befinden sich Meilen voneinander entfernt, damit ich einen SSH-Tunnel eröffnet, die beiden zu verbinden.
Alle Zeiger?
Lösung
mysqldump
eine Lösung sein könnte, wie bereits erwähnt, oder Sie könnten versuchen, die SELECT ... INTO OUTFILE
und anschließend LOAD DATA INFILE ...
Befehle.
MySQL hat die föderierte Speicher-Engine haben die Ihnen nützlich sein könnten. Hier einige weitere Dokumentation es http: //dev.mysql .com / doc / refman / 5.0 / de / Federated-storage-engine.html ich bekenne müssen, dass ich nicht großen Erfolg damit gehabt haben, aber es könnte für Sie arbeiten.
Die dritte Lösung wäre es, die Arbeit in der Anwendung zu tun. Lesen Sie in den Ergebnissen der SELECT
Abfrage Zeile für Zeile und INSERT
auf die anderen Server Zeile für Zeile. Sie könnten in einigen Fragen mit Datentypen und null laufen, obwohl auf diese Weise behandeln.
Andere Tipps
Wie wäre es mit föderierten Tabellen auf einem der Server? Erstellen Sie die föderierte Tabellen basierend auf den Remote-Tabellen, die Sie in der Abfrage verwenden und führen Sie einfach Ihre Frage, als ob Ihre Datenbank alle lokalen war. Beispiel unten von MySQL-Website
Das Verfahren für die Tabellen FEDERATED ist sehr einfach. Normalerweise haben Sie zwei Server ausgeführt wird, entweder beide auf dem gleichen Host oder auf verschiedenen Rechnern. (Es ist möglich, eine föderierte Tabelle eine andere Tabelle zu verwenden, die von demselben Server verwaltet wird, obwohl es wenig Sinn, so zu tun.)
Zunächst müssen Sie eine Tabelle auf dem Remote-Server haben, die Sie mit einer föderierten Tabelle zugreifen möchten. 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 jeden Speicher-Engine verwenden könnte.
Als Nächstes erstellen Sie eine föderierte Tabelle auf dem lokalen Server 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://fed_user@remote_host:9306/federated/test_table';
(Vor MySQL 5.0.13, Verwendung KOMMENTAR statt CONNECTION.)
Da der MySQL-Client nur auf einem Server zu einem Zeitpunkt eine Verbindung herstellen können, ist die kurze Antwort Nein, aber es gibt immer einen Weg ...
Neuere Versionen von mysqldump
unterstützen --where
Parameter, die verwendet werden können, um die Daten abgeladen zu begrenzen. Das heißt, Sie haben eine Möglichkeit, eine einfache SELECT
laufen (das heißt alle Spalten auf einer Tabelle) und zum Erzeugen gültigen SQL es INSERT
. Anschließend können Sie die Ausgabe des solchen mysqldump
Befehl für den Quellserver zu einem mysql
Befehl an den Zielserver.
Sie wollen wahrscheinlich ein paar Optionen wie --no-create-info
und --no-add-locks
auf dem mysqldump
Befehl aufzunehmen. Testen Sie es, bis der Ausgang ist genau das, was Sie wollen.