Después de leer su aclaración, tengo la impresión de que realmente desea consultar las tablas que residen en dos instancias separadas del servidor MySQL. Por lo menos, el texto aclaración:
foreign_db.login.username SELECT, nombre, apellido de foreign_db.login, donde el usuario
sugiere que desea ejecutar una consulta estando conectado como dos usuarios (que pueden residir o no en la misma instancia de servidor mysql).
En su pregunta, dijo que quería consultar datos de dos bases de datos diferentes, pero es importante darse cuenta de que una instancia de MySQL puede tener muchas, muchas bases de datos. Para las bases de datos múltiples administradas por la misma instancia mysql, la solución propuesta en la pregunta que enlazó simplemente funciona: simplemente prefija el nombre de la tabla con el nombre de las bases de datos, separando la base de datos y los nombres de la tabla con un punto: <db-name>.<table-name>
.
Pero, como he señalado, esto sólo funciona si:
- todas las bases de datos se accede en una consulta residen en el mismo servidor - es decir, son gestionados por la misma instancia de MySQL
- el usuario que está conectado a la base de datos tiene los privilegios correctos para acceder a ambas tablas.
Escenario 1: bases de datos en mismo host: otorgar privilegios appopriate y calificar los nombres de tabla
Así que si las tablas de hecho residen en la misma instancia de MySQL, no hay necesidad de una segunda entrada o la conexión - simplemente Otorgue al usuario de la base de datos que usa para conectarse a la base de datos los privilegios apropiados para seleccionar de todas las tablas que necesita. Usted puede hacer eso con la sintaxis GRANT
, documentado aquí: http://dev.mysql.com/doc/refman/5.1/en/grant.html
Por ejemplo, GRANT SELECT ON sakila.film TO 'test'@'%'
permitirá al usuario [email protected]%
para seleccionar datos de la tabla film
en la base de datos sakila
. Después de hacer eso, dicho usuario puede hacer referencia a esta tabla usando sakila.film
(el llamado nombre de tabla calificado), o si la base de datos actual se establece en sakila
, simplemente como film
Scenario2: bases de datos gestionadas por diferentes instancias de MySQL: FEDERADOS motor
Si las tablas a las que desea acceder son realmente administradas por dos instancias de MySQL diferentes, hay un truco que puede funcionar o no, según su configuración. Desde MySQL 5.0 mysql es compatible con el motor de almacenamiento FEDERATED
. Esto le permite crear una tabla que no es realmente una tabla, sino una mirilla a una tabla en un servidor remoto. Este motor está documentado aquí: http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html
Por ejemplo, si usted sabe que hay esta tabla en la base de datos misc
en el host remoto:
CREATE TABLE t (
id int not null primary key
, name varchar(10) not null unique
)
se puede hacer un 'puntero' local para que la tabla remota utilizando esto:
CREATE TABLE t (
id int not null primary key
, name varchar(10) not null unique
)
ENGINE = FEDERATED
CONNECTION='mysql://<user>@<remote-server>:<remote-port>/misc/t';
Desafortunadamente, el motor FEDERATED
no siempre está disponible, así que hay que comprobar primero si se puede usar eso. Pero supongamos que es así, entonces simplemente puede usar la tabla local t en sus consultas, al igual que cualquier otra tabla, y MySQL se comunicará con el servidor remoto y realizará las operaciones apropiadas en la tabla física en el otro lado.
Advertencia: hay varios problemas de optimización con las tablas FEDERATED. Debe averiguar si y en qué medida se aplican a usted. Por ejemplo, aplicar un WHERE
a una tabla federada puede en muchos casos dar como resultado que todo el contenido de la tabla se transfiera por el cable a su servidor local, donde se aplicará el filtro real.Otro problema es con la creación de tablas: debe estar muy seguro de que las definiciones de la tabla federada y la tabla que señala coinciden exactamente, a excepción de la cláusula ENGINE (y CONEXIÓN). Si tiene, por ejemplo, un juego de caracteres diferente, los datos pueden llegar a distorsionarse por completo después de viajar por el cable.
Si desea utilizar las tablas FEDERATED
, lea este artículo http://oreilly.com/pub/a/databases/2006/08/10/mysql-federated-tables.html para decidir si es adecuado para su caso de uso particular.
Si usted considera que lo necesite, tengo una utilidad para crear tablas federadas aquí: http://forge.mysql.com/tools/tool.php?id=54
Scenario3: no se puede utilizar FEDERADOS, pero las tablas en diferentes instancias de MySQL
Por último, si tienes tablas en diferentes instancias de MySQL, pero por alguna razón no puedo usar el motor de tablas federado, me temo que no tengo suerte. Simplemente va a tener que ejecutar consultas en ambas instancias de MySQL, recibir los resultados y hacer algo inteligente con ella en PHP. dependiendo de sus requisitos exactos, esta puede ser una solución perfectamente viable
Supongo que debe decidir por sí mismo qué parte de mi respuesta se ajusta mejor a su problema y agregar un comentario en caso de que necesite más ayuda. TIA Roland.
Después de algunas pruebas, por cualquier razón, mi configuración no me permite hacer el número (2). Siempre necesito usar mysql_select_db. Algo que sí funciona es usar mysql_select_db para cambiar entre dbs, pero esto no me permite hacer consultas cross db. Estoy pensando en algo como select * from main_db.login, customerInfo donde ... etc. – Avery
(2) es la respuesta correcta. Mi servidor PHP hace cientos de consultas por minuto con parte de los datos de una segunda base de datos especificada por nombre. Entonces la pregunta es menos "¿Cómo hago esto?" y más "¿Por qué no funciona?" – grahamparks
Después de una intensa búsqueda, lo hice funcionar como crees que debería: SELECCIONAR DE * foreigndb.login DONDE ... No estoy seguro de quién recibe la recompensa ... Tal vez puedo deponer esta pregunta ... y luego lanzar algunos puntos de reputación en el contenedor de caridad. – Avery