jueves, 4 de noviembre de 2010

Convertir una base de datos en access a mysql de forma periódica (II)

Continuamos con la configuración del ordenador que hará de servidor FTP y MySql.

Si todo ha ido bien, el ordenador de la biblioteca subirá cada día una copia del fichero abies.mdb al directorio /home/biblioteca del servidor. Ahora vamos a convertir los datos de /home/biblioteca/abies.mdb a MySql.

Se supone que ya existe una base de datos creada para tal fin, a la que llamaremos biblioteca. Si dicha base de datos aún no ha sido creada, lo haremos con el siguiente comando:
echo "CREATE DATABASE biblioteca DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish2_ci ;" | mysql -u root --password=password_root
Siendo "password_root" la contraseña del usuario root de MySql. Una vez creada la base de datos, conviene trabajar con un usuario en MySql que sólo tenga privilegios sobre la citada base de datos. Para crear este usuario haremos lo siguiente (usuario: biblioteca, contraseña: password_biblio):
echo "CREATE USER biblioteca@localhost IDENTIFIED BY 'password_biblio';" | mysql -u root --password=password_root

echo "GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , EVENT, TRIGGER, SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON biblioteca.* TO biblioteca@localhost;" | mysql -u root --password=password_root

Vamos ahora a incorporar los datos desde access. Lo primero es instalar las mdbtools:
sudo apt-get install mdbtools

A continuación, crearemos un script al que llamaremos, por ejemplo, bibliotomysql.sh. Aquí dejo el script completo. Este script se encarga de transformar las tablas de Access a un formato válido para MySql e importarlos. Aún tiene ciertos problemas con la codificación de la tabla "Lectores". Estamos en ello.

Este script lo dejaremos en /home/biblioteca/ y le daremos permisos de ejecución:
chhmod +x /home/biblioteca/bibliotomysql.sh
y lo programaremos con cron:
sudo crontab -u biblioteca -e
Entramos en el editor que más nos guste e incorporamos la línea:
00 13 * * * /home/biblioteca/bibliotomysql.sh
Con lo que se ejecuará este script todos los días a las 13:00 horas.


P.D.: Información recopilada gracias a:
http://farismadi.wordpress.com/2008/07/13/encoding-of-mdb-tool/
http://nialldonegan.me/2007/03/10/converting-microsoft-access-mdb-into-csv-or-mysql-in-linux/ 

ACTUALIZACIÓN: para que mysql trabaje en UTF-8: 
http://recursive-design.com/blog/2008/06/23/force-mysql-encoding-to-utf8/
Que viene a decir que hay que añadir al fichero my.cnf las siguientes líneas:
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake
 

martes, 2 de noviembre de 2010

Convertir una base de datos en access a mysql de forma periódica (I)

El escenario es el siguiente: se tiene un ordenador en la biblioteca del instituto que utiliza el famso Abies 2.0, programa de gestión de bibliotecas desarrollado por no recuerdo qué ministerio (por cierto, seguimos esperando la tan cacareada versión 3.0. A este paso la vamos a tener que hacer en código abierto).

Abies 2.0 guarda sus datos en una base de Access, formato mdb. Por otro lado, se ha desarrollado una aplicación web que muestra el estado del catálogo (libros disponibles, prestados, etc.). Esta aplicación está desarrollada en PHP y funciona sobre un servidor Apache y una base de datos en MySql. Por lo tanto es necesario convertir periódicmente la base de datos de access a MySql. Para ello hay que trabajar en dos equipos: el de la biblioteca y el servidor MySql.

1. Ordenador de la biblioteca: Hay que definir una tarea programada que ejecute el siguiente script, llamado subedatos.bat (todos los días a las 11:00, por ejemplo):
copy c:\Abies2.0\datos\abies.mdb
winzip32 -a abies.zip abies.mdb
ftp -s:biblioftp.scr
Para que este script funcione, tiene que estar instalado en el sistema el programa WinZip. También tiene que existir en el mismo directorio o carpeta un fichero, llamado biblioftp.scr, con los comandos del ftp, a saber:
open servidor.mired.local
user
biblioteca
biblioteca
put abies.zip
quit
Aquí estamos suponiendo que la máquina que alberga la base de datos MySql se llama servidor.mired.local. También podría usarse la IP de dicha máquina. También estamos suponiendo que en el servidor FTP instalado en dicha máquina hay definido un usuario llamado biblioteca, con contraseña biblioteca. Esto lo definiremos en el siguiente apartado.

2. Servidor MySql y FTP: En el equipo que hará de servidor MySql hay que configurar un servidor FTP también. Para ello instalaremos el vsftp:
sudo apt-get install vsftpd
Ahora habrá que configurar el servidor FTP modificando el fichero /etc/vsftpd.conf por ejemplo con gedit:
 sudo gedit /etc/vsftpd.conf
Cambiaremos:

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022

El resto de las opciones las dejaremos como vienen por defecto. Ahora definiremos el usuario para acceder por ftp:
sudo useradd -m biblioteca
sudo passwd biblioteca
Con el último comando le asignaremos la contraseña (usaremos "biblioteca", porque es la que definimos en la tarea programada del apartado 1).

Una vez hecho esto, hay que programar que todos los días, a las 12:30, por ejemplo, se descomprima el fichero abies.zip. Para ello, hay que utilizar el programa crontab, que es el equivalente a Tareas Programadas de Windows. Ejecutaremos el comando:  
sudo crontab -u biblioteca -e
Esto nos da a elegir entre varios editores. El nano (opción 2), es relativamente fácil de utilizar. El objetivo es escribir la siguiente línea: 
45 12 * * * unzip -o /home/biblioteca/abies.zip
Esto descomprime el archivo zip todos los días a las 12:45.