14.6. El motor de almacenamiento FEDERATED

MySQL 5.0

14.6. El motor de almacenamiento FEDERATED

El motor 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 , consulte el directorio de una distribución fuente de MySQL 5.0.3 o posterior.

14.6.1. Instalación del motor de almacenamiento FEDERATED

Para activar este motor, use la opción con configure al compilar MySQL.

14.6.2. Descripción del motor de almacenamiento FEDERATED

Cuando crea una tabla , 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 . 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 llamada , el handler crea un fichero de datos llamado . 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 no hay ficheros de datos locales para una tabla (por ejemplo, no hay fichero ). 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 . Para leer el resultado, los registros se tratan uno a uno usando la función de la API C y luego se convierten desde las columnas del conjunto de resultados al formato que el handler espera.

El flujo básico es el siguiente:

  1. Llamadas SQL efectuadas localmente

  2. API del handler MySQL (datos en formato del handler )

  3. API del cliente MySQL (datos convertidos a llamadas SQL )

  4. Base de datos remota -> API del cliente MySQL

  5. Convierte el conjunto de resultados al formato del handler

  6. API del handler -> registros resultado o conteo de registros afectados a local

14.6.3. Cómo usar las tablas FEDERATED

El procedimiento para usar tablas 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 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 . Suponga que la tabla remota está en la base de datos 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 puede nombrar cualquier motor de almacenamiento; la tabla no tiene porqué ser .

A continuación, cree una tabla 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 debe ser y la opción de tabla es una cadena de conexión que indica al motor cómo conectar al servidor remoto.

El motor crea sólo el fichero en la base de datos .

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 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 es la siguiente:

://[:]@[:]//

Sólo se soporta como 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 para especificar la cadena de conexión no es óptima y posiblemente cambiará en MySQL 5.1. Téngalo en cuenta al usar tablas , 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 o para la tabla , o consultar la tabla en la base de datos .

14.6.4. Limitaciones del motor de almacenamiento FEDERATED

Lo que el motor soporta y lo que no:

  • En la primera versión, el servidor remoto debe ser un servidor MySQL. El soporte de para otros motores de bases de datos se añadirá en el futuro.

  • La tabla remota a la que apunta una tabla debe existir antes de intentar acceder a ella.

  • Es posible para una tabla apuntar a otra, pero debe tener cuidado de no crear un bucle.

  • No hay soporte para transacciones.

  • No hay forma que el motor 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 soporta , , , , e índices. No soporta , , o cualquier otro comando Data Definition Language . La implementación actual no usa comandos preparados.

  • La implementación usa , , , y , pero no .

  • Las tablas no funcionan con la caché de consultas.

Algunas de estas limitaciones pueden mejorarse en futuras versiones del handler .