2009-05-01 17 views
23

E 'possibile scrivere una query di selezione tra server utilizzando MySQL Client. Fondamentalmente la configurazione è come segue.MySQL Cross Server Select Query

IP Server           Database
---------           --------
1.2.3.4           prova
abcd           Test

Voglio scrivere una query che selezionerà le righe da una tabella nel database di test in 1.2.3.4 e inserirò il risultato in una tabella nel database di test su abcd
I miei server si trovano a miglia di distanza quindi aprirò un Tunnel SSH per collegare i due.

Eventuali suggerimenti?

risposta

7

mysqldump potrebbe essere una soluzione come già detto o si potrebbe provare a utilizzare i comandi SELECT ... INTO OUTFILE e quindi LOAD DATA INFILE ....

MySQL dispone del motore di archiviazione federato che potrebbe essere utile. Ecco un po 'più di documentazione su di esso http://dev.mysql.com/doc/refman/5.0/en/federated-storage-engine.html Devo confessare che non ho avuto un enorme successo con esso, ma potrebbe funzionare per voi.

La terza soluzione sarebbe quella di eseguire il lavoro nella vostra applicazione. Leggere i risultati della query SELECT riga per riga e INSERT sull'altro server riga per riga. Tuttavia, potresti incorrere in alcuni problemi con i tipi di dati e la gestione nulla in questo modo.

2

Poiché il client mysql può connettersi solo a un server alla volta, la risposta breve è no, ma c'è sempre un modo ...

versioni più recenti di mysqldump supporto un parametro --where che può essere utilizzato per limitare i dati scaricati. Ciò significa che hai un modo di eseguire un semplice SELECT (cioè tutte le colonne su una tabella) e produrre un codice SQL valido a INSERT. È quindi possibile reindirizzare l'output di tale comando mysqldump per il server di origine a un comando mysql sul server di destinazione.

Probabilmente si desidera includere alcune opzioni come --no-create-info e --no-add-locks sul comando mysqldump. Provalo fino a quando l'output è esattamente quello che vuoi.

+0

Se sei sempre in la situazione in cui il client mysql sta eseguendo un join, sei nei guai: la soluzione corretta è che i server comunichino tra loro e generino un singolo set di risultati da inviare al client. MSSQL fa questo consentendo di "collegare" i server - e quindi configurare quali credenziali useranno per la connessione, ecc ... Questi server sono quindi accessibili tramite un alias. – Basic

+0

Mi ci è voluto un po 'di lettura per capire di cosa stavi parlando. Un'altra risposta descrive come farlo in MySQL, che è probabilmente una soluzione più generica di quella che ho postato. – staticsan

31

come utilizzare le tabelle federate su uno dei server? crea le tabelle federate in base alle tabelle remote che utilizzerai nella query ed esegui semplicemente la tua query come se il tuo database fosse tutto locale. esempio di seguito da MySQL site

La procedura per l'utilizzo di tabelle FEDERATED è molto semplice. Normalmente, hai due server in esecuzione, entrambi sullo stesso host o su host diversi. (È possibile che una tabella FEDERATED utilizzi un'altra tabella gestita dallo stesso server, sebbene abbia poco senso.)

Innanzitutto, è necessario disporre di una tabella sul server remoto a cui si desidera accedere usando una tabella FEDERATA.Supponiamo che la tabella remota è nel database federato ed è definito così:

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; 

L'esempio utilizza una tabella MyISAM, ma la tabella potrebbe utilizzare qualsiasi motore di archiviazione.

successivo, creare una tabella FEDERATED sul server locale per l'accesso alla tabella remota:

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'; 

(Prima MySQL 5.0.13, l'uso COMMENTO piuttosto che COLLEGAMENTO.)

+0

In un certo senso questa è la soluzione "corretta", ma le tabelle FEDERATE sono molto lente (quasi tutto è ingenuamente convertito in una scansione completa della tabella), quindi potrebbero non essere un'opzione se i tuoi dati sono abbastanza grandi. – Brilliand

+0

federate gestiscono l'indice dalla tabella di origine e dovresti rispettare tale indice anche su locale, ma purtroppo non utilizzare la cache di query e prestazioni scadenti con inserimenti massicci –