post icon

Configurar varias instancias de MySQL en un mismo equipo

Para tener varias instancias independientes del motor de base de datos MySQL debemos hacer un par de configuraciones manuales, ¿Qué significa este concepto? Que podemos tener en la misma instalación, o mismo terminal, más de un motor, escuchando en distintos puertos (uno por cada instancia), teniendo la posibilidad de configurar de manera totalmente independiente y distinta cada una.

No debemos abusar del uso de las instancias, porque por cada una se corre un proceso que consume recursos y no se comparten entre ellos, sólo es recomendable si es estrictamente necesario, o si queremos ahorrar costos para no gastar en varios servidores dedicados..

También tenemos que tener en cuenta que cuando queremos aplicar parches de seguridad, actualizaciones, los debemos aplicar por cada instancia, así que esto debe ser bien pensado antes de implementarlo. Comencemos..

Observacion: el simbolo ??? significa que ustedes pueden colocar allí el nombre que deseen.

Paso 1

El primer paso es tener instalado de manera normal el motor (cosa que doy por hecho que lo saben hacer), el segundo paso es bajar el servicio de este modo:

1
/etc/init.d/mysql stop

Paso 2

Para este paso necesitamos “quebrar” la estructura de ficheros que se tiene por defecto, normalmente ésta es la que se tiene:

/var/lib/mysql/

Donde debería quedar algo así, siendo los numeros secuenciales que yo pongo, cambiales por cualquier otro texto o nomenclatura.

Directorio de Datos: /var/lib/mysql/???
Para el tmpdir: /var/lib/mysql/tmp/???

/var
 |
  lib--+
          |
          mysql--+
                 |
                 +--001--+
                 |       |
                 |       +--mysql
                 |
                 +--002--+
                 |       |
                 |       +--mysql
                 .
                 .
                 +--tmp--+
                         |
                         +--001
                         +--002
                         .
                         .

Paso 3

Copiamos todo el directorio /var/lib/mysql/mysql a cada directorio /var/lib/mysql/???

Paso 4

En caso que existan estos ficheros, procedemos a su borrado:

1
2
3
4
5
rm /var/lib/mysql/mysql
rm /var/lib/mysql/ib_logfilex
rm /var/lib/mysql/ibdata1
rm /var/lib/mysql/mysql_u~de_info
rm /var/lib/mysql/mysql-bin.index

Paso 5

Reasignar dueño de los ficheros y sus permisos correspondientes, el usuario mysql debe tener el poder completo sobre ellos.

1
2
3
chown -R mysql.mysql /var/lib/mysql
 
chmod 700 /var/lib/mysql/{???,???,???...,???}

Paso 6

Nos queda editar manualmente el archivo de configuración de MySQL

1
2
vim /etc/mysql/my.cnf   (en Ubuntu)
vim /etc/my.cnf   (en openSuSE)

En ésta sección agregamos esto:

1
2
3
4
5
[mysqld_multi]
mysqladmin = /usr/bin/mysqladmin
user=root
password=password-del-root-de-mysql
log = /var/lib/mysql/multilog

Luego eliminamos todo lo que hay debajo de la sección

[mysqld]

Luego por cada instancia que instalamos agregamos el siguiente bloque:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Instancia ???
[mysqld???]
server-id=???
replicate-do-db = db
user            = mysql
pid-file        = /var/run/mysqld/mysqld???.pid
socket          = /var/run/mysqld/mysqld???.sock
port            = ????
basedir         = /usr
datadir         = /var/lib/mysql/???
tmpdir          = /var/lib/mysql/tmp/???
 
thread_cache_size       = 8
myisam-recover          = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
 
expire_logs_days        = 10
max_binlog_size         = 100M
skip-federated
skip-name-resolve
# Fin Instancia

Como ejemplo pueden ver la siguiente configuración:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Instancia 001
[mysqld001]
server-id       = 001
replicate-do-db = db
user            = mysql
pid-file        = /var/run/mysqld/mysqld001.pid
socket          = /var/run/mysqld/mysqld001.sock
port            = 3301
basedir         = /usr
datadir         = /var/lib/mysql/001
tmpdir          = /var/lib/mysql/tmp/001
 
thread_cache_size       = 8
myisam-recover          = BACKUP
query_cache_limit       = 1M
query_cache_size        = 16M
 
expire_logs_days        = 10
max_binlog_size         = 100M
skip-federated
skip-name-resolve
# Fin Instancia

Nota: Por cada instancia se usa un puerto distinto, es recomendable seguir una secuencia, por ejemplo, la primer instancia 3301, la segunda 3302, 3303 y así sucesivamente.

Paso 7

Ahora sólo nos queda levantar los servicios y tener en cuenta ciertos aspectos para el mantenimiento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# levantar todas las instancias
mysqld_multi start
 
# levantar una instancia especifica, según su id
mysqld_multi start 001
 
# detener todas las instancias
mysqld_multi stop
 
# detener una instancia especifica, según su id
mysqld_multi stop 001
 
# consultar el estado de las instancias
mysqld_multi report
 
# revisar el log de las instancias
vim /var/lib/mysql/multilog

Nota: una vez configurada las instancias, ya no podremos acceder a el mediante el comando

1
mysql -u root -p

En cambio podemos hacerlo así

1
2
mysql -u root -p
 --protocol=TCP -P 33??

Nota: Los créditos de esto se lo llevan mis compañeros de trabajo, que lo implementaron en donde estoy, simplemente lo publico para que a otros sirva si lo necesitan 🙂

Comentarios desde Facebook:

Sin Comentarios aun, puedes tú ser el primero en comentar!

Deja tu Comentario

Responder