27 septiembre 2012

Otra instancia MySQL en el mismo servidor

Se nos ha planteado un interesante ejercicio: poner en marcha una segunda instancia del gestor MySQL instalado en una máquina concreta. No es una segunda instalación, es aprovechar lo ya instalado pero con dos servidores de bases de datos.

Tener dos instancias tiene toda la justificación que nuestras necesidades precisen. Podría ser que una se dedicara a desarrollo, para hacer las modificaciones y pruebas necesarias antes de trasvasar todo el trabajo al otro, al de producción, digamos "el de verdad". También serviría para tener una copia de respaldo. O simplemente por tener dos espacios diferenciados tanto en bases de datos como usuarios, una medida de seguridad adicional.

Sea como fuere, mostramos aquí el procedimiento para hacerlo, o uno de ellos. Lo cierto es que parece laborioso pero no es nada complicado. Tan solo necesitamos saber dónde están las cosas. Eso sí, la cantidad de cosas que pueden variar de un ordenador a otro, versiones, configuraciones, elecciones en la instalación, etc. hace que todo esto tenga más de una posibilidad de ser incompleto.


Supongamos que MySQL está instalado en una determinada ruta de un sistema de archivos. En windows sería típico algo parecido a C:\Archivos de programa\MySQL\. A partir de ahora, será ruta/MySQL/ y todos contentos, hasta los de linux (en Windows 7 también funcionan esas barras). 

En primer lugar, debemos tomar una decisión, si queremos una instancia "limpia", vacía de contenido salvo el catálogo del sistema y los usuarios mínimos 'root'@'localhost' entre ellos. También podríamos copiar la carpeta de datos de MySQL con todo lo que tenga, si va a ser una copia o si podemos aprovechar algo. Nos decantamos por el primer deseo.

Todo lo que viene a continuación es al 90% multiplataforma. No obstante, asumimos de ahora en adelante que trabajamos en Windows, por cuestiones de cercanía del que escribe.


0. Descargar la versión comprimida de la instalación.

Si no la tenemos, en http://dev.mysql.com/downloads/mysql/ descargamos la edición Community Server. Nos hacemos con la versión que sea la apropiada para nosotros, preferentemente los comprimidos sin instalador.

Supongamos que el comprimido se llama mysql-vvv.zip. La verdad es que solo nos interesa, una vez hayamos descomprimido, la carpeta mysql-vvv/data/.


1. Copiar y pegar en ruta/MySQL/

Con cuidado, eso sí, lo normal es que ya exista ruta/MySQL/data y NO queremos machacar lo que ya teníamos. Por eso, por el método que sea, ese pegado de mysql-vvv/data/ debe hacerse de forma que, al final, obtengamos una carpeta adicional y veamos algo así como

ruta/
  MySQL/
    bin/
    data/
    data2/
    include/
    ...


2. Copiar y pegar la configuración de MySQL

Es decir, del fichero ruta/MySQL/my.ini (en linux my.cnf) generamos una copia que podría llamarse ruta/MySQL/my2.ini.


3. Configurar la nueva instancia de MySQL

Evidentemente, podemos tocar todo lo que queramos o necesitemos pero lo mínimo es el puerto de comunicaciones y la ruta de los datos.

Buscamos, en ruta/MySQL/my2.ini las secciones [client] y [mysqld] y modificamos o añadimos lo siguiente:

[client]
port=3307

[mysqld]
port=3307
datadir="ruta/MySQL/data2/"

En cuanto al puerto, el que queramos; puesto que el puerto habitual de MySQL es el 3306, parece natural elegir el siguiente, 3307. En cuanto a la ruta de datos, recuerda que "ruta" es para este artículo tu ruta en tu disco duro.

Que no se te olvide guardar el fichero antes de continuar.

Aquí, el manual de MySQL avisa de que hay que hacer más cambios, pero muchos de ellos tiene que ver con qué se está utilizando o no en cada instalación, por ejemplo windows o linux, sockets, named pipes... Digamos que esto es lo mínimo, y si no te funciona tendrás que descubrir dónde está el fallo.


4. Poner en marcha la (o las) instancias.

Aquí ya entramos en el terreno de las manías, permítaseme la licencia, sobre todo si trabajas en Windows. Puedes optar por instalarlo como servicio o generar un script, bat, enlace directo o lo que quieras para arrancar. O hacerlo sin más.

Antes de nada, necesitarás un terminal de Windows (en Windows 7 es cmd.exe). Eso lo consigues en el menú "Inicio", en el cuadro de texto de abajo del todo, "buscar programas y archivos". Pero es que tienes que "ejecutar como administrador" (botón derecho sobre el programa que se muestra), si no, no vale.




4.a Como servicio de windows

Lo primero, registrar el servicio. Para ello, la siguiente instrucción, aunque, cuidado, si no tienes definidas las rutas en la variable del sistema PATH, tendrás que llegar hasta la carpeta de ejecutables de MySQL, que es ruta/MySQL/bin/. Lo hacemos así:

cd ruta/MySQL/bin/
mysqld --install MySQL2 --defaults-file="ruta/MySQL/my2.ini"

Como nos hemos movido en el sistema de archivos, ../my2.ini es igual ruta/MySQL/my2.ini.

Con esto conseguimos que MySQL2 nos aparezca como servicio disponible en nuestro administrador del equipo. Allí podemos decidir si queremos que arranque en el inicio del sistema o si queremos un arranque manual. En todo caso, en ese mismo administrador podemos arrancarlo o ejecutando, en un terminal:

net start MySQL2

Recuerda que para pararlo tienes las mismas opciones, siendo la orden en el terminal

net stop MySQL2

Por cierto, si lo que quieres es todo lo contrario, desinstalar el servicio, se puede hacer con mysqld --remove MySQL2.


4.b Con mysqld

Si no optamos por el servicio windows, y teniendo un terminal del sistema operativo donde ejecutar la orden (dependerá de qué permisos necesitemos y tengamos) podemos arrancar como toda la vida se ha hecho:

mysqld --defaults-file="../my2.ini"

Como hemos cambiado de sitio dentro del disco duro, por eso el valor de "defaults-file". Lo molesto de este proceder es que MySQL arranca en segundo plano y el terminal se queda bloqueado y no da ninguna información. Es más, podemos cerrar el terminal que MySQL no se detendrá. 

La instancia ya está en marcha, lo que necesitamos ahora es un cliente que nos permita trabajar en ella. Siguiendo con la línea de comandos, abrimos otro terminal nuevo:

mysql -u root  --port=3307

Y dentro. Como la nueva instancia está totalmente limpia, incluso el usuario 'root'@'localhost' todavía no tiene contraseña. Sí, es tu casa. Pero da igual, ponle contraseña, no seas vago.

Si queremos parar la instancia de MySQL, lo sano es ejecutar

mysqladmin -u root shutdown

Con esto termina el artículo. Obviamente, podemos repetir el proceso hasta el infinito y tener millones de instancias. Pero no abusemos, para qué tanto...

Referencias


3 comentarios:

  1. Muy buena explicacion. Tengo las siguientes inquietudes: Puedo crear varias instancias para hacer una replicacion de varios MAESTROS A UN ESCLAVO? Es decir, en una maquina donde esta instalado MySQL (ESCLAVO) quiero que se repliquen varias BD que estan en servidores diferentes.
    Es correcto, como tu explicas, en el archivo .ini modificar el puerto en la parte de[client]. Pregunto esto ultimo porque en el sitio de MySQL solo cambia la parte de [mysqld]. Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Bien, hay quien dice que (1 esclavo, n maestros) no se puede

      http://miguelangelnieto.net/?action=view&url=arquitectura-maestro-esclavo-en-mysql

      Pero también quien parece haberlo conseguido con algo de ingenio

      http://forums.mysql.com/read.php?71,281324,281324#msg-281324

      En cuanto a lo del puerto... es de lo más confuso. Si atendemos a lo que pone el manual, los clientes solo leen la sección [client] y mysqld solo la suya [mysqld], pero después viene el propio my.ini y en el comentario dice que [client] solo vale para clientes "fetén" de MySQL...

      En mi caso he ido un poco sin pensar y donde ponía 3306 lo cambiaba, sin más. Lo cierto es que esa sección [client], por lo que he podido experimentar, en cuanto al puerto de conexión por TCP/IP es inútil, MySQL Workbench, HeidiSQL o phpMyAdmin no lo usan.

      He estado buscando más información sobre esa sección y, la verdad, no he encontrado ningún sitio que diga exactamente para qué vale definir un puerto en [client]. Seguramente me hace falta buscar y leer más.

      Eliminar
  2. Que buen articulo me salvaste estuve investigando por todos lados y ningún tutorial me funcionó.

    Como este articulo fue escrito hace algunos años quisiera hacer algunas anotaciones que tal vez les funcionen a los que quieren crear nuevas instancias en un MySQL de una versión mas reciente:
    Yo estuve usando MySQL Server 8.0 y la dirección en la que se encontraba la carpeta de Data es en : C:\ProgramData\MySQL\MySQL Server 8.0\ y aquí están la carpeta Data y el archivo my.ini, la carpeta ProgramData es una carpeta oculta por lo cual eberemos de mostrar las carpetas ocultas

    ResponderEliminar

Los comentarios son revisados antes de su publicación en prevención de usos incorrectos (spam o alusiones insultantes a terceros). Por eso, tu comentario puede tardar un poco, no mucho, en ser visible.