martes, 17 de marzo de 2009

Migrando de MSSQL2000 a PostgreSQL8.3

Hola, estoy ahora migrando una BD MicroSoft SQL 2000(MSSQL) a PostgreSQL 8.3 (PGSQL)..., la BD MSSQL tiene como principal caracteristica y que ha dado todo el trabajo, muchos Stores Procedures (SPs) asi que la dificl tarea de hacer esa migracion empezo ya.
Los sistemas que actualmente uso y se conectan al MSSQL2000 estan hechos en VisualBasic 6 y en Delphi 5, ya hice pruebas de conectividad y uso de PGSQL con estos lenguajes y todo bien usando el driver OleDB de Postgres (http://pgfoundry.org/projects/oledb/). Generar la cadena de conexion es muy sencillo, en todo caso un ejemplo seria:


CadConn = "Provider=PostgreSQL OLE DB Provider;" & _
"Password=mipassword;User ID=miusuario;" & _
"Data Source=localhost;Location=mibasededatos;Extended Properties='';"

El Unico detalle aqui es un problema del driver cuando uno lanza SQLs que devuelven registros, provoca un error de retorno, pero esto no sucede si se hace a traves de SPs.

Ok ahora si a las bases de datos; primero unos alcances: MSSQL usa como lenguaje de programacion Transact-SQL(T-SQL) y PostgreSQL PlPgSQL, para postgres no es el unico, se pueden instalar otros como java, c, etc ,etc. Pero el mas usado y casi por default es PLPGSQL. Asi que dare alguno tips para hacer esta tarea un poco mas sencilla.

Existe una herramienta que se llama SQLWays(http://www.ispirer.com/products) que ofrece hacer dicha migracion, es realmente util, pero siempre hay que revisar lo que ha migrado, ademas al hacer esta tarea de manera automatizada hay muchos SPs que no son optimos o que no se ejecutan.

Ok entonces vamos a los tips especificos

1. En PGSQL no existen "Procedimientos Almacenados" como tales, sino mas bien "Funciones Almacenadas", eso quiere decir que siempre estaremos obligados a devolver algo desde nuestros "SPs".

2. Declaracion de variables:

MSSQL: se usa la palabra DECLARE y el nombre debe empezar con el simbolo @ , por ejem:

DECLARE @mivar INT

PGSQL: se hace el estilo de C o de java, es decir identificador seguido del tipo de dato, por ejem:

mivar int;

3. Las asignaciones de valores a variables:

MSSQL: se usa SET , ejem:

SET @mivar=1.12

PGSQL: se usa el simbolo := , ejem:

mivar:=1.12;

4. Devolucion de registros o filas, uno de los mas importantes tips creo yo.

MSSQL: se hace el select directamente y punto, por ejem: :o)

create procedure consulta as
select * from mitabla

PGSQL: como dije anteriormente en PGSQL se usan "funciones Almacenadas" por lo que debemos indicar a nuestra funcion el tipo a devolver. Lo mejor es usar el tipo pg_catalog.refcursor, que creo que esta disponible recien desde la version 8.x de PGSQL.

CREATE OR REPLACE FUNCTION consulta() RETURNS "pg_catalog"."refcursor" AS
declare data refcursor;
begin
open data for (
Select * from mitabla
);
return data;
END;

5. Recorrer cursores dentro de los SPs.

MSSQL:

declare @v_1 varchar(10)
declare @v_2 varchar(10)
declare cur1 cursor for
select * from mitabla
OPEN cur1
FETCH NEXT FROM cur1
INTO @v_1, @v_2
WHILE @@FETCH_STATUS = 0 BEGIN
print 'Valor 1 '+v_1
print 'Valor 2 '+v_2
FETCH NEXT FROM cur1
INTO @v_1, @v_2
END
CLOSE cur1

PGSQL:

declare
cur1 refcursor;
v_1 varchar (10) ;
v_2 varchar (10) ;
begin
OPEN cur1 FOR execute('select * from mitabla');
loop
fetch cur1 into v_1, v_2;

if not found then
exit ;
end if;

RAISE NOTICE 'Valor 1(%)', v_1;
RAISE NOTICE 'Valor 2(%)', v_2;

end loop;
close cur1;
end;

* Existe otra forma de recorrer registros en PGSQL, pueden ver mas detalles en http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING.

6. Bueno este tip mas que de SPs, es para la carga de data, mis tablas en MSSQL son de millones de registros asi que la mejor manera de pasar la data del MSSQL a PGSQL es:

1ero. Bajar la data del MSSQL a texto plano, tipo csv, es decir valores separados por comas.
2do. Usar el comando COPY.. FROM de PGSSQL para cargar a data desde los arhivos de texto a las tablas de PGSQL.

Ok, es todo hasta ahora, si veo algo mas lo publicare o si alguien mas puede dar un aporte bienvenido.

5 comentarios:

  1. Hola, te cuento que esta muy interesante tú blog, te felicito...Tengo algunas preguntas, respecto a la migración que agradecería las comentes de ser posibles:

    1)Motivos de la migración?
    2)Es bastante volumen el que vas a migrar?
    3)Postrgres también acepta leguage sql muy parecido al de MS Sql Server, el pglsql, que vas utilizar se parece más al de oracle, porque utilizas el pglsql y no el sql que hay en las funciones?
    4)Podrías decir el apróximado de registros que vas a migrar
    5)Importante!
    Que rendimiento esperas de Postgres vs Ms sql server
    6)Importante!
    Cuando lo pongas en producción,sobre que sistema operativo lo vas a montar, y podrías comentar el hardware sobre utilizado, así como el tuning del pgconfig.conf que deberías hacer...

    ResponderEliminar
  2. Hola Pocho, gracias por tus comnetarios.. haber respondo tus preguntas de 1 en 1.

    1) Costos de licenciamiento de MSSQL.
    2) En gigas es aprox. 3 gigas de informacion.
    3) No es muy usado el len sql simple para hacer "funciones almacenadas" en postgres, hay mucha mas documentacion de PlpgSQL.
    4) El aprox. un poco dificil.. pero tengo como 4 tablas que van sobre los 3 millones de registros y una de 5 millones.
    5) Minimamente el mismo o mejor, antes habia trabajado con postgres en un sistema grande pero no desde una migracion. El 50% ya esta en produccion y han habido varios detalles a cubrir, y los comentare en un proximo post.
    6) Ya esta como dije en produccion el 50% en un Linux Centos 5, en un server hp proliant con procesador Xeon quad Core, 10 GB de ram y discos SAS en raid 5. Sobre el tuning de la base de datos ps no se ha hecho.. con la configuracion por default esta trabajando bien. Aun no llego a las 100 conexiones concurrentes q me limita la conf default asi q por ahora esta bien.. veremos en un futuro.

    Espero haber cubierto alguna de tus dudas, pero como te digo han habido varios detalles en el monto de ponerlo en produccion, pero mas por un tema de los drivers y del lenguaje cliente que en mi caso son Vb6 y delphi5. Ya los comentare en un prox post con las fomas de como lo hemos solucionado. Slds

    ResponderEliminar
  3. Amigo he leído tu blog y te felicito, se ve que haz invertido mucho tiempo en investigar y tus conclusiones ayudan a otros programadores, estoy pensando en migrar de Sql server 2000 a una base de datos open source, razones hay muchas empezando por la económica pero la que mas me motivaría es el desempenio de postgresql en comparación con MS Sql, que me puedes indicar al respecto.

    Saludos,

    Omar

    ResponderEliminar
  4. Hola.
    Has encontrado una herramienta o metodo para migrar los sp's a las funciones de Postgres?
    O tuviste que recodificar tus sp's?
    Gracias.

    ResponderEliminar
  5. Hola MArcelo, pues no no he encontrado una herramienta que haga al 100% la migracion, y com ya terminamos todo a mano nomas.. ya no segui indgando.. no se si ahora ya haya alguna.. suerte

    ResponderEliminar