5.11. Ejecutar más de un servidor MySQL en la misma máquina

MySQL 5.0

5.11. Ejecutar más de un servidor MySQL en la misma máquina

En algunos casos, podría querer ejecutar múltiples servidores mysqld en la misma máquina. Quizá quiera probar una nueva versión de MySQL dejando la configuración de producción sin cambios. O quizá quiera dar acceso para diferentes usuarios a diferentes servidores mysqld que ellos mismos puedan administrar. (Por ejemplo, podría ser un proeedor de servicios de Internet que proporcione instalaciones de MySQL independientes para cada cliente.)

Para ejecutar múltiples servidores en una única máquina, cada servidor tiene que tener valores únicos para los diferentes parámetros de operación. Estos se pueden establecer en la línea de comandos o en archivos de opciones. Consulte Sección 4.3, “Especificar opciones de programa”.

Al menos las siguientes opciones deben ser diferentes para cada servidor:

  • controla el número de puerto de las conexiones TCP/IP.

  • controla la ruta del archivo socket de Unix y el nombre de la named pipe en Windows. En Windows, es necesario especificar diferentes nombres de pipe solo para los servidores que soporten conexiones mediante named pipe.

  • Esta opción, actualmente, se utiliza sólo en Windows. Designa el nombre de memoria compartida utilizado por un servidor Windows para permitir a los clientes conectarse mediante memoria compartida.

  • Esta opción se utiliza únicamente en Unix. Indica el nombre del archivo en el que el servidor escribe su ID de proceso.

Si utiliza las siguientes opciones de archivo de registro, deben ser diferentes para cada servidor:

Las opciones de archivo de registro se explican en Sección 5.10.5, “Mantenimiento de ficheros de registro (log)”.

Para un mejor rendimiento, puede especificar las siguientes opciones a cada servidor, de manera que se distribuya la carga entre discos físicos:

Tener diferentes directorios temporales también es una buena práctica, para hacer más fácil determinar qué servidor MySQL creó cualquier archivo temporal.

Generalmente, cada servidor debería utilizar un directorio de datos diferente, lo que se especifica con la opción .

Atención: Normalmente no debería tener dos servidores que actualicen los datos de la misma base de datos. Esto podría llevar a obtener sorpresas indeseadas si su sistema operativo no tiene soporte para bloqueos sin posibilidad de fallo. Si (a pesar de este aviso) ejecuta múltiples servidores que utilicen el mismo directorio de datos y tienen el registro activado, debería utilizar las opciones adecuadas para especificar nombres de archivos de registro que sean únicos para cada servidor. De otra manera, lo servidores intentan registrar en los mismos archivos. Por favor, tengan cuenta que este tipo de configuración sólo funciona con tablas y , y no con ningún otro de los motores de almacenamiento.

Este aviso en contra de compartir un directorio de datos entre servidores también se aplica en entornos NFS. Permitir que múltiples servidores MySQL accedan a un directorio común es una muy mala idea.

  • El principal problema es que NFS es un cuello de botella de velocidad. No está diseñado para un uso tal.

  • Otro riesgo con NFS es que tiene que encontrar una manera de asegurarse que dos o más servidores no se interfieran unos con otros. Usualmente, el bloqueo de archivos de NFS está gestionado por el demonio , pero de momento no hay ninguna plataforma que realice bloqueos 100% seguros en todas las situaciones.

Facilítese las cosas: Olvídese de compartir un directorio de datos entre servidores sobre NFS. Una solución mejor es tener una máquina que tenga diferentes CPUs y utilizar un sistema operativo que gestione los hilos de ejecución eficientemente.

Si tiene múltiples instalaciones de MySQL en diferentes lugares, normalmente puede especificar el directorio base de instalación para cada uno con la opción , de manera que cada servidor utilice un directorio de datos, archivo de registro, y archivo de PID diferentes. (Los valores por defecto de todos ellos son determinados en relación al directorio base). En ese caso, las únicas opciones adicionales que necesita especificar son las opciones y . Por ejemplo, suponga que debe instalar diferentes versiones de MySQL utilizando distribuciones binarias en archivos . Se instalan en diferentes lugares, así que puede iniciar el servidor de cada instalación utilizando el comando bin/mysqld_safe bajo su correspondiente directorio base. ¡mysqld_safe determina la opción apropiada para pasarle a mysqld, y usted sólo necesita especificar las opciones y a mysqld_safe.

Tal como se explica en las siguientes secciones, es posible iniciar servidores adicionales mediante el establecimiento de sus variables de entorno, o especificando opciones de línea de comandos apropiadas. Aún así, si necesita ejecutar servidores múltiples de manera permanente, es más conveniente utilizar archivos de opciones para especificar a cada servidor las opciones que deben ser únicas para él.

