Migración de bases MS Access y xBase a MySQL.

Migraciones

Migración de bases MS Access y xBase a MySQL.
Autor: Jorge Llarens

Uno de los trabajos más frecuentes (y
más odiosos) lidiando con bases de datos es la conversión
de un formato a otro. Esta es una revisión de algunas
herramientas disponibles para pasar de formato xbase (.DBF) y Access
(.MDB) a MySQL.




Metodología básica

Básicamente se pueden dividir los métodos en
directos e indirectos. Los métodos directos abren los archivos
.DBF o .MDB, se conectan a la base de datos MySQL y transfieren sus
contenidos a través de esa confección. Los métodos
indirectos generan uno o más archivos temporales, en base a
los que posteriormente se crearán las tablas de la base de
datos y/o insertarán los registros.


En el caso de métodos indirectos, para cada archivo .dbf o
tabla Access, estos son los pasos básicos que han de tomarse
para migrar:



  1. Generar un archivo ASCII con las
    instrucciones SQL para la creación de la/s tablas/s.


  2. Exportar desde el archivo .MDB o
    archivos .DBF a un/unos archivo/s ASCII con: a) las instrucciones
    SQL para insertar datos en las tablas o b) los datos puros,
    delimitados por comas/tabulaciones, etc.


  3. Ejecutar el archivo con las
    instrucciones SQL de creación de tablas.


  4. Ejecutar el archivo ASCII con instrucciones SQL de inserción,
    o IMPORTAR archivo ASCII con datos puros usando el comando sql LOAD
    DATA INFILE.





Entorno de trabajo

Para los propósitos de este texto, vamos a definir algunos
aspectos del ambiente donde trabajar:



  • Una estación con Windows y
    Linux instalados.


  • En la partición Linux,
    tener instalado un editor ASCII y la base de datos MySQL como
    mínimo, con el hostame configurado como localhost (bueh...) y
    con acceso a la partición windows, para este caso, tener
    acceso a c:/ en el directorio /mnt/windows).


  • En la partición Windows
    tener instalado Microsoft Access versión 97 como mínimo.
    Los archivos temporales de conversión se grabarán en
    el directorio c:/temp ( /mnt/windows/temp desde linux).


  • Una base de datos, en ambos
    formatos .DBF y .MDB, en este caso conteniendo los datos de una
    colección de libros. Los archivos residirán en el
    directorio c:\\data.


  • Para usar la herramienta dbtools,
    es necesario contar con DOS estaciones conectadas en red, una con
    Windows y DBTools instalados y otra con Linux y MySQL instalados.


  • Es recomendable acceder a la base de datos como un usuario
    común con privilegios bien acotados, o en todo caso tener
    disponible varios usuarios tipo dependiendo del trabajo (tipo dba
    para acceso total, común para entrada de datos o listados por
    ejemplo), pero NUNCA como root, porque este usuario tiene todos los
    privilegios en el sistema, incluso para dañarlo seriamente.





Conversión sin herramientas
específicas (o con herramientas nativas, o lo que sea bah...)

Hay buenas razones para no depender de herramientas especializadas
de conversión (la más sencilla de las cuales es no
disponer de ellas , sin olvidar el masoquismo), como por ejemplo la
necesidad de adaptar las tablas a las características de la
nueva base de datos. En mi caso en particular, siempre he tenido que
generar la estructura con algún conversor y modificar o
agregar sentencias sql para aprovechar alguna característica
ausente o diferente en la base de datos original.




Generar estructura con editor de texto


En última instancia he tenido que arreglarme creando las
sentencias con cualquier editor ASCII:

CREATE DATABASE libros;
CREATE TABLE autores(
     idautor    INT NOT NULL,
     nombre     CHAR (50),
     apellidos  CHAR (50),
     PRIMARY KEY (idautor)
);
CREATE TABLE autorlib(
     idautorlib INT NOT NULL,
     idautor    INT,
     idlibro    INT,
     PRIMARY KEY (idautorlibro)
);
CREATE TABLE libros(
     idlibro    INT NOT NULL,
     cargo      CHAR (50),
     idtema     INT,
     copyright  SMALLINT,
     númisbn    CHAR (50),
     páginas    SMALLINT,
     PRIMARY KEY (idlibro)
);
CREATE TABLE temas(
     idtema     INT NOT NULL,
     desctema   CHAR (50),
     PRIMARY KEY (idtema)
);
                        

