2009-05-01 21 views
23

Es posible escribir una consulta de selección de servidor cruzado utilizando MySQL Client. Básicamente, la configuración es la siguiente.MySQL Cross Server Seleccionar consulta

IP del servidor           base de datos
---------           --------
1.2.3.4           prueba
ABCD           Prueba

Quiero escribir una consulta que seleccionará las filas de una tabla en la Base de datos de prueba en 1.2.3.4 e insertar el resultado en una tabla en la Base de datos de prueba en abcd
Mis servidores se encuentran a millas de distancia, así que abriré Túnel SSH para conectar los dos.

¿Alguna sugerencia?

Respuesta

7

mysqldump podría ser una solución como se menciona anteriormente o podría intentar usar los comandos SELECT ... INTO OUTFILE y luego LOAD DATA INFILE ....

MySQL tiene el motor de almacenamiento federado que puede serle útil. Aquí hay algo más de documentación. http://dev.mysql.com/doc/refman/5.0/en/federated-storage-engine.html Tengo que confesar que no he tenido mucho éxito, pero podría funcionar para ti.

La tercera solución sería hacer el trabajo en su aplicación. Lea en los resultados de la consulta SELECT línea por línea y INSERT en el otro servidor línea por línea. Sin embargo, es posible que tenga algunos problemas con los tipos de datos y el manejo nulo.

2

Dado que el cliente mysql sólo puede conectarse a un servidor a la vez, la respuesta corta es No, pero siempre hay una manera ...

Las versiones recientes de apoyo mysqldump un parámetro --where que se pueden utilizar para limitar los datos volcados. Esto significa que tiene una forma de ejecutar un simple SELECT (es decir, todas las columnas en una tabla) y producir SQL válido en INSERT. A continuación, puede canalizar la salida de dicho comando mysqldump para el servidor de origen a un comando mysql al servidor de destino. Es posible que desee incluir algunas opciones como --no-create-info y --no-add-locks en el comando mysqldump. Pruébelo hasta que el resultado sea exactamente lo que quiere.

+0

Si alguna vez en la situación en la que el cliente de mysql realiza una unión, tiene problemas: la solución correcta es que los servidores se comuniquen entre sí y generen un solo conjunto de resultados para enviar al cliente. MSSQL hace esto permitiéndole "enlazar" servidores, y así configurar qué credenciales usarán para la conexión, etc ... A estos servidores se accede a través de un alias. – Basic

+0

Me tomó un poco de tiempo leer para entender de lo que estabas hablando. Otra respuesta describe cómo hacerlo en MySQL, que probablemente sea una solución más genérica que la que publiqué. – staticsan

31

¿qué hay de usar tablas federadas en uno de los servidores? crea las tablas federadas basadas en las tablas remotas que usarás en la consulta y simplemente ejecuta tu consulta como si tu base de datos fuera local. ejemplo debajo de MySQL site

El procedimiento para usar tablas FEDERATED es muy simple. Normalmente, tiene dos servidores en ejecución, ya sea en el mismo host o en diferentes hosts. (Es posible que una tabla FEDERATED use otra tabla administrada por el mismo servidor, aunque no tiene mucho sentido hacerlo).

Primero, debe tener una tabla en el servidor remoto al que desea acceder usando una tabla FEDERADA.Supongamos que la tabla remota está en la base de datos federada y se define así:

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; 

El ejemplo utiliza una tabla MyISAM, pero la mesa podría utilizar cualquier motor de almacenamiento.

A continuación, cree una tabla FEDERATED en el servidor local para acceder a la tabla 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'; 

(Antes de MySQL 5.0.13, el uso COMENTARIO lugar de CONEXIÓN.)

+0

En cierto modo, esta es la solución "adecuada", pero las tablas FEDERATED son muy lentas (casi todo se convierte ingenuamente en una exploración de tabla completa), por lo que pueden no ser una opción si sus datos son en general. – Brilliand

+0

federate maneja el índice de la tabla de origen y también debe respetar ese índice en local, pero lamentablemente no use la caché de consultas y el bajo rendimiento en inserciones masivas –