5.11.1. Ejecutar varios servidores en Windows

Puede ejecutar varios servidores en Windows iniciándolos manualmente desde la línea de comandos, cada uno con sus parámetros apropiados. En sistemas basados en Windows NT, tiene la opción de instalar varios servidores como servicios Windows y ejectuarlos de ese modo. Las instrucciones generales para ejecutar servidores MySQL desde la línea de comandos o como servicios se dan en Sección 2.3, “Instalar MySQL en Windows”.Esta sección describe cómo asegurarse que cada servidor arranca con distintos valores en las opciones de arranque que deban ser únicas para cada servidor, tales como el directorio de datos. Estas opciones se describen en Sección 5.11, “Ejecutar más de un servidor MySQL en la misma máquina”.

5.11.1.1. Arrancar múltiples servidor Windows desde la raya de comando

Para arrancar manualmente múltiples servidores desde la línea de comandos, puede especificar las opciones apropiadas en la línea de comandos o en un fichero de opciones. Es más conveniente especificar las opciones en un fichero, pero es necesario asegurarse que cada servidor obtiene su propio conjunto de opciones. Para ello, cree un fichero de opciones para cada servidor y arranque el servidor con la opción cuando lo ejecute.

Suponga que desea ejectuar mysqld en el puerto 3307 con el directorio de datos en , y mysqld-max en el puerto 3308 con un directorio de datos en . (Para ello, asegúrese antes de copiar la base de datos que contiene las tablas de permisos.)

A continuación cree dos ficheros de opciones. Por ejemplo, cree un fichero llamado que tenga este contenido:

[mysqld]
datadir = C:/mydata1
port = 3307

Cree un segundo fichero llamado con este contenido:

[mysqld]
datadir = C:/mydata2
port = 3308

A continuación, arranque cada servidor con su fichero de opciones:

C:\> C:\mysql\bin\mysqld --defaults-file=C:\my-opts1.cnf
C:\> C:\mysql\bin\mysqld-max --defaults-file=C:\my-opts2.cnf

En NT, cada servidor arranca en primer plano (no aparece un nuevo prompt hasta que acaba el servidor); necesitará ejectura estos dos comandos en una consola separada.

Para parar los servidores, debe conectarse al puerto apropiado:

C:\> C:\mysql\bin\mysqladmin --port=3307 shutdown
C:\> C:\mysql\bin\mysqladmin --port=3308 shutdown

Los servidores configurados tal y como se ha descrito permiten a los clientes la conexión mediante TPC/IP. Si su versión de Windows soporta named pipes y quiere permitir este tipo de conexiones, use los servidores mysqld-nt o mysqld-max-nt y especifique opiones que permitan la named pipe y especifique su nombre. Cada servidor que soporte conexiones mediante named pipes debe usear un nombre único. Por ejemplo, el fichero puede escribirse así:

[mysqld]
datadir = C:/mydata1
port = 3307
enable-named-pipe
socket = mypipe1

A continuación, arranque el servidor así:

C:\> C:\mysql\bin\mysqld-nt --defaults-file=C:\my-opts1.cnf

Modique similarmente para que lo use el segundo servidor.

5.11.1.2. arrancar varios servidores Windows como servicios

En sistemas basados en NT, un servidor MySQL puede correr como un servicio de Windows. Los procedimientos para instalar, controlar, y eliminar un servico MySQL se describen en Sección 2.3.12, “Arrancar MySQL como un servicio de Windows”.

También puede instalar múltiples servidores MySQL como servicios. En este caso, debe asegurarse que cada servidor usa un nombre de servicio distinto además de todos los otros parámetros que deben ser únicos para cada servidor.

Para las siguientes instrucciones, se asume que desea ejectuar el servidor mysqld-nt a partir de dos versiones diferentes de MySQL que estén instaladas en y , respectivamente. (Este podría ser el caso si está ejecutando 4.1.8 como servidor de producción, pero quiere realizar tests usando 5.0.7.)

Los siguientes principios se aplican al instalar un servicio MySQL con las opciones o :

  • Si no especifica un nombre para el servicio, el servidor usa el nombre de servicio por defecto de y el servidor lee las opciones del grupo en el fichero estándard de opciones.

  • Si especifica un nombre de servicio tras la opción , el servidor ignora el grupo de opciones y lee las opciones del grupo que tenga el mismo nombre que el servicio. El servidor lee opciones del fichero estándard de opciones.

  • Si especifica la opción tras el nombre del servicio, el servidor ignoral el fichero estándard de opciones y lee opciones sólo del grupo del fichero especificado.

