Trabajar con diferentes instancias MySQL
El artículo de hoy es cien por cien para técnicos de sistemas, trata sobre la manera de trabajar con diferentes instancias MySQL en un mismo servidor, concretamente, sobre una distribución GNU Linux.
Sobre las instancias MySQL
En muchos casos, podemos tener apuros económicos y no disponer de la suficiente infraestructura para tener cada motor de base de datos en servidores dedicados, por lo que, si somos un proveedor de servicios en Internet, tendremos cada motor de base de datos separado por instancias, que cada una de ellas corresponderá a un cliente. También nos puede servir para crear un entorno de test en un mismo servidor escuchando por un puerto diferente al de producción.
Hay que tener en cuenta eso sí, que aunque tiene muchas ventajas, además de las expuesta en el párrafo anterior, como la posibilidad de configurarlas de manera totalmente independiente, tiene también desventajas, por ejemplo, el uso de recursos se multiplica ya que cada una de ellas corre en un proceso diferente del sistema, además se tenemos que aplicar parches de seguridad o actualizaciones, las debemos hacer una por una.
La mejor manera de decir es hacer o al menos eso pienso yo, por lo que veamos su funcionamiento.
Laboratorio de pruebas
Para las pruebas voy a utilizar un servidor VPS en la llamada nube, con Debian Jessie, me conectaré a él vía ssh.
Antes de nada vamos a instalar el motor de base de datos.
apt update
apt install mysql-server
Vamos a crear dos instancias más, además de la principal, debemos crear una carpeta para los datos y otra para los logs, por cada instancia:
mkdir /var/lib/mysql2
mkdir /var/lib/mysql3
chown -R mysql:mysql /var/lib/mysql2/
chown -R mysql:mysql /var/lib/mysql3/
mkdir /var/log/mysql2
mkdir /var/log/mysql3
chown -R mysql:mysql /var/log/mysql2
chown -R mysql:mysql /var/log/mysql3
Los ficheros de configuración están ubicados en /etc/mysql, vamos a crear dos más:
mkdir /etc/mysql2
mkdir /etc/mysql3
Copiamos el fichero principal de configuración my.cnf, en ambas carpetas, para a posteriori modificarlo:
cp -p /etc/mysql/my.cnf /etc/mysql2/
cp -p /etc/mysql/my.cnf /etc/mysql3/
Ahora en cada uno de los ficheros copiados, debemos modificar varios aspectos, para que pueda todo funcionar correctamente, cada una de ellas escuchará por un puerto diferente, esto es, 3306, 3307 y 3308. También se modificará el socket, el pidfile, y los directorios data y log.
mysql_install_db --datadir=/var/lib/mysql2
mysql_install_db --datadir=/var/lib/mysql3
Para muestra un botón:
Iniciar e instalar la instancia
Si leemos los mensajes de la imagen, nos recuerda que el usuario ‘root‘ de la instancia no tiene contraseña y que podemos utilizar el guión mysql_secure_installation, para crearla y asegurar el servidor.
La configuración de la instancia para el artículo es la siguiente, para cada fichero:
Muestra fichero my.cnf por instancia
Para arrancar cada instancia de manera manual:
/usr/bin/mysqld_safe --defaults-file=/etc/mysql2/my.cnf &
/usr/bin/mysqld_safe --defaults-file=/etc/mysql3/my.cnf &
Para comprobar que efectivamente las instancias están funcionando, nos podemos conectar a ellas de dos maneras:
#Mediante el socket
mysql -S /var/run/mysqld/mysqld2.sock
#o
mysql -h 127.0.0.1 -P 3307
Por último y no menos importante, para que nos arranque cada instancia de manera automática al iniciar el servidor, debemos copiar el fichero /etc/init.d/mysql, y crear los necesarios según las instancias creadas, adaptándolos a cada configuración.
Con esto ya la tendríamos listo.
Espero que os haya parecido interesante. Nos leemos en la próxima ^.^
Os dejo una serie de enlaces sobre el tema con varios ejemplos de configuración:
No soy para nada un técnico, pero la claridad conque expones los artículos hace que sean fáciles de entender. Se agradece este tipo de artículos, no soy muy dado a las bases de datos pero aquí veo una buena oportunidad de aprender algo más.
Saludos.
Gracias, esa es la intención. Un saludo
Yo para tener varias versiones de mysql suelo usar mysql-sandbox que nos permite incluso tener varias versiones de mysql instaladas, incluso una MariaDB por ahí y todas corriendo a la vez. Está muy chulo también.
Hola Gaspar! Pues me ha picado le curiosidad y le echaré un vistazo, saludos!
Interesante post… Una pregunta.
A parte de mysql, ¿se pueden crear instancias de otros programas?
¿Cómo por ejemplo Teamspeak3?
Hace unos meses he querido crear varios servidores de Teamspeak 3 cambiando los puertos, pero solo me funcionaba 1.
Entiendo que sí, pero de momento yo sólo conozco de MySQL
Un saludo
Hey David,
Sólo para darte las gracias por el post. Aunque yo utilizaba mysql-sandbox para esto en modo usuario, en el trabajo he necesitado meter hasta 4 servidores MySQL siguiendo tu guía, ya sabes que siempre le doy un toque personal y eso, pero has sido de grandísima ayuda !!
Genial Gaspar, me alegra mucho que te haya sido de ayuda 🙂
Gracias por la información. Ha sido de mucha utilidad.
Hola Miguel,
Me alegro que te haya sido util.
Saludos
Hola, tengo el siguiente error sabrás pro que sale o que me falta
root@raloy:/etc/mysql2# mysql_install_db –datadir=/var/lib/mysql3
2020-05-11 10:47:49 [WARNING] mysql_install_db is deprecated. Please consider switching to mysqld –initialize
2020-05-11 10:47:49 [ERROR] Can’t locate the server executable (mysqld).
Hola Javier,
Tienes mysql instalado? O encendido?
Ten en cuenta que esta entrada tiene cuatro años, quizás algunas cosas hayan cambiado. Has probado con la recomendación de «mysqld -initialize» ?
Saludos