# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

MySQL Sandbox, uno o más servidores MySQL aislados en una máquina

MySQL SandboxMySQL Sandbox es una herramienta de gran utilidad para probar nuevas versiones de MySQL en servidores de desarrollo y pruebas. Te permite, de una forma extremadamente sencilla instalar uno o más servidores MySQL en un servidor en escasos segundos. Estos servidores MySQL están completamente aislados de cualquier otro servidor MySQL que haya instalado en el servidor, algo muy útil para probar versiones distintas de MySQL sin afectar al servidor en producción.

Por defecto, la herramienta trae opciones preestablecidas para la creación de varios servidores MySQL independientes con una única orden, creación de sistemas de replicación, creación a partir de código fuente, binarios, etc.

La instalación de MySQL Sandbox es sencilla, podemos descargarnos el tarball y seguir los pasos de la instalación o descargarlo directamente desde CPAN como módulo de Perl:

# cpan

cpan shell -- CPAN exploration and modules installation (v1.9205)
ReadLine support available (maybe install Bundle::CPAN or Bundle::CPANxxl?)

cpan> install MySQL::Sandbox

Una vez instalado, hemos de revisar las opciones de creación:

$ sandbox
The MySQL Sandbox,  version 3.0.04
(C) 2006,2007,2008,2009 Giuseppe Maxia
available applications:
make_sandbox                  : the easiest way of creating a sandbox
low_level_make_sandbox        : create a single sandbox, with fine tuning options (don't use directly)
make_replication_sandbox      : creates a sandbox with replicated master and slaves or circular
make_multiple_sandbox         : creates a group of sandboxes with the same version
make_multiple_custom_sandbox  : create a group of sandboxes with different versions
make_sandbox_from_source      : create a sandbox from a build directory
make_sandbox_from_installed   : create a sandbox from already installed binaries
sbtool                        : performs auxiliary actions with existing sandboxes

Para crear una instancia de servidor MySQL básica, simplemente tenemos que descargarnos la versión que queramos de MySQL. Vamos a crear por ejemplo una sandbox de la versión 5.4.1:

wget http://dev.mysql.com/get/Downloads/MySQL-5.4/mysql-5.4.1-beta-linux-i686-glibc23.tar.gz/from/http://mysql.rediris.es/

Una vez descargado, la forma más sencilla de crear la sandbox con MySQL 5.4.1 es la siguiente:

$ make_sandbox mysql-5.4.1-beta-linux-i686-glibc23.tar.gz
unpacking /home/alex/mysql-5.4.1-beta-linux-i686-glibc23.tar.gz
Executing low_level_make_sandbox --basedir=/home/alex/5.4.1 \
	--sandbox_directory=msb_5_4_1 \
	--install_version=5.4 \
	--sandbox_port=5410 \
	--no_ver_after_name \
	--my_clause=log-error=msandbox.err
    The MySQL Sandbox,  version 3.0.04
    (C) 2006,2007,2008,2009 Giuseppe Maxia
installing with the following parameters:
upper_directory                = /home/alex/sandboxes
sandbox_directory              = msb_5_4_1
sandbox_port                   = 5410
check_port                     = 0
no_check_port                  = 0
datadir_from                   = script
install_version                = 5.4
basedir                        = /home/alex/5.4.1
my_file                        =
operating_system_user          = alex
db_user                        = msandbox
db_password                    = msandbox
my_clause                      = log-error=msandbox.err
prompt_prefix                  = mysql
prompt_body                    =  [\h] {\u} (\d) > '
force                          = 0
no_ver_after_name              = 1
verbose                        = 0
load_grants                    = 1
no_load_grants                 = 0
no_show                        = 0
do you agree? ([Y],n) Y
090716 19:46:44 [Warning] Forcing shutdown of 2 plugins
090716 19:46:44 [Warning] Forcing shutdown of 2 plugins
loading grants
.................. sandbox server started
Your sandbox server was installed in $HOME/sandboxes/msb_5_4_1

Simplemente hay que ejecutar la orden que queramos seguida del fichero tarball que contiene la versión MySQL a instalar (podríamos hacer una sandbox sencilla como este caso, o crear replicaciones, etc). Como véis, antes de instalarla y arrancarla nos pide confirmación e informa del lugar en el que instala todas las sandboxes, la carpeta en la que se alojará la versión que estamos instalando, etc.

Dentro de la carpeta “sandboxes”, encontraréis todos los scripts necesarios para arrancar, parar y realizar acciones con las sandboxes, además de las carpetas que contienen cada una de ellas:

rwxr-xr-x 1 alex alex 2,1K 2009-07-16 19:46 sandbox_action
-rwxr-xr-x 1 alex alex   57 2009-07-16 19:46 use_all
-rwxr-xr-x 1 alex alex   58 2009-07-16 19:46 stop_all
-rwxr-xr-x 1 alex alex   59 2009-07-16 19:46 start_all
-rwxr-xr-x 1 alex alex   63 2009-07-16 19:46 send_kill_all
-rwxr-xr-x 1 alex alex   61 2009-07-16 19:46 restart_all
-rwxr-xr-x 1 alex alex   59 2009-07-16 19:46 clear_all
drwxr-xr-x 3 alex alex 4,0K 2009-07-16 19:46 msb_5_4_1

Dentro de las carpetas de cada sandbox, podéis hacer las mismas acciones pero únicamente para dicha sandbox:

:~/sandboxes/msb_5_4_1$ l
total 60K
-rwxr-xr-x 1 alex alex 1,5K 2009-07-16 19:46 stop
-rwxr-xr-x 1 alex alex 1,8K 2009-07-16 19:46 start
-rwxr-xr-x 1 alex alex 1,4K 2009-07-16 19:46 send_kill
-rwxr-xr-x 1 alex alex  881 2009-07-16 19:46 restart
-rw-r--r-- 1 alex alex 1,6K 2009-07-16 19:46 my.sandbox.cnf
-rwxr-xr-x 1 alex alex  917 2009-07-16 19:46 load_grants
-rwxr-xr-x 1 alex alex 1,7K 2009-07-16 19:46 clear
-rw-r--r-- 1 alex alex   51 2009-07-16 19:46 USING
-rwxr-xr-x 1 alex alex 1,3K 2009-07-16 19:46 use
-rwxr-xr-x 1 alex alex  923 2009-07-16 19:46 proxy_start
-rwxr-xr-x 1 alex alex 1,8K 2009-07-16 19:46 my
-rw-r--r-- 1 alex alex  187 2009-07-16 19:46 grants.mysql
-rwxr-xr-x 1 alex alex 1,5K 2009-07-16 19:46 change_ports
-rwxr-xr-x 1 alex alex 1,7K 2009-07-16 19:46 change_paths
drwx------ 4 alex alex 4,0K 2009-07-16 19:47 data

con el comando “use” podemos acceder al cliente MySQL para gestionar la sandbox:

~/sandboxes/msb_5_4_1$ ./use
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.4.1-beta MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql [localhost] {msandbox} ((none)) > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql [localhost] {msandbox} ((none)) >

Bien, esto es lo más básico para comenzar a utilizar esta genial herramienta, mención especial merece también el comando sbtool, que permite realizar acciones extras con las sandboxes, podéis verlas a continuación:

$ sbtool --help
usage: /usr/local/bin/sbtool [options]
	-o     --operation       (s) <> - what task to perform
		 'info'     returns configuration options from a Sandbox
		 'tree'     creates a replication tree
		 'move'     moves a Sandbox to a different location
		 'unpreserve' makes a sandbox NOT permanent
		 'range'    finds N consecutive ports not yet used by the Sandbox
		 'port'     Changes a Sandbox port
		 'copy'     copies data from one Sandbox to another
		 'ports'    lists ports used by the Sandbox
		 'delete'   removes a sandbox completely
		 'preserve' makes a sandbox permanent
	-s     --source_dir      (s) <> - source directory for move, copy, delete
	-d     --dest_dir        (s) <> - destination directory for move,copy
	-n     --new_port        (s) <> - new port while moving a sandbox
	-u     --only_used       (-) <> - for "ports" operation, shows only the used ones
	-i     --min_range       (i) <5000> - minimum port when searching for available ranges
	-x     --max_range       (i) <64000> - maximum port when searching for available ranges
	-z     --range_size      (i) <10> - size of range when searching for available port range
	-f     --format          (s)  - format for "ports" and "info"
		 'perl'     fully structured information in Perl code
		 'text'     plain text dump of requested information
	-p     --search_path     (s)  - search path for ports and info
	-a     --all_info        (-) <> - print more info for "ports" operation
	       --master_node     (i) <1> - which node should be master (default: 1)
	       --tree_nodes      (s) <> - description of the tree (x-x x x-x x|x x x|x x)
	       --mid_nodes       (s) <> - description of the middle nodes (x x x)
	       --leaf_nodes      (s) <> - description of the leaf nodes (x x|x x x|x x)
	       --tree_dir        (s) <> - which directory contains the tree nodes
	-v     --verbose         (-) <> - prints more info on some operations
	-h     --help            (-) <1> - this screen

MySQL: Volcar determinadas filas con mysqldump

Probablemente en ciertas ocasiones no necesites volcar en un fichero todo el backup de una base de datos MySQL, sino que solamente necesites volcar ciertas filas de la bbdd. Con la herramienta de backup y volcado de bases de datos mysqldump podemos hacer esta tarea de un modo sencillo.

En el siguiente ejemplo podéis observar como mediante la cláusula –where podemos especificar las condiciones que deben cumplir las filas para ser volcadas en el backup:

mysqldump -u <usuario> -p  --tables <tablas>  --where="<condición>" > dumptest.sql

Un ejemplo real de –where:

--where="user='test'"

Sencillo y muy útil en bases de datos de gran tamaño de las cuales necesitamos recuperar solamente una parte de los registros.

Host ‘host_name’ is blocked because of many connection errors. Unblock with ‘mysqladmin flush-hosts

No hay duda que si todos los errores en el mundo de los sistemas fueran tan sumamente descriptivos como este a muchos se nos terminaría rápido el trabajo. Bromas aparte, si os encontráis con un error como el siguiente a la hora de conectar a un servidor MySQL:

Host ‘host_name’ is blocked because of many connection errors.
Unblock with ‘mysqladmin flush-hosts’

La solución está clara, acceder al servidor MySQL y ejecutar el comando siguiente como root:

mysqladmin flush-hosts

El origen del problema es que el servidor MySQL ha recibido demasiados intentos de conexión desde la máquina indicada que han sido interrumpidos. Este tipo de conexiones fallidas provocan que el servidor MySQL detecte indicios de actividad sospechosa desde el host que está generando los errores, y por seguridad decide bloquearle el acceso.

Por defecto, Mysql está configurado para permitir 10 conexiones incorrectas antes de bloquearlo, si queremos ampliar este número deberemos reconfigurar la siguiente variables en nuestro fichero de configuración (my.cnf):

max_connect_errors= xxxx

Lo recomendable de todas formas es detectar el origen del problema para evitar tener que modificar un parámetro como este que puede afectar a la seguridad de nuestro sistema, analizar el origen de estas conexiones, el porqué de los fallos, etc.

Exportar estructura de base de datos MySQL en formato XML

Para exportar la estructura (sin datos) de una base de datos MySQL a formato XML hay que utilizar el comando mysqldump con los parámetros –no-data y –xml:

mysqldump --no-data --xml base_de_datos > base_de_datos.xml

Backup de una sola tabla con mysqldump

Es posible hacer un backup de una sola tabla en vez de toda la base de datos, para ello, utiliza el siguiente comando mysqldump:

mysqldump -p --user usuario basededatos tabla > backuptabla.sql

Vía | Uno-Code

Disponible MySQLTuner 1.0.0

Si ya teníamos pocas opciones para optimizar MySQL, aquí va otra, MySQLTuner 1.0.0. Esta nueva versión añade soporte para MySQL 5.1 y Solaris.

- Link descarga.
- Changelog.

Revisa también MyTop, MySQL Query Analyzer o MySQL Performance Tuning Primer Script

MySQL: Cambiar motor de almacenamiento (default storage engine) por defecto

MySQL soporta varios motores de almacenamiento (storage engine)que tratan con distintos tipos de tabla. Los motores de almacenamiento de MySQL incluyen algunos que tratan con tablas transaccionales y otros que no lo hacen. Normalmente se utiliza MyISAM para lecturas rápidas e InnoDB para transacciones e integridad referencial. Si deseamos cambiar el motor por defecto para la creación de nuevas tablas en MySQL, debemos añadir la siguiente línea al ficher my.cnf (Unix) o my.ini (Windows), en este caso sería para poner como motor por defecto MyISAM:

default-storage-engine=MyIsam

Si quisieramos poner por defecto InnoDB:

default-storage-engine=InnoDB

Más información sobre motores de almacenamiento aquí.

Monitorización MySQL: MySQL Query Analyzer

Evidentemente existen muchas maneras de monitorizar MySQL, por ejemplo con cacti, MyTop, etc. No obstante he encontrado una aplicación propia de Sun/MySQL muy interesante, se trata de MySQL Query Analyzer.
MySQL Query analizer
Captura oreilly.com

Como se observa en la captura de pantalla, se trata de una interfaz web sobre la que podemos monitorizar y recolectar datos de los servidores MySQL que necesitemos, destaca la monitorización a tiempo real de queries en el servidor, rápida identificación de problemas en las queries, detalle de las queries y debug para solucionar y optimizar consultas mal construidas con explain. Por supuesto hay un historico de consultas, posibilidad de buscar, ordenar, etc.
MySQL Query analizer

Puedes descargarlo y encontrar más información en este enlace.