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:
-
--port=
port_num
--port
controla el número de puerto de las conexiones TCP/IP. -
--socket=
path
--socket
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. -
--shared-memory-base-name=
name
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.
-
--pid-file=
path
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:
-
--log=
path
-
--log-bin=
path
-
--log-update=
path
-
--log-error=
path
-
--bdb-logdir=
path
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:
-
--tmpdir=
path
-
--bdb-tmpdir=
path
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
--datadir=path
.
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
MyISAM
y MERGE
, 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
lockd
, 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 --basedir=path
, 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 --socket
y
--port
. Por ejemplo, suponga que debe instalar
diferentes versiones de MySQL utilizando distribuciones binarias
en archivos tar
. 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 --basedir
apropiada para
pasarle a mysqld, y usted sólo necesita
especificar las opciones --socket
y
--port
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.
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”.
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
--defaults-file
cuando lo ejecute.
Suponga que desea ejectuar mysqld en el
puerto 3307 con el directorio de datos en
C:\mydata1
, y
mysqld-max en el puerto 3308 con un
directorio de datos en C:\mydata2
. (Para
ello, asegúrese antes de copiar la base de datos
mysql
que contiene las tablas de permisos.)
A continuación cree dos ficheros de opciones. Por ejemplo,
cree un fichero llamado C:\my-opts1.cnf
que tenga este contenido:
[mysqld] datadir = C:/mydata1 port = 3307
Cree un segundo fichero llamado
C:\my-opts2.cnf
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
C:\my-opts1.cnf
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 C:\my-opts2.cnf
similarmente para
que lo use el segundo servidor.
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
C:\mysql-4.1.8
y
C:\mysql-5.0.7
, 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 --install
o
--install-manual
:
-
Si no especifica un nombre para el servicio, el servidor usa el nombre de servicio por defecto de
MySQL
y el servidor lee las opciones del grupo[mysqld]
en el fichero estándard de opciones. -
Si especifica un nombre de servicio tras la opción
--install
, el servidor ignora el grupo de opciones[mysqld]
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
--defaults-file
tras el nombre del servicio, el servidor ignoral el fichero estándard de opciones y lee opciones sólo del grupo[mysqld]
del fichero especificado.
Nota: Antes de MySQL 4.0.17,
sólo un servidor instalado usando el nombre de servicio por
defecto (MySQL
) o instalado explícitamente
con el nombre de servicio de mysqld lee el
grupo [mysqld]
en el fichero de opciones
estándard. Como en 4.0.17, todos los servidores leen el grupo
[mysqld]
si leen el fichero de opciones
estándard, incluso si están instalados usando otro nombre de
servicio. Esto permite usar el grupo
[mysqld]
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
mysqld1
y mysqld-nt 5.0.7 usando el nombre de serviciomysqld2
. En ese caso, puede usar el grupo[mysqld1]
para 4.1.8 y el grupo[mysqld2]
para 5.0.7. Por ejemplo, puede rellenarC:\my.cnf
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
--defaults-file
cuando instale los servicios para decirle a cada servidor que fichero usar. En ese caso, cada fichero debe listar las opciones en el grupo[mysqld]
.Con esta aproximación, para especificar opciones para mysqld-nt 4.1.8, cree un fichero
C:\my-opts1.cnf
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
C:\my-opts2.cnf
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
--defaults-file
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 --remove
a
continuación. Si el nombre de servicio es el nombre por
defecto (MySQL
), puede omitirlo.
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 (/tmp/mysql.sock
). Para
configurar un nuevo servidor 5.0.7 con parámetros distintos,
use un comando configure parecido a este:
shell> ./configure --with-tcp-port=port_number
\ --with-unix-socket-path=file_name
\ --prefix=/usr/local/mysql-5.0.7
Aquí, port_number
y
file_name
deben ser distintos del
puerto TPC/IP por defecto y de la ruta del fichero socket Unix,
y el valor --prefix
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=host_name
--port=port_number
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 localhost
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 --protocol={TCP | SOCKET | PIPE
| MEMORY}
.
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=file_name
--port=port_number
Para arrancar un segundo servidor, proporcione distintas
opciones para --socket
y
--port
option , e incluya la opción
--datadir=
path
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”.
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
--host=
host_name
--port=port_number
para conectar via TCP/IP a un servidor remoto, con--host=127.0.0.1 --port=port_number
para conectar via TCP/IP a un servidor local, o con--host=localhost --socket=
file_name
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
--protocol=tcp
para conectar via TCP/IP,--protocol=socket
para conectar via fichero socket Unix ,--protocol=pipe
para conectar via named pipe, o--protocol=memory
para conectar via memoria compartida. Para conexiones TCP/IP, puede necesitar especificar las opciones--host
y--port
. Para los otros tipos de conexión, puede necesitar especificar la opción--socket
para especificar un fichero socket Unix o nombre de named pipe, o la opción--shared-memory-base-name
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
MYSQL_UNIX_PORT
yMYSQL_TCP_PORT
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.login
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
[client]
de un fichero de opciones. Por ejemplo, puede usarC:\my.cnf
en Windows, o el fichero.my.cnf
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
mysql_real_connect()
. PUede tener las opciones leídas por el programa llamando amysql_options()
. Consulte Sección 24.3.3, “Descripción de funciones de la API C”. -
Si usa el módulo de Perl
DBD::mysql
, 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.