Tag Archives: MySQL

Dumpear todas las bases de datos

Recientemente tuve que “dumpear” todas las bases de datos de un servidor por lo que utilice un script muy simple para hacerlo:

USER=root;PASS=mi_pass;for database in `echo "SHOW DATABASES" | mysql --user=$USER --password=$PASS | sed '1d'`; do mysqldump --user=$USER --password=$PASS $database > $database.sql; tar jcvf $database.tar.bz2 $database.sql; rm $database.sql; done

Un poco más leible:

USER=root
PASS=mi_pass
for database in `echo "SHOW DATABASES" | mysql --user=$USER --password=$PASS | sed '1d'`
do
    mysqldump --user=$USER --password=$PASS $database > $database.sql
    tar jcvf $database.tar.bz2 $database.sql
    rm $database.sql
done

Básicamente manda todas las bases de datos y quita la linea inicial (que siempre es Databases) y por cada base de datos invoca mysqldump y por último lo comprime con bunzip2 para obtener un archivo muy pequeño y por supuesto elimina las “fuentes” de sql.

Ordenación Explícita en MySQL

Algunas veces (por suerte no es frecuente) es necesario ordenar de manera explícita en MySQL, se necesita darle una lista de valores que será el orden y no necesariamente por los valores de un campo; por ejemplo puede ser una lista arbitraria de ID's

Para lograr esto me he encontrado con lo siguiente: http://www.bin-co.com/database/mysql/explict_order_by.php

Básicamente lo que explica es que para ordenar de manera explícita, se escriben los valores explícitamente de la forma:

columna1=valor1 DESC, columna2=valor2 DESC, ..., columnaN=valorN DESC

Es muy importante usar DESC para tenerlos en el orden escrito, si escribimos ASC entonces tendremos un orden inverso (el último valor será el primero), si mezclamos DESC y ASC, tendremos que los DESC se harán conforme se escribieron y los ASC en sentido inverso despúes de los valores DESC.

Por ejemplo si tenemos una tabla ‘tabla_prueba‘ que tiene una columna id y queremos ordenar por los valores 2,1,10,7 en ese orden debemos hacer los siguiente:

SELECT * FROM tabla_prueba WHERE id IN(2,1,10,7)
      ORDER BY id=2 DESC, id=1 DESC, id=10 DESC, id=7 DESC

Si se omite el WHERE nos mostrará todos los renglones de la tabla y solamente al tope los valores ordenados como hemos especificado.

Ejabberd y mod_archive

Hace algo de tiempo conocí ejabberd, es un servidor de Jabber de alto desempeño; inicialmente debo admitir que no me gustó mucho principalmente porque está escrito en Erlang y que tenía poca documentación, además de que cometer un error de configuración mostraba muchisimos datos sin sentido para programadores de Erlang y nada en lenguaje ‘humano’.
Ahora el proyecto ha madurado considerablemente y una de las ventajas por la que sigo utilizando Ejabberd es que es el único servidor Jabber open source en manejar clustering.

Recientemente me pidieron instalar un módulo para almacenar la historia de las conversaciones, algo que hace por ejemplo Google Talk (que está implementado en Jabber), este es el protocolo: XEP-0136 y utilizar la opción de guardar conversaciones automáticamente (sin intervención del usuario para solicitar que se almacene).
Hay diversos modulos para implementar esto en ejabberd, pero buscando me encontré que mod_archive es el mejor y el que se encuentra con desarrollo activo.
El problema es que prácticamente no existe documentación ni información de si por ejemplo funcionaría en Ejabberd 2 que es la versión del servidor que utilizo.

A prueba y error y con algunos pequeños documentos que me encontré descubrí que si funciona en la versión 2.0, a continuación vienen los pasos para hacerlo funcionar con MySQL:

  • Compilar ejabberd para que acepte odbc
    ./configure --enable-odbc
  • Descargar los módulos de ejabberd
    svn co http://svn.process-one.net/ejabberd-modules
  • Compilar el módulo interno de MySQL de los módulos descargados de ejabberd
    cd mysql/trunk
    ./build.sh
    cp ebin/*.beam /directorio_ejabberd/var/lib/ejabberd/ebin/
  • Compilar el módulo de archivo (mod_archive)
    cd mod_archive/trunk
    ./build.sh
    cp ebin/*.beam /directorio_ejabberd/var/lib/ejabberd/ebin/
  • Editar el archivo de configuración de Ejabberd para habilitar odbc
    {odbc_server, {mysql, "direccion_servidor", "base_de_datos", "usuario", "contraseña"}}.
  • Editar el archivo para agregar mod_archive (parte de {modules,…)
    {mod_archive_odbc,  [{database_type, "mysql"},
    {default_auto_save, true},
    {enforce_default_auto_save, false},
    {default_expire, infinity},
    {enforce_min_expire, 0},
    {enforce_max_expire, infinity},
    {replication_expire, 31536000},
    {session_duration, 1800},
    {wipeout_interval, 86400}
    ]},
  • Crear la base de datos utilizando el archivo: ejabberd-modules/mod_archive/trunk/src/mod_archive_odbc_mysql.sql

Hay que hacer notar que el archivo sql es para MySQL 5 y posteriores (para utilizarlo con una versión anterior hay que eliminar la parte de triggers), además el archivo crea una base de datos llamada ejabberd, si se necesita otro nombre editarlo para ya sea eliminar la parte de crear o cambiar el nombre de la base de datos que será creada; utiliza el prefijo archive_ para sus tablas.

Iniciar (o reiniciar) el servicio de ejabberd y a partir de ahora todas las conversaciones serán guardadas en mysql.