Migracion de bases de datos

Anuncio
Disquisidor - Divagues informaticos
Migracion de bases de datos
Desarrollo
Enviado por :
Posted on : 4/11/2006 10:34:38
Uno de los trabajos mas frecuentes (y mas odiosos) lidiando con bases de datos es la conversion de
un formato a otro. Esta es una revision de algunas herramientas disponibles para pasar de formato
xbase (.DBF) y Access (.MDB) a MySQL.
Metodologia básica
Básicamente se pueden dividir los metodos en directos e indirectos. Los metodos directos abren los
archivos .DBF o .MDB, se conectan a la base de datos MySQL y transfieren sus contenidos a traves
de esa conección. Los metodos indirectos generan uno o mas archivos temporales, en base a los
que posteriormente se crearan las tablas de la base de datos y/o insertaran los registros.
En el caso de metodos indirectos, para cada archivo .dbf o tabla Access, estos son los pasos
basicos que han de tomarse para migrar:
Generar un archivo ASCII con las instrucciones SQL para la creación de la/s tablas/s.
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.
Ejecutar el archivo con las instrucciones SQL de creacion de tablas.
Ejecutar el archivo ASCII con instrucciones SQL de insercion, o IMPORTAR archivo ASCII con datos
puros usando el comando sql LOAD DATA INFILE.
Entorno de trabajo
Para los propositos de este texto, vamos a definir algunos aspectos del ambiente donde trabajar:
Una estacion 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 version 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 residiran 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 comun con privilegios bien acotados,
o en todo caso tener disponible varios usuarios tipo dependiendo del trabajo (tipo dba para acceso
total, comun para entrada de datos o listados por ejemplo), pero NUNCA como root, porque este
usuario tiene todos los privilegios en el sistema, incluso para danarlo seriamente.
Conversión sin herramientas especificas (o con herramientas nativas, o lo que sea bah...)
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 1
Hay buenas razones para no depender de herramientas especializadas de conversion (la mas
sencilla de las cuales es no disponer de ellas , sin olvidar el masoquismo), como por ejemplo la
necesidad de adaptar las tablas a las caracteristicas de la nueva base de datos. En mi caso en
particular, siempre he tenido que generar la estructura con algun conversor y modificar o agregar
sentencias sql para aprovechar alguna caracteristica ausente o diferente en la base de datos
original.
Generar estructura con editor de texto
En ultima 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,
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
Con esto ya tenemos creada la base de datos LIBROS con sus tablas. Esta estructura nos servira
para convertir desde cualquier formato.
Exportar tablas desde Access
Despues, volviendo a Windows. desde Access, por cada tabla se usa la opcion "Archivo / Guardar
como o exportar... / En un archivo o una base de datos externo", en la ventana de dialogo, en la
opcion "Guardar como tipo:" seleccionar "Archivos de texto"
En la ventana "..." seleccionando el boton "Avanzado..." se pueden configurar estas opciones de
exportacion 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 mas claro.
Luego de este paso deberiamos tener cuatro archivos: autorlib.txt, autores.txt, libros.txt y temas.txt
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 2
Exportar tablas desde xBase
Practicamente 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, deberiamos 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 'rn';
LOAD DATA INFILE '/mnt/windows/temp/autores.txt' INTO TABLE autores
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY 'rn';
LOAD DATA INFILE '/mnt/windows/temp/autorlib.txt' INTO TABLE autorlib
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY 'rn';
LOAD DATA INFILE '/mnt/windows/temp/temas.txt' INTO TABLE temas
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY 'rn';
Xbase a Mysql
dbf
http://dbf.berlios.de/index.html
Conversor que genera archivos de texto delimitado o sentencias sql
--sql {archivo}Genera instrucciones para la creacion y llenado de la tablas (por defecto la salida es
stdout)
--trim {r|l|b}cortar los campos a la izquierda, derecha o ambos
--csv {archivo}Genera salida separada por comas(por defecto la salida es stdout)
--separator {c}indica el separador para opcion --csv (por defecto es ',')
--view-infogenera estructura y estadisticas del .dbf
--noconvcon ejecuta conversion de juegos de caracteres
--debug {0-9}fija el nivel de debugging, 0 no muestra debugging
--versionMuestra numero de version
Para generar instrucciones sql:
dbf2 --sql autores.sql /mnt/c/data/autores.dbf
dbf2 --sql libros.sql /mnt/c/data/libros.dbf
dbf2 --sql temas.sql /mnt/c/data/temas.dbf
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 3
dbf2 --sql autorlib.sql /mnt/c/data/autorlib.dbf
Para generar archivos CSV:
dbf2 --csv autores.csv /mnt/c/data/autores.dbf
dbf2 --csv libros.csv /mnt/c/data/libros.dbf
dbf2 --csv temas.csv /mnt/c/data/temas.dbf
dbf2 --csv autorlib.csv /mnt/c/data/autorlib.dbf
Despues es cuestion de cargar las tablas con las sentencias LOAD DATA...
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:
-vmuestra detalles de la conversión -vv muestra más detalles
-vvvincluye informe de progreso
-ftraduce los nombres de campo a minúsculas
-utraduce los textos de campos alfanuméricos a mayúsculas
-ltraduce los textos de campos alfanuméricos a minúsculas
-nno se agrega 'NOT NULL' en las sentancias de creación de tabla
-o exporta solo los campos listados
-e archivo para conversion de caracteres
-s permite cambiar nombres de campos. Ej -s NOMBRE=AYN,DIR=DIRECCION
-i lista de campos a indexar (atte: genera UN indice por campo)
-d base de datos donde se insertaran los datos
-t tabla donde se insertarán los datos
-ccrea la tabla si no existe
-cccrea la tabla, pero no inserta registros
-p indica la clave primaria
-h indica server donde conectarse
-F los campos caractes se formatean como de longitud fija
-qmodo rapido inserta los registros a través de un archivo temporal usando la sentencia LOAD
DATA INFILE
-rquita espacios antes y despues de datos alfanuméricos
Suponiendo que quiero hacer una conversion 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
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 4
La principal desventaja de este metodo es que no se crean algunos atributos deseables, como es el
caso de los campos autoincrementables. En este caso, lo mas recomendable es crear nuestra
propia estructura, otra vez volvemos al metodo de crear la estructura con un editor ASCII y generar
la base de datos vacia con la consola MySQL. 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
Este es un modulo 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 modulo de access y pegarle el contenido de access_to_mysql.txt para
despues ejecutarlo. Al finalizar, quedara creado un archivo mysqldump.txt en el directorio c:/temp.
http://mysql.vision.cl/Downloads/Contrib/exportsql.txt
Este es otro modulo para access que genera archivos con instrucciones sql. La diferencia con el
programa anterior radica en que lo podemos configurar a traves de unas variables declaradas al
principio, por ejemplo:
ADD_SQL_FILE: contiene el directorio y archivo que contendra las instrucciones SQL de creacion e
insercion.
DEL_SQL_FILE: contiene el directorio y archivo que contendra las instrucciones SQL de borrado de
las tablas
DISPLAY_WARNINGS: indica si las advertencias de errores se muestran durante el proceso de
conversion (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 daran 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.
Despues de generados los archivos con estos modulos, hay que pasar a linux y ejecutarlos, a través
de la consola mysql. Para el caso de access_to_mysql, suponiendo que se creo la base de datos y
que el archivo reside en /mnt/windows/temp/mysqldump.txt, las tablas se generan con este
comando:
mysql Para el caso de exportsql.txt, las tablas se generan con el comando:
mysql
mdbtools
http://mdbtools.sourceforge.net
Esta es una serie de utilidades linux para conversion y manejo de bases de datos Access:
mdb-ver imprime la versión de la base de datos de un archivo .mdb (jet3 o 4).
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 5
mdb-dump volcado hexadecimal del contenido de un archivo .mdb.
mdb-tables genera una lista simple con las tablas contenidas en la base de datos, útil para script de
shell.
mdb-schema imprime las sentencias de creación de las tablas.
mdb-export [-H] [-Q] [-d ] exporta una tabla a formato delimitado. La opcion -H suprime los titulos de
columna, -Q no corta campos de texto entre comillas y -d cambia el delimitador por defecto.
mdb-parsecsv genera un programa .c a partir de un archivo generado por mdb-export.
mdb-header genera archivos .c y .h a ser usados para exportar archivos .mdb.
mdb-sql motor sql simple.
gmdbutilidad grafica que aúna varias de las utilidades anteriores.
Este es un paquete que esta en su versión 0.4, asi 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 (pero atención, todavia genera las definiciones 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 conección.
Se inicia el proceso desde la opcion de menu Data/New Import Data Wizard, el wizard es muy
explicativo y bastante exhaustivo y esta 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 informacion, asi que
siempre elijo tener todo en minusculas. Access no hace este tipo de distincion, cosa que hay que
tener en cuenta cuando se hace la conversion. MySQL tampoco es amigable en lo que se refiere a
los nombres con espacios incluidos
Conclusión
Por mas 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 rapido para insertar datos es el comando LOAD
DATA INFILE, asi que una combinación de todos estos metodos suele ser buena alternativa. Y he
incluido sólo el tema de convertir, por asi decirlo, tabla a tabla.
OTRO tema es la conversion desde un esquema de informacion totalmente diferente a uno
normalizado para bases de datos. Por lo general en estos casos, se ha de programar un script de
conversion, que tome los datos, por ejemplo de una planilla de cálculo monolítica y la convierta en
varias tablas normalizadas.
Notas
Este es uno de tantos mirrors de esta pagina, la lista completa esta en
http://www.mysql.com/downloads/download.php?file=Downloads/Contrib/
Appendice. Datos de ejemplo
En caso de no tener acceso a los datos de ejemplo, se puede copiar/pegar desde estas listas
Tabla temas
10,"Espionaje"
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 6
12,"Computacion"
Tabla autores
39,,"Varios"
56,"Tom","Clancy"
73,"Niklaus","Wirth"
75,"Elaine","Rich"
76,"Kevin","Knight"
77,"Jon","Toigo"
80,"Frederick","Forsyth"
88,"John","le Carré"
90,"Steve","Pieczenik"
91,"A.J.","Quinnell"
94,"Sidney","Sheldon"
119,"Malcom","Secrett"
120,"Chris","Gane"
121,"Trish","Sarson"
148,"Luis Tomas","Wayar"
149,"Hector Facundo","Arena"
152,"Seymour","Papert"
153,"Horacio C.","Reggini"
154,"Harold","Abelson"
155,"Andrea","diSessa"
156,"A.A.","Berk"
157,"Tohru","Moto-oka"
158,"Masaru","Kitsuregawa"
166,"Alice Y.H.","Tsai"
167,"Pedro J.","Hernandez Muñoz"
169,"Stewart","Brand"
170,"Mary","Campbell"
171,"Brad J.","Cox"
172,"Andrew J.","Novobilski"
Tabla libros
165,"El cardenal del Kremlin",10
171,"Sound Blaster 16 User's guide",12
172,"Algoritmos + estructuras de datos = programas",12
174,"Inteligencia Artificial",12
175,"Disaster Recovery Planning",12
181,"El cuarto protocolo",10
191,"La casa Rusia",10
195,"Peligro Inminente",10
196,"Juegos de patriotas",10
197,"Op center I / Jaque al Poder",10
198,"Op center II / La imagen en el espejo",10
199,"Op Center III / Juegos de estado",10
200,"Op Center IV / Actos de guerra",10
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 7
201,"Op center V / Equilibrio de poder",10
202,"Op center VI / Estado de sitio",10
203,"Operación Rainbow",10
204,"Ordenes presidenciales",10
205,"El falso mahdi",10
211,"La conspiracion del juicio final",10
226,"La alternativa del diablo",10
239,"Como dominar la hoja de calculo en presupuestos...",12
240,"Analisis estructurado de sistemas",12
276,"Linux, Manual de referencia",12
277,"Linux Avanzado",12
281,"Desafio a la mente",12
282,"Alas para la mente",12
283,"Ideas y formas",12
284,"Geometria de la tortuga",12
285,"Prolog",12
286,"El ordenador de quinta generacion",12
295,"Sistemas de bases de datos, administracion y uso",12
298,"Visual Foxpro 5",12
299,"Como programar en java",12
301,"El laboratorio de medios",12
302,"Todo lo que quiso saber sobre ACCESS",12
303,"Programacion orientada a objetos",12
Tabla autxlib
174,165,56
180,171,39
181,172,73
184,174,75
185,174,76
186,175,77
191,181,80
202,191,88
206,195,56
207,196,56
208,197,56
209,198,56
210,199,56
211,200,56
212,201,56
213,202,56
215,202,90
216,201,90
217,200,90
218,199,90
219,198,90
220,197,90
221,203,56
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 8
222,204,56
223,205,91
229,211,94
248,226,80
264,239,119
265,240,120
266,240,121
307,276,148
308,277,149
312,281,152
313,282,153
314,283,153
315,284,154
316,284,155
317,285,156
318,286,157
319,286,158
330,295,166
334,298,167
335,299,39
337,301,169
338,302,170
340,303,171
341,303,172
Los archivos de ejemplo estan en la seccion Downloads o directamente Aqui
http://disquisidor.com.ar/personal
1/12/2006 19:05:58 - 9
Descargar