2012-07-27 12 views
5

Mi proyecto tiene su propia base de datos. Además, utilizo la tabla de usuarios, que está en otra base de datos. Dos oficinas tienen sus datos en el mismo servidor, pero el tercero tiene su propia tabla de usuarios en otro servidor.Necesito unir mesa de otra base de datos y, a veces, otro servidor

Así, en una gran cantidad de consultas que tienen que unirse, ya sea de mesa o some_db.users other_server.some_db.users

¿Qué solución le aconsejaría para este escenario?

Uso MySQL.

Respuesta

13

No es Federated tables en MySQL:

El motor de almacenamiento FEDERATED le permite acceder a los datos de una base de datos remota MySQL sin utilizar la replicación o la tecnología de clúster. Al consultar una tabla FEDERATED local , se extraen automáticamente los datos de las tablas (federadas) remotas. No se almacenan datos en las tablas locales.

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

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

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 
    PRIMARY KEY (id) 
) 
ENGINE=FEDERATED 
DEFAULT CHARSET=latin1 
CONNECTION='mysql://fed_user:[email protected]:3306/sakila/test_table'; 

cadenas de conexión de la muestra:

CONNECTION='mysql://username:[email protected]:port/database/tablename' 
CONNECTION='mysql://[email protected]/database/tablename' 
CONNECTION='mysql://username:[email protected]/database/tablename' 

la estructura básica de esta tabla debe coincidir con el de la tabla remota, excepto que la opción ENGINE debe estar federados.

ejecutar:

show variables like '%federated%'; 

para comprobar si el motor de almacenamiento FEDERATED está disponible en el servidor local.

La tabla federated_table en localhost se convierte en la tabla virtual de test_table en el servidor remoto.

Ahora puede usar el JOIN entre las tablas en una base de datos en el servidor localhost. Si hay una tabla llamada test en su servidor localhost, y que desea unirse con el anterior sakila.test_table que está en el servidor remoto, escribir una consulta como la que se muestra a continuación:

SELECT * FROM `federated_table` JOIN `test`; 

El federated_table en el la consulta se referirá realmente a test_table en el servidor remoto.


En permitiendo motor de almacenamiento FEDERATED

El motor de almacenamiento FEDERATED no está activado por defecto en el servidor que ejecuta; para habilitar FEDERATED, debe iniciar el binario del servidor MySQL usando la opción --federated.

NOTA:
motores de almacenamiento opcionales requieren privilegios y no se cargará cuando se especifica --skip-grant-tables.

El resultado de todo el PP no se cargará y el siguiente error aparecerá en los registros:

110318 21:37:23 [ERROR] /usr/local/libexec/mysqld: unknown option '--federated' 

Esto a su vez significa que una actualización de 5.x que hay que hacer en dos pasos si tener tablas federadas Una vez con --skip-grant-tables y sin --federated, la vez sin --skip-grant-tables y con --federated.

Fuente: The FEDERATED Storage Engine

+0

gracias, especialmente por el tutorial rápido. desafortunadamente, tengo problemas para hacerlo funcionar. mostrar variables como '% federated%'; devuelve el conjunto vacío. Encontré # Desactivar federado de forma predeterminada skip-federated en my.ini, he comentado la línea de omisión y reinicié los servicios, también agregué federado a la sección [mysqld] en este archivo y reinicié los servicios. –

+0

¿Qué versión de MySQL está usando? – Jacob

+0

no, está bien ... parece que está funcionando ahora, aunque el conjunto vacío regrese. gracias:) –

0

En MySQL, puede unirse a tablas de distintas bases de datos utilizando nombres completos como

`database_name1`. `table_name1` JOIN `database_name2`.`table_name2` 

Pero temo que no puedo unir tablas de diferentes servidores porque para eso se necesita tener dos conexiones diferentes y como según mi conocimiento, no hay nombres de conexión totalmente calificados para ser utilizados en la consulta.

O bien, puede crear tablas temporales locales en uno de los servidores y ejecutar la consulta allí. Pero en este caso necesitará transferir datos de un servidor a otro. Puede usar la herramienta de GUI de MySQL como SQLyog o administrador de MySQL, para transferir datos de un servidor a otro y sincronizar bases de datos en dos servidores.

creo que sirve ....

Cuestiones relacionadas