Experimento con datos: migrando a postgreSQL (tercera parte)

Migrar datos desde mySQL hasta postgreSQL no es tan dificil, es sumamente facil; lo engorroso es en la DDL (data de definición), los CREATE TABLE son algo distintos en postgreSQL que en mysql, pero eso es algo que podemos solventar.

Migración de CNE desde mySQL hasta postgreSQL:
conectamos a mysql:
>mysql -u root -p
ejecutamos la conversion de sintaxis a ANSI postgresql:
mysql>set sql_mode = ‘ANSI,ANSI_QUOTES,IGNORE_SPACE,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_ZERO_DATE,PIPES_AS_CONCAT,REAL_AS_FLOAT,STRICT_ALL_TABLES’;
Query OK, 0 rows affected (0.00 sec)

usamos la base de datos CNE y consultamos la estructura de cada tabla:
mysql>use cne

mysql>show create table maisanta;

CREATE TABLE "maisanta" (
  "cedula" int(10) NOT NULL,
  "nacionalidad" char(1) NOT NULL,
  "nombre" varchar(128) NOT NULL,
  "cod_centro" int(10) NOT NULL,
  "direccion" text,
  "fecha_nac" date default NULL,
  "opositor" tinyint(1) unsigned NOT NULL default ‘0’,
  "telefono" varchar(50) default NULL,
  "abstencion" tinyint(1) unsigned NOT NULL default ‘0’,
  "firma_valida" tinyint(1) unsigned NOT NULL default ‘0’,
  "firma_rechazada" tinyint(1) unsigned NOT NULL default ‘0’,
  "fallecido" tinyint(1) unsigned NOT NULL default ‘0’,
  "mision_patriota" tinyint(1) unsigned NOT NULL default ‘0’,
  "mision_ribas" tinyint(1) unsigned NOT NULL default ‘0’,
  "mision_vuelvan" tinyint(1) unsigned NOT NULL default ‘0’,
  "contra_opo" tinyint(1) unsigned NOT NULL default ‘0’,
  PRIMARY KEY  ("cedula","nacionalidad"),
  KEY "idx_cedula" ("cedula")
)

debemos convertir todos los campos ANSI a campos PostgreSQL (si hubieran auto_increment, pasarlos a serial, los tinyint(1) a int2 y crear un constraint con cedula.

asi queda en postgresql:
tabla maisanta:
CREATE TABLE maisanta
(
  cedula int4 NOT NULL,
  nacionalidad char(1) NOT NULL,
  nombre varchar(128) NOT NULL,
  cod_centro int4 NOT NULL,
  direccion text,
  fecha_nac date,
  opositor int2 NOT NULL DEFAULT 0::smallint,
  telefono varchar(50),
  abstencion int2 NOT NULL DEFAULT 0::smallint,
  firma_valida int2 NOT NULL DEFAULT 0::smallint,
  firma_rechazada int2 NOT NULL DEFAULT 0::smallint,
  fallecido int2 NOT NULL DEFAULT 0::smallint,
  mision_patriota int2 NOT NULL DEFAULT 0::smallint,
  mision_ribas int2 NOT NULL DEFAULT 0::smallint,
  mision_vuelvan int2 NOT NULL DEFAULT 0::smallint,
  contra_opo int2 NOT NULL DEFAULT 0::smallint,
  CONSTRAINT maisanta_pkey PRIMARY KEY (cedula, nacionalidad)
)

la tabla electores queda asi:
CREATE TABLE "electores" (
  "nacionalidad" char(1) NOT NULL default ‘V’,
  "cedula" integer NOT NULL default ‘0’,
  "nombre" varchar(128) default ”,
  "cod_elector" varchar(50) default ‘0’,
  "fecha_nac" varchar(25) default ”,
  PRIMARY KEY  ("nacionalidad","cedula"),
  UNIQUE ("nacionalidad","cedula")
)

Ahora tenemos ambas tablas (electores y maisanta) creadas e indexadas en postgreSQL y en mySQL.

Ahora toca exportar los datos:
>mysqldump -uroot -p -c –compatible=postgresql –skip-opt -t -n cne > cnedump.sql

Hay que tomar en cuenta que ambos comandos toman tiempo (bastante tiempo); estamos hablando que maisanta cuenta con 12 millones de registros y electores del cne cuenta con 16 millones de registros.

Como verán, podemos exportar los datos en una forma casi "compatible" con postgreSQL; posteriormente respaldamos estos datos en postgreSQL:
>psql -U postgres < cnedump.sql
y posteriormente ejecutar el VACUMM ANALIZE
>vacuumdb -a -z

Tambien es posible pasar directamente un backup a postgreSQL sin necesidad de un archivo intermedio usando pipes:
>mysqldump -uroot -p -c –compatible=postgresql –skip-opt -t -n cne | psql -U postgres cne

Ahora, contaremos con dos bases de datos de grandes dimensiones para hacer los benchmarks respectivos (a priori, por el volumen de los datos, apuesto por postgreSQL, pero pueden haber sorpresas).

Notas informativas: Los originales CSV del CNE vienen de una DB posiblemente MS SQL Server u Oracle, el charset es bastante extraño y tiende a corromper algunos registros cuando lo llevas a UTF-8 tanto en mySQL como en postgreSQL.  (nota: cuando aprenderan?).

A la hora de la publicación de este artìculo todavia se estaban pasando los 16 millones de registros a postgreSQL, cuando terminen, realizaré y publicaré la cuarta parte, respuestas de consultas y operaciones con los datos.

Espero termine hoy …😛

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 13 mayo 2007 en Linux, PlanetaLinux. Añade a favoritos el enlace permanente. Deja un comentario.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: