El motor FEDERATED
está disponible desde MySQL
5.0.3. Es un motor que accede a datos en tablas de bases de datos
remotas en lugar de tablas locales.
Para examinar la fuente para el motor
FEDERATED
, consulte el directorio
sql
de una distribución fuente de MySQL
5.0.3 o posterior.
Para activar este motor, use la opción
--with-federated-storage-engine
con
configure al compilar MySQL.
Cuando crea una tabla FEDERATED
, el servidor
crea un fichero de definición de tabla en el directorio de base
de datos. El fichero comienza con el nombre de tabla y tiene
extensión .frm
. No se crean más
ficheros, ya que los datos reales están en la base de datos
remota. Esto difiere de cómo funcionan los motores con tablas
locales.
Para tablas de bases de datos locales, los ficheros de datos son
locales. Por ejemplo, si crea una tabla
MyISAM
llamada users
, el
handler MyISAM
crea un fichero de datos
llamado users.MYD
. Un handler para tablas
locales lee, inserta, borra y actualiza datos en ficheros de
datos locales, y los registros se guardan en un formato
particular del handler. Para leer registros, el handler debe
parsear los datos en columnas. Para escribir registros, los
valores de la columna deben convertirse al formato de registro
usado por el handler y escribirse en el fichero de datos local.
Con el motor MySQL FEDERATED
no hay ficheros
de datos locales para una tabla (por ejemplo, no hay fichero
.MYD
). En su lugar, una base de datos
remota almacena los datos que normalmente estarían en la tabla.
Esto necesita el uso de la API del cliente MySQL para leer,
borrar, actualizar e insertar datos. La recuperación de datos
se inicia via un comando SELECT * FROM
tbl_name
. Para leer el
resultado, los registros se tratan uno a uno usando la función
de la API C mysql_fetch_row()
y luego se
convierten desde las columnas del conjunto de resultados
SELECT
al formato que el handler
FEDERATED
espera.
El flujo básico es el siguiente:
-
Llamadas SQL efectuadas localmente
-
API del handler MySQL (datos en formato del handler )
-
API del cliente MySQL (datos convertidos a llamadas SQL )
-
Base de datos remota -> API del cliente MySQL
-
Convierte el conjunto de resultados al formato del handler
-
API del handler -> registros resultado o conteo de registros afectados a local
El procedimiento para usar tablas FEDERATED
es muy simple. Normalmente, tiene dos servidores en ejecución,
en la misma máquina o en distintas. (También es posible para
una tabla FEDERATED
usar otra tabla
administrada por el mismo servidor, aunque no tiene mucho
sentido.)
Primero, tiene que tener una tabla en el servidor remoto que
quiera acceder con la tabla FEDERATED
.
Suponga que la tabla remota está en la base de datos
federated
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), KEY name (name), KEY other_key (other) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
La opción de tabla ENGINE
puede nombrar
cualquier motor de almacenamiento; la tabla no tiene porqué ser
MyISAM
.
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), KEY name (name), KEY other_key (other) ) ENGINE=FEDERATED DEFAULT CHARSET=latin1 COMMENT='mysql://root@remote_host:9306/federated/test_table';
La estructura de esta tabla debe ser exactamente la misma que la
de la tabla remota, excepto que la opción de tabla
ENGINE
debe ser FEDERATED
y la opción de tabla COMMENT
es una cadena
de conexión que indica al motor FEDERATED
cómo conectar al servidor remoto.
El motor FEDERATED
crea sólo el fichero
test_table.frm
en la base de datos
federated
.
La información del equipo remoto indica el servidor remoto al
que se conecta el servidor local, y la información de base de
datos y tabla indica la tabla remota a usar como fichero de
datos. En este ejemplo, el servidor remoto está indicado para
ser remote_host
corriendo en el puerto 9306,
así que puede arrancar ese servidor para que escuche en el
puerto 9306.
La forma general de la cadena de conexión en la opción
COMMENT
es la siguiente:
scheme
://user_name
[:password
]@host_name
[:port_num
]/db_name
/tbl_name
Sólo se soporta mysql
como
scheme
en este punto; la contraseña
y el número de puerto son opcionales.
Aquí hay algunas cadenas de conexión de ejemplo:
COMMENT='mysql://username:password@hostname:port/database/tablename' COMMENT='mysql://username@hostname/database/tablename' COMMENT='mysql://username:password@hostname/database/tablename'
El uso de COMMENT
para especificar la cadena
de conexión no es óptima y posiblemente cambiará en MySQL
5.1. Téngalo en cuenta al usar tablas
FEDERATED
, ya que significa que habrá que
hacer modificaciones cuando ocurra.
Como cualquier contraseña usada se almacena en la cadena de
conexión como texto plano, puede ser leído por cualquier
usuario que pueda usar SHOW CREATE TABLE
o
SHOW TABLE STATUS
para la tabla
FEDERATED
, o consultar la tabla
TABLES
en la base de datos
INFORMATION_SCHEMA
.
Lo que el motor FEDERATED
soporta y lo que
no:
-
En la primera versión, el servidor remoto debe ser un servidor MySQL. El soporte de
FEDERATED
para otros motores de bases de datos se añadirá en el futuro. -
La tabla remota a la que apunta una tabla
FEDERATED
debe existir antes de intentar acceder a ella. -
Es posible para una tabla
FEDERATED
apuntar a otra, pero debe tener cuidado de no crear un bucle. -
No hay soporte para transacciones.
-
No hay forma que el motor
FEDERATED
sepa si la tabla remota ha cambiado. La razión es que la tabla debe funcionar como un fichero de datos que nunca se escribirá para hacer algo distinto a la base de datos. La integridad de los datos en la tabla local debe comprobarse si hay algún cambio en la base de datos remota. -
El motor
FEDERATED
soportaSELECT
,INSERT
,UPDATE
,DELETE
, e índices. No soportaALTER TABLE
,DROP TABLE
, o cualquier otro comando Data Definition Language . La implementación actual no usa comandos preparados. -
La implementación usa
SELECT
,INSERT
,UPDATE
, yDELETE
, pero noHANDLER
. -
Las tablas
FEDERATED
no funcionan con la caché de consultas.
Algunas de estas limitaciones pueden mejorarse en futuras
versiones del handler FEDERATED
.