Nota: Antes de MySQL 4.0.17, sólo un servidor instalado usando el nombre de servicio por defecto () o instalado explícitamente con el nombre de servicio de mysqld lee el grupo en el fichero de opciones estándard. Como en 4.0.17, todos los servidores leen el grupo si leen el fichero de opciones estándard, incluso si están instalados usando otro nombre de servicio. Esto permite usar el grupo para opciones que deben usarse por todos los servicios MySQL, y un grupo de opciones nombrado tras cada servicio para uso del servidor instalado con ese nombre de servicio.

Basándonos en la información precedente, hay varias formas de inicializar múltiples servicios. Las siguientes instrucciones describen algunos ejemplos. Antes de probar cualquiera de ellos, asegúrese que apaga y elimina cualquier servicio MySQL antes de nada.

  • Aproximación 1: Espeficique las opciones para todos los servicios en uno de los ficheros de opciones estándard. Para ello, use un nombre de servicio distinto para cada servidor. Suponga que quiere ejecutar mysqld-nt 4.1.8 usando el nombre de servicio de y mysqld-nt 5.0.7 usando el nombre de servicio . En ese caso, puede usar el grupo para 4.1.8 y el grupo para 5.0.7. Por ejemplo, puede rellenar así:

    # options for mysqld1 service
    [mysqld1]
    basedir = C:/mysql-4.1.8
    port = 3307
    enable-named-pipe
    socket = mypipe1
    
    # options for mysqld2 service
    [mysqld2]
    basedir = C:/mysql-5.0.7
    port = 3308
    enable-named-pipe
    socket = mypipe2
    

    Instale los servicios como se describe a continuación, usando las rutas completas de los servidores para asegurarse que Windows registra el programa ejecutable correcto para cada servicio:

    C:\> C:\mysql-4.1.8\bin\mysqld-nt --install mysqld1
    C:\> C:\mysql-5.0.7\bin\mysqld-nt --install mysqld2
    

    Para arrancar los servicios, use el administrador de servicios, o use NET START con los nombres de servicio apropiados:

    C:\> NET START mysqld1
    C:\> NET START mysqld2
    

    Para parar los servicios, use el administrador de servicios, o use NET STOP con el nombre de servicio apropiado:

    C:\> NET STOP mysqld1
    C:\> NET STOP mysqld2
    
  • Aproximación 2: Especifique opciones para cada servidor en ficheros separados y use cuando instale los servicios para decirle a cada servidor que fichero usar. En ese caso, cada fichero debe listar las opciones en el grupo .

    Con esta aproximación, para especificar opciones para mysqld-nt 4.1.8, cree un fichero como se muestra a continuación:

    [mysqld]
    basedir = C:/mysql-4.1.8
    port = 3307
    enable-named-pipe
    socket = mypipe1
    

    Para mysqld-nt 5.0.7 , cree un fichero como se muestra a continuación:

    [mysqld]
    basedir = C:/mysql-5.0.7
    port = 3308
    enable-named-pipe
    socket = mypipe2
    

    Instale los servicios como se muestra (introduzca cada comando en una línea distinta):

    C:\> C:\mysql-4.1.8\bin\mysqld-nt --install mysqld1
               --defaults-file=C:\my-opts1.cnf
    C:\> C:\mysql-5.0.7\bin\mysqld-nt --install mysqld2
               --defaults-file=C:\my-opts2.cnf
    

    Para usar la opción cuando instale un servidor MySQL como servicio, debe preceder la opción con el nombre de servicio.

    Tras instalar los servicios, arranque y párelos igual que en el ejemplo precedente.

Para eliminar múltiples servicios, use mysqld --remove para cada uno, especificando un nombre de servicio con la opción a continuación. Si el nombre de servicio es el nombre por defecto (), puede omitirlo.

5.11.2. Ejecutar varios servidores en Unix

La forma más sencilla de ejecutar múltiples servidores en Unix es compilarlos con diferentes puertos TCP/IP y ficheros socket Unix de forma que cada uno esté escuchando en distintas interfícies de red. Además, al compilarlos en distintos directorios base para cada instalación, automáticamente se configuran distintos directorios de datos, fichero de log, y localización del fichero PID para cada uno de los servidores.

Tenga en cuenta que un servidor 4.1.8 existente está configurado para el puerto TCP/IP por defecto (3306) y fichero socket Unix (). Para configurar un nuevo servidor 5.0.7 con parámetros distintos, use un comando configure parecido a este:

shell> ./configure --with-tcp-port= \
             --with-unix-socket-path= \
             --prefix=/usr/local/mysql-5.0.7

Aquí, y deben ser distintos del puerto TPC/IP por defecto y de la ruta del fichero socket Unix, y el valor debe especificar un fichero de instalación distinto del que hay donde MySQL se ha instalado por defecto.

Si tiene un servidor MySQL escuchando en un puerto dado, puede usar el siguiente comando para encontrar que parámetros está usando para algunas importantes variables de configuración, incluyendo el directorio base y el nombre del fichero socket Unix:

shell> mysqladmin --host= --port= variables

Con la información mostrada por este comando, puede decir los valores de las opciones que no debe usar para configurar un servidor adicional.

Tenga en cuenta que si especifica como nombre de equipo, el comportamiento por defecto de mysqladmin es usar una conexión mediante un fichero socket Unix en lugar de TCP/IP. A partir de MySQL 4.1 , puede especificar explícitamente el protocolo de conexión a usar usando la opción .

No tiene que compilar un nuevo servidor MySQL para arrancar con un fichero socket Unix distinto o con otro puerto TCP/IP. También es posible especificar estos valores en tiempo de ejecución. Una forma de hacerlo es usando opciones por líneas de comandos:

shell> mysqld_safe --socket= --port=

Para arrancar un segundo servidor, proporcione distintas opciones para y option , e incluya la opción para mysqld_safe de forma que el servidor use un directorio de datos distinto.

Otra forma de conseguir un efecto similar es usar variables de entorno para inicializar el nombre de fichero socket Unix y el puerto TCP/IP:

shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> mysql_install_db --user=mysql
shell> mysqld_safe --datadir=/path/to/datadir &

Hay una forma rápida de arrancar un segundo servidor para hacer pruebas. Lo bueno de este método es que los cambios en las variables de entorno se aplican a cualquier programa cliente que invoque desde la misma consola. Así, las conexiones de dichos clientes se redireccionan automáticamente al segundo servidor!

Apéndice E, Variables de entorno incluye una lista de otras variables de entorno que puede usar para afectar a mysqld.

Para ejecución automática del servidor, el script de arranque que se ejecuta al arrancar debe ejecutar el siguiente comando una vez para cada servidor con la ruta apropiada del fichero de opciones para cada comando:

mysqld_safe --defaults-file=path

Cada fichero de opciones debe contener valores específicos para un servidor dado.

En Unix, el script mysqld_multi es otra forma de arrancar múltiples servidores. Consulte Sección 5.1.5, “El programa mysqld_multi para gestionar múltiples servidores MySQL”.

5.11.3. Utilización de programas cliente en un entorno de múltiples servidores

Cuando quiera conectar con un programa cliente a un servidor MySQL que está escuchando en una interfície de red distinta de la compilada en su cliente, puede usar los siguientes métodos:

  • Arranque el cliente con --port= para conectar via TCP/IP a un servidor remoto, con para conectar via TCP/IP a un servidor local, o con para conectar a un servidor local via fichero socket Unix o una named pipe de Windows.

  • Como en MySQL 4.1, arranque el cliente con para conectar via TCP/IP, para conectar via fichero socket Unix , para conectar via named pipe, o para conectar via memoria compartida. Para conexiones TCP/IP, puede necesitar especificar las opciones y . Para los otros tipos de conexión, puede necesitar especificar la opción para especificar un fichero socket Unix o nombre de named pipe, o la opción para especificar el nombre de la memoria compartida. Las conexiones de memoria compartida se soportan sólo en Windows.

  • En Unix, inicialice las variables de entorno y para que apunten al fichero socket Unix y al puerto TCP/IP antes de arrancar los clientes. Si normalmente usa un fichero socket o puerto específico, puede preparar comandos para inicializar estas variables de entorno en su fichero para que se apliquen cada vez que entre. Consulte Apéndice E, Variables de entorno.

  • Especifique el fichero socket Unix y el puerto TCP/IP por defecto en el grupo de un fichero de opciones. Por ejemplo, puede usar en Windows, o el fichero en su directorio "home" en Unix. Consulte Sección 4.3.2, “Usar ficheros de opciones”.

  • En un programa C, puede especificar los argumentos para el fichero socket o puerto en la llamada . PUede tener las opciones leídas por el programa llamando a . Consulte Sección 24.3.3, “Descripción de funciones de la API C”.

  • Si usa el módulo de Perl , puede leer las opciones de los ficheros de opciones MySQL. Por ejemplo:

    $dsn = "DBI:mysql:test;mysql_read_default_group=client;"
            . "mysql_read_default_file=/usr/local/mysql/data/my.cnf";
    $dbh = DBI->connect($dsn, $user, $password);
    

    Consulte Sección 24.5, “La API Perl de MySQL”.

    Otras interfícies de programación pueden proporcionar funcionalidad similar para leer ficheros de opciones.