Luego de guardarlo como libros.sql,
genero la base de datos pasando libros.sql por la consola mysql:

mysql < /mnt/windows/temp/libros.sql
                        

Con esto ya tenemos creada la base de datos LIBROS con sus tablas.
Esta estructura nos servirá para convertir desde cualquier
formato.




Exportar tablas desde Access


Después, volviendo a Windows, desde Access, por cada tabla
se usa la opción "Archivo / Guardar como o exportar... /
En un archivo o una base de datos externo", en la ventana de
diálogo, en la opción "Guardar como tipo:"
seleccionar "Archivos de texto"


En la ventana "..." seleccionando el botón
"Avanzado..." se pueden configurar estas opciones de
exportación sin pasar por los sucesivos pasos del asistente:

Formato de archivo: Delimitado
Delimitador de campo: ,
Cualificador de texto: "
Orden de la fecha: DMA 
                        

Un poco confuso todo no? No es para tanto, probando con el
programa todo se ve más claro. Luego de este paso deberíamos
tener cuatro archivos: autorlib.txt, autores.txt, libros.txt y
temas.txt




Exportar tablas desde xBase


Prácticamente cualquier dialecto xBase soporta el comando
COPY TO (archivo) DELIMITED


Para nuestro caso:

USE libros
COPY TO libros.txt DELIMITED
USE autores
COPY TO autores.txt DELIMITED
USE autorlib
COPY TO autorlib.txt DELIMITED
USE temas
COPY TO temas.txt DELIMITED
                        

Si es un entorno de comando se pueden ejecutar uno por uno, si es
un lenguaje compilado como clipper, se graba en archivo .prg, se
compila y se ejecuta.


Otra vez, deberíamos tener cuatro archivos: autorlib.txt,
autores.txt, libros.txt y temas.txt




Importación de tablas a MySQL


En cualquiera de los dos casos, otra vez en linux, desde la
consola MySQL se ejecuta el comando LOAD DATA INFILE por cada tabla

LOAD DATA INFILE \'/mnt/windows/temp/libros.txt\' INTO TABLE libros FIELDS TERMINATED BY \',\' 
    OPTIONALLY ENCLOSED BY \'"\' LINES TERMINATED BY \'\\r\\n\';
LOAD DATA INFILE \'/mnt/windows/temp/autores.txt\' INTO TABLE autores FIELDS TERMINATED BY \',\' 
    OPTIONALLY ENCLOSED BY \'"\' LINES TERMINATED BY \'\\r\\n\';
LOAD DATA INFILE \'/mnt/windows/temp/autorlib.txt\' INTO TABLE autorlib FIELDS TERMINATED BY \',\' 
    OPTIONALLY ENCLOSED BY \'"\' LINES TERMINATED BY \'\\r\\n\';
LOAD DATA INFILE \'/mnt/windows/temp/temas.txt\' INTO TABLE temas FIELDS TERMINATED BY \',\' 
    OPTIONALLY ENCLOSED BY \'"\' LINES TERMINATED BY \'\\r\\n\';
                        



Xbase a Mysql

dbf2mysql


http://mysql.vision.cl/Downloads/Contrib/dbf2mysql-1.14.tar.gz[1]


dbf2mysql es una pequeña y excelente aplicación que
genera información SQL a partir de archivos xBase. He aquí
una traducción de sus opciones:

                        
-v muestra detalles de la conversión
-vv muestra más detalles
-vvv incluye informe de progreso
-f traduce los nombres de campo a minúsculas
-u traduce los textos de campos alfanuméricos a mayúsculas
-l traduce los textos de campos alfanuméricos a minúsculas
-n no se agrega \'NOT NULL\'  en las sentencias de creación de tabla
-o <lista de campos> exporta solo los campos listados
-e <archivo> archivo para conversión de caracteres
-s substituye <lista de campos> permite cambiar nombres de campos.
        Ej. -s NOMBRE=AYN,DIR=DIRECCION
-i <lista de campos> lista de campos a indexar (atte: genera UN indice por campo)
-d <database> base de datos donde se insertaran los datos
-t <tabla> tabla donde se insertarán los datos
-c crea la tabla si no existe
-cc crea la tabla, pero no inserta registros
-p <campo>      indica la clave primaria
-h <host> indica server donde conectarse
-F los campos de caracteres se formatean como de longitud fija
-q modo rápido inserta los registros a través de un archivo temporal usando la sentencia LOAD DATA INFILE
-r quita espacios antes y después de datos alfanuméricos        
                                

Suponiendo que quiero hacer una
conversión directa, solo necesito crear la base de datos en
blanco, por ejemplo desde la consola mysql:

create database libros;
quit
                            

Y luego ejecutar dbf2mysql para crear las tablas e insertar los
datos:

dbf2mysql -h localhost -d libros -t autores -c -f -p idautor /mnt/c/data/autores.dbf
dbf2mysql -h localhost -d libros -t libros -c -f -p idlibro /mnt/c/data/libros.dbf
dbf2mysql -h localhost -d libros -t temas -c -f -p idtema /mnt/c/data/temas.dbf
dbf2mysql -h localhost -d libros -t autorlib -c -f -p idautorlib /mnt/c/data/autorlib.dbf
                        

La principal desventaja de este método es que no se crean
algunos atributos deseables, como es el caso de los campos
autoincrementables. En este caso, lo más recomendable es crear
nuestra propia estructura, otra vez volvemos al método de
crear la estructura con un editor ASCII y generar la base de datos
vacía con la consola MySQL como se explico aquí. Luego
se insertan los datos con este conjunto modificado de comandos
dbf2mysql:

dbf2mysql -h localhost -d libros -t autores -f /mnt/c/temp/autores.dbf
dbf2mysql -h localhost -d libros -t libros -f /mnt/c/temp/libros.dbf
dbf2mysql -h localhost -d libros -t temas -f /mnt/c/temp/temas.dbf
dbf2mysql -h localhost -d libros -t autorlib -f /mnt/c/temp/autorlib.dbf
                        



Access a Mysql

access_to_mysql.txt


http://mysql.vision.cl/Downloads/Contrib/access_to_mysql.txt[1]


Este es un módulo de access que crea un archivo con las
instrucciones sql para crear las tablas e insertar los registros,
similar a como lo hace el comando mysqldump (bueno, por algo el
archivo que se crea se llama mysqldump.txt).


Para usarlo, ha de crearse un módulo de access y pegarle el
contenido de access_to_mysql.txt para después ejecutarlo. Al
finalizar, quedará creado un archivo mysqldump.txt en el
directorio c:/temp.




exportsql


http://mysql.vision.cl/Downloads/Contrib/exportsql.txt[1]


Este es otro módulo para access que genera archivos con
instrucciones sql. La diferencia con el programa anterior radica en
que lo podemos configurar a través de unas variables
declaradas al principio, por ejemplo:


ADD_SQL_FILE: contiene el directorio y archivo que contendrá
las instrucciones SQL de creación e inserción.


DEL_SQL_FILE: contiene el directorio y archivo que contendrá
las instrucciones SQL de borrado de las tablas.


DISPLAY_WARNINGS: indica si las advertencias de errores se
muestran durante el proceso de conversión (aconsejo cambiarlo
a FALSE, porque si se da un error durante la conversión de
registros y son muchos registros, se puede cansar de dar OK en el
mensaje de error).

Previo a la definición de cada tabla hay
instrucciones DROP TABLE, que darán error en el caso de que
se lo use con la base de datos vacía, para solucionarlo se
pueden borrar estas instrucciones, o bien agregarles la cláusula
IF EXIST. A los campos que forman parte de la clave primaria se
les debe agregar la cláusula NOT NULL, o el script
terminara con error cuando se intente crear las tablas.

Después de generados los archivos con estos módulos,
hay que pasar a Linux y ejecutarlos, a través de la consola
mysql. Para el caso de access_to_mysql, suponiendo que se creó
la base de datos y que el archivo reside en
/mnt/windows/temp/mysqldump.txt, las tablas se generan con este
comando:

mysql < /mnt/windows/temp/mysqldump.txt
                        

Para el caso de exportsql.txt, las tablas se generan con el
comando:

mysql < /mnt/windows/temp/esql_add.txt
                        



mdbtools


http://mdbtools.sourceforge.net


Esta es una serie de utilidades Linux para conversión y
manejo de bases de datos Access:

                        
mdb-ver <archivo> imprime la versión de la base de datos de un archivo .mdb (jet3 o 4).
mdb-dump <archivo>  volcado hexadecimal del contenido de un archivo .mdb.
mdb-tables <archivo> genera una lista simple con las tablas contenidas en la base de datos, 
    útil para script de shell.
mdb-schema <archivo>  imprime las sentencias de creación de las tablas. 
    ATENCION; en esta versión 0.4, todavía no se incluyen las definiciones de índices.
mdb-export [-H] [-Q] [-d <delimitador>] <archivo> <tabla> exporta una tabla a formato delimitado. 
    La opción -H suprime los títulos de columna, 
    -Q no corta campos de texto entre comillas y 
    -d cambia el delimitador por defecto.
mdb-parsecsv <archivo> genera un programa .c a partir de un archivo generado por mdb-export.
mdb-header <archivo> genera archivos .c y .h a ser usados para exportar archivos .mdb.
mdb-sql <archivo> motor sql simple.
gmdb utilidad gráfica que aúna varias de las utilidades anteriores. 
                        

Este es un paquete que esta en su versión
0.4, así que no es totalmente funcional, lo cual no quiere
decir que no se lo pueda usar en ambiente de producción.
Básicamente es posible acceder a las bases de datos sin
utilizar Windows, creando el archivo de definición de la
base de datos con la utilidad mdb-schema y completar la definición
de índices, crear los archivos temporales de conversión
de datos con la utilidad mdb-export y posteriormente importarlos
con el comando LOAD DATA INFILE en la consola mysql.



dbtools


www.dbtools.com.br


Esta es una excelente aplicación de autores brasileños,
nativa de windows, que permite entre otras cosas convertir
directamente desde muchos formatos, incluyendo Access y Xbase.


Para trabajar con la base de datos, lo primero es conectarse al
servidor MySQl, desde server manager, cargar los datos del servidor:
ip, hostname, base de datos, usuario e iniciar la confección.


Se inicia el proceso desde la opción de menu Data/New
Import Data Wizard, el wizard es muy explicativo y bastante
exhaustivo y está en la lengua nativa de la informática:
el inglés.

En MySQL los nombres de tabla y campos son
case-sensitive, es decir Apellido es diferente de apellido.
Personalmente, me resulta engorroso recordar/tipear este tipo de
información, así que siempre elijo tener todo en
minúsculas. Access no hace este tipo de distinción,
cosa que hay que tener en cuenta cuando se hace la conversión.
MySQL tampoco es amigable en lo que se refiere a los nombres con
espacios incluidos



Conclusión

Por más completas que sean las herramientas, forman parte
de un proceso que lleva varios pasos, casi siempre el resultado de la
generación de las estructuras debe ser corregido antes de
pasarlas a la base de datos, y por lo general el sistema más
rápido para insertar datos es el comando LOAD DATA INFILE, así
que una combinación de todos estos métodos suele ser
buena alternativa. Y he incluido sólo el tema de convertir,
por así decirlo, tabla a tabla,


OTRO tema es la conversión desde un esquema de información
totalmente diferente a uno normalizado para bases de datos. Por lo
general en estos casos, se ha de programar un script de conversión,
que tome los datos, por ejemplo de una planilla de cálculo
monolítica y la convierta en varias tablas normalizadas.


Notas

[1]

Este es uno de tantos mirrors de esta página,
la lista completa esta en
http://www.mysql.com/downloads/download.php?file=Downloads/Contrib/