3.4. Instancias Múltiples

Instancias
Cada servidor de bases de datos está compuesto por:

Una Base de Datos: Donde se almacenan los datos físicos (archivos de datos y otros componentes).
Una instancia: Constituye el mecanismo que permite su manipulación.Una instancia de Base de datos es el conjunto formado por los procesos y las estructuras de memoria que se encuentran en un servidor. Es un conjunto de estructuras de memoria que manejan los archivos de la base de datos, cuando inicia la instancia, con ella inician procesos de fondo (Background Process), como el LGWR, PMON, etc.

Importante saber que al menos una base de datos activa o mejor dicho que está corriendo, debe de tener una instancia asociada. De la misma manera, como la instancia existe en memoria y la base de datos existe en disco, una instancia puede existir sin una base de datos y una base de datos puede existir sin una instancia Puede haber múltiples instancias para una única base de datos o múltiples bases de datos en una misma instancia.

Instancias en MySQL:
El programa mysqld_multi se utiliza para administrar diversos procesos servidor MySQL (mysqld) dentro de una única instalación MySQL. Teniendo cada una de ellas conexiones en diferentes archivos socket en Unix, puertos TCP/IP, directorios, configuración etc. Puede arrancar o parar servidores, o reportar su estado actual. Cuando se necesitan tener varios servicios MySQL utilizando una misma instancia de MySQL, mysqld_multi es la mejor alternativa.

Paso 1: Configurar dos instancias (dos servicios: mysqld1 y mysqld2) MySQL editando /etc/my.cnf.

# Mysqld_multi
[mysqld_multi]
mysqld     = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user       = multi_admin
password   = multipass

[mysqld1]
socket     = /var/lib/mysql/mysql.sock
port       = 3306
pid-file   = /var/lib/mysql/prueba.pid
datadir    = /var/lib/mysql
language   = /usr/share/mysql/english
user       = mysql
server-id  = 1
[mysqld2]
socket     = /var/lib/mysql_phpunit/mysqld_phpunit.sock
port       = 3307
pid-file   = /var/lib/mysql_phpunit/mysqld_phpunit.pid
datadir    = /var/lib/mysql_phpunit
language   = /usr/share/mysql/english
user       = mysql
server-id  = 2

Paso 2: Crear las carpetas correspondientes y base de datos mysql para la segunda instancia del servicio MySQL (/var/lib/mysql_phpunit), el directorio /var/lib/mysql es el utilizado por defecto, por lo que no es necesario crearlo en este caso.

mkdir /var/lib/mysql_phpunit
chown mysql:mysql /var/lib/mysql_phpunit/
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql_phpunit/

NOTA: De no utilizar la versión predeterminada de MySQL como primera instancia, se debería de ejecutar ese mismo comando pero indicando el directorio de esa primera instancia que se quiera utilizar.


Paso 3: Configuración de las diversas instancias si se quiere permitir la parada del servicio con el comando service. Las dos instancias deben tener el mismo usuario / password y el privilegio de usuario SHUTDOWN.

#mysqld1
mysql -S /var/lib/mysql/mysql.sock -u root -proot --execute='GRANT SHUTDOWN 
ON *.* TO "multi_admin"@"localhost" IDENTIFIED BY "multipass"'
#mysqld2
mysql -S /var/lib/mysql_phpunit/mysqld_phpunit.sock  -u root -proot --execute
='GRANT SHUTDOWN ON *.* TO "multi_admin"@"localhost" IDENTIFIED BY "multipass"'


Paso 4: Método alternativo (cuando no se quiere utilizar el comando service).

mysqladmin -h127.0.0.1 -P3307 -uroot -p shutdown
mysqladmin -h127.0.0.1 -P3306 -uroot -p shutdown

Establecer la clave de root para el servicio mysqld2. (Lo mismo se tendría que hacer con la primera instancia si no estuviera configurada).
mysqladmin -S /var/lib/mysql_phpunit/mysqld_phpunit.sock -u root password root

Para hacer login en la instancia mysqld2 con el usuario root.

mysql -S /var/lib/mysql_phpunit/mysqld_phpunit.sock  -u root -proot

Ejemplo: Realizar un volcado en la base de datos stash de mysqld2.
mysql -S /var/lib/mysql_phpunit/mysqld_phpunit.sock  -u root -proot stash 
< fichero.sql
Crear un script de arranque (Fichero /etc/init.d/mysqld_multi).

#!/bin/sh
 
basedir=/usr
bindir=/usr/bin
 
if test -x $bindir/mysqld_multi
then
  mysqld_multi="$bindir/mysqld_multi";
else
  echo "Can't execute $bindir/mysqld_multi from dir $basedir";
  exit;
fi
case "$1" in
    'start' )
        "$mysqld_multi" start $2
        ;;
    'stop' )
        "$mysqld_multi" stop $2
        ;;
    'report'|'status' )
        "$mysqld_multi" report $2
        ;;
    'restart' )
        "$mysqld_multi" stop $2
        "$mysqld_multi" start $2
        ;;
    *)
        echo "Uso: $0 {start|stop|report|status|restart}" >&2
        ;;
esac

Se desactiva el servicio mysqld en el arranque y se pone el nuevo servicio (mysqld_multi), para que al arrancar el sistema se inicien todas las instancias si así se desea.

chkconfig mysql off
chkconfig --add mysqld_multi
chkconfig mysqld_multi on

Consultar el estado, arrancar y parar la primera instancia del servidor MySQL (mysqld1), si se quiere indicar la segunda, valdría con cambiar el 1 por un 2.

service mysqld_multi status 1
service mysqld_multi start 1
service mysqld_multi stop 1

Comandos: A continuación se muestra la lista de comandos que el MySQL Instance Manager acepta actualmente, con ejemplos.
  • -START INSTANCE <instance_name>
Este comando intenta arrancar una instancia: 
mysql> START INSTANCE mysqld4;
Query OK, 0 rows affected (0,00 sec)
  • -STOP INSTANCE <instance_name>
Esto trata de parar una instancia:
mysql> STOP INSTANCE mysqld4;
Query OK, 0 rows affected (0,00 sec)
  •  -SHOW INSTANCES

Muestra los nombres de todas las instancias cargadas:

mysql> show instances;
+---------------+---------+
| instance_name | status  |
+---------------+---------+
| mysqld3       | offline |
| mysqld4       | online  |
| mysqld2       | offline |
+---------------+---------+
3 rows in set (0,04 sec)


  • -SHOW INSTANCE STATUS <instance_name>
Muestra el estado e información de la versión de la instancia seleccionada:

mysql> SHOW INSTANCE STATUS mysqld3;
+---------------+--------+---------+
| instance_name | status | version |
+---------------+--------+---------+
| mysqld3       | online | unknown |
+---------------+--------+---------+
1 row in set (0.00 sec)


  • -SHOW INSTANCE OPTIONS <instance_name>

Muestra las opciones usadas por una instancia:

mysql> SHOW INSTANCE OPTIONS mysqld3;
+---------------+---------------------------------------------------+
| option_name   | value                                             |
+---------------+---------------------------------------------------+
| instance_name | mysqld3                                           |
| mysqld-path   | /home/cps/mysql/trees/mysql-4.1/sql/mysqld        |
| port          | 3309                                              |
| socket        | /tmp/mysql.sock3                                  |
| pid-file      | hostname.pid3                                     |
| datadir       | /home/cps/mysql_data/data_dir1/                   |
| language      | /home/cps/mysql/trees/mysql-4.1/sql/share/english |
+---------------+---------------------------------------------------+
7 rows in set (0.01 sec)

  • -SHOW <instance_name> LOG FILES
El comando proporciona un listado de todos los ficheros de log usados por la instancia. El conjunto resultado contiene el Path al fichero de log y al fichero de configuración (i.e. log=/var/mysql.log), el IM trata de adivinar su ubicación. Si IM no es capaz de localizar el fichero de logs, debe especificarlo explícitamente.

mysql> SHOW mysqld LOG FILES;
+-------------+------------------------------------+----------+
| Logfile     | Path                               | Filesize |
+-------------+------------------------------------+----------+
| ERROR LOG   | /home/cps/var/mysql/owlet.err      | 9186     |
| GENERAL LOG | /home/cps/var/mysql/owlet.log      | 471503   |
| SLOW LOG    | /home/cps/var/mysql/owlet-slow.log | 4463     |
+-------------+------------------------------------+----------+
3 rows in set (0.01 sec)
  • -SHOW <instance_name> LOG {ERROR | SLOW | GENERAL} size [, offset_from_end]
Este comando recibe una porción del fichero de log especificado. Ya que la mayoría de usuarios están interesados en los últimos mensajes de log, el parámetro size define el número de bytes que quiere recibir empezando por el final del log. Puede recibir datos del medio del fichero de log especificando el parámetro opcional offset_from_end. El siguiente ejemplo recibe 21 bytes de datos, empezando 23 bytes desde el final del fichero de log y acabando 2 bytes al final del fichero de log:
mysql> SHOW mysqld LOG GENERAL 21, 2;
+---------------------+
| Log                 |
+---------------------+
| using password: YES |
+---------------------+
1 row in set (0.00 sec)

  •  -SET instance_name.option_name=option_value

Este comando edita la configuración de la instancia especificada para cambiar/añadir opciones a la instancia. El IM asume que el fichero de configuración está localizado en /etc/my.cnf. Debe comprobar que el fichero existe y que tiene los permisos apropiados.

mysql> SET mysqld2.port=3322;
Query OK, 0 rows affected (0.00 sec)

Los cambios hechos en el fichero de configuración no tendrán efecto hasta reiniciar el servidor MySQL. Además, estos cambios no se guardan en la cache local de configuración del Instance Manager hasta que se ejecuta un comando FLUSH INSTANCES.

-UNSET instance_name.option_name

Este comando elimina una opción de un fichero de configuración de una instancia.

mysql> UNSET mysqld2.port;
Query OK, 0 rows affected (0.00 sec)

Los cambios hechos en el fichero de configuración no tendrán efecto hasta reiniciar el servidor MySQL. Además, estos cambios no se guardan en la cache local de configuración del Instance Manager hasta que se ejecuta un comando FLUSH INSTANCES.

  • -FLUSH INSTANCES

Este comando fuerza a IM a releer el fichero de configuración y a refrescar estructuras internas. Este comando debe ejecutarse tras editar el fichero de configuración. Este comando no reinicia las instancias:

mysql> FLUSH INSTANCES;
Query OK, 0 rows affected (0.04 sec)

Comentarios