lunes, 24 de junio de 2013

Cómo migrar de SQL Server (MS SQL) a PostgreSQL | Tablas + Datos | Tutorial paso a paso

"Luego de un largo período de inactividad y de depresión porque pensé que había perdido todos los screen shot del paso a paso que había hecho para este post, que fue lo que me llamó a armarme un blog, estoy de vuelta. Parece que mi escritorio estaba bastante desordenado porque al instalar Win8, mágicamente encontré una carpeta llamada IMG con todos los screen shot para este post, así que tomé valor para volver a escribir. 
Bueno, mucho bla bla, ahora vamos al grano. La verdad no encontré (o busqué muy mal) ningún sitio web que me explique cómo migrar de SQL Server a Postgres. El fin de este post no es explicar los motivos o razones para migrar (de eso hay mucho para ampliar, recomiendo leer SQL Server vs PostgreSQL, entre tantos otros), cada usuario tendrá lo suyo: postgres ofrece una mayor estabilidad, extensibilidad, es multiplataforma (corre en Win y Linux), otro tipo de licencia, no me gusta microsoft, etc. En fin, empecemos de una vez"

Siendo este un post destinado a un nivel intermedio-avanzado no me voy a detener en pasos sencillos como crear BD, manejar la consola de Windows, cambiar extensiones de archivo, etc. Existen otros tutoriales para eso.


Requisitos iniciales:

Tener instalada en el mismo Windows los motores SQL Server 2008 y PostgreSQL.

  • Descargar el driver JDBC de SQL Server (lo pueden hacer gratuitamente desde la página oficial de Microsft        - Driver JDBC SQL Server.
  • Descargar el Toolkit Migration de PostgreSQL, para lo cual comenzaré explicando la serie de pasos

Pasos:

Dentro del grupo de aplicaciones que nos instala PostgreSQL 9, encontramos Application Stack Builder,que nos permite agregar o quitar herramientas extras para manejar el motor. Lo ejecutamos:




Cliqueamos next y activamos el check de Migration Toolkit, para descargarlo e instalarlo debemos registrarnos en www.enterprisedb.com

 En la carpeta lib debemos copiar el driver JDBC de SQL Server que descargamos en pasos anteriores.
Antes que nada debemos crear una nueva base de datos (vacía) en PostgreSQL, será nuestro target, es decir, hacia donde se migrará la BD de SQL Server, nuestra BD destino.

Vista con PgAdmin

Ahora configuraremos los parámetros de conexión. Editaremos el archivo toolkit.properties con el bloc de notas o agregando la extensión .txt (recordar dejarlo con .properties).


Prestar atención a los parámetros, deben estar TAL CUAL, se ven en la siguiente imágen. Lo único que deben modificar son:

  • nombreBD: Nombre de la base de datos a migrar (en mi caso llamé a las de los dos motores por igual)
  • Usuarios y contraseñas source y target: Las dos conexiones deben estar autenticadas con usuario y contraseña (los usuarios y contraseñas por defecto de estos motores son lo que se muestran a continuación).


Abrimos la consola de Windows(Ejecutar cmd) y nos ubicamos en el path del migration toolkit.
Si tiramosun runMTK.bat -help veremos la ayuda de todos los parámetros posibles.

 Ahora bien los que usaremos para copiar tanto las tablas como los datos es el siguiente:

Ver últimas 2 líneas, lo anterior corresponde a otro proceso.

Pasado en limpio:


runMTK.bat -sourcedb type sqlserver -targetdbtype postgres -allTables -targetSchema public dbo

 Presionamos nuestro amigo el "enter" y...



 Más de 9400 filas han sido copiadas en la tabla turnohis!

Si señores, nuestra migración ha sido realizada con éxito. En este caso usé una base de prueba en SQL Server 2008 que contenía campos tinyint que no son permitidos en PostgreSQL, ya que quería mostrar el resúmen final. Por lo que de 168 tablas me migró 150, como vimos.
Podemos visualizar los resultados en los archivos log que se generan automáticamente...

Para corroborar, ejecutamos una consulta en nuestra base de datos destino, ya sea con PgAdmin o consola, como más les guste:



Felicidades! La migración ha sido exitosa. Tenemos nuestras tablas y datos en PostgreSQL!


Espero poder haber sido de ayuda, cualquier cosa me consultan.

Testeado con W7 - SQL Server 2008 - PostgreSQL

Saludos nerdianos!


--------------------------------------------------------------------------------------------------------
17/07/2014

Solución al error: java.lang.Exception: Network error IOException: Connection refused: connect

https://cgsrv1.arrc.csiro.au/blog/2010/05/24/java-sql-sqlexception-network-error-ioexception-connection-refused-connect-sql-express/

51 comentarios:

  1. Hola Amigo la verdad me resulto muy interesante esta forma de poder migrar la base de datos, pero resulta que segui los pasos correspondiente pero me sale una excepción en el nombre del servidor en el "icom-server" eh puesto tal y como tu lo has especificado.Espero puedas resolver el porque me sale ese error. Gracias.
    NOTA: estoy utilizando SQL Server 2012 y la ultima versión de Postgress.

    ResponderEliminar
    Respuestas
    1. Hola Jesús! Disculpá la demora en responder, recién leo tu comentario. Te cuento, "icom-server" es el nombre del servidor que utilicé como ejemplo. En tu caso tendrías que poner el nombre de tu servidor SQL Server. La verdad no lo probé con SQL Server 2012, pero en una de esas funciona! Avisame si así es así lo publicamos. Cualquier duda me escribes de vuelta. Un Abrazo!

      Eliminar
  2. sin funciona con sql 2012. Comprobado!

    ResponderEliminar
    Respuestas
    1. Buenísimo Carlos! Gracias por el aporte! Y espero que te haya servido de ayuda, saludos!

      Eliminar
  3. He migrado exitosamente! pero que podemos hacer con las tablas en la que los tipos son incoptibles porque esas no me las migró.

    ResponderEliminar
    Respuestas
    1. Hola Josue! Lo que podrías es hacer es transformar en SQL Server esos tipos de datos a otros que sean compatibles con PostgreSQL y recién ahí hacer la migración! Espero que te sirva. Saludos!

      Eliminar
  4. Hola, muy interesante, pero a mí me sale un error, (el mismo error siempre) y he intentado cambiando nombres del servidor, contraseñas, nombres de las bases, pero siempre da el mismo error en el cmd al intentar la conexión con SQL server.

    El error que muestra es:

    "Error: java.lang.Exception: Network error IOException: Connection refused: connect"

    ¿Qué puedo estar haciendo mal?, ¡te estaré muy agradecido si puedes ayudarme!

    ResponderEliminar
    Respuestas
    1. Hola nuevamente, ya corregí ese error https://cgsrv1.arrc.csiro.au/blog/2010/05/24/java-sql-sqlexception-network-error-ioexception-connection-refused-connect-sql-express/

      Pero ahora me dice que: "Error: java.lang.Exception: Error de inicio de sesion del usuario 'sa'."

      Eliminar
    2. Hola Ricardo! Te aseguraste que tu usuario y contraseña de SQL Server sean 'sa'. Quizás los cambiaste...En src_db_user y en src_db_password del toolkit.properties van las credenciales para conectarte a tu motor source (en este caso tu sql server).Chequeá eso y avisame. Saludos!

      Eliminar
  5. yo ya verifique que el usuario y la contraseña sean las que ubique en el archivo, pero me sale lo mismo "Error: java.lang.Exception: Error de inicio de sesion del usuario 'sa'.".. que podria ser?? :/

    ResponderEliminar
    Respuestas
    1. Hola Katherine, verificá que tu SQL Server no se autentique con windows. Es un error con la sesión a tu motor SQLServer. Te estás logrando conectar a SQL Server con esos parámetros que ingresás en el toolkit.properties? Que versión de SQL Server usás? Saludos

      Eliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. Hola, cuando ejecuto en la linea de comandos de windows el archivo .bat me salta este error.
    Unable to access jarfile lib/edb-migrationtoolkit.jar

    A que se debe?

    ResponderEliminar
    Respuestas
    1. Hola Caro, acordate antes de tirar el bat de posicionarte en el path del migration toolkit. Me parece que es porque no está encontrando el archivo .jar. Cualquier cosa me avisas, saludos!

      Eliminar
  8. Buenas disculpa he seguido los pasos y me sale de error conection reset por favor podrías ayudarme con este error

    ResponderEliminar
    Respuestas
    1. En qué momento te sale el error? Hasta qué paso llegás? Sé mas específico así te puedo ayudar. Saludos

      Eliminar
  9. En mi caso me sale en la consola cmd:
    conn = null

    sta con el usuario y contraseña de sqlserver ....

    ResponderEliminar
    Respuestas
    1. En qué momento te sale el error? Hasta qué paso llegás? Sé mas específico así te puedo ayudar. Saludos

      Eliminar
  10. Muchas gracias Javier Portaluppi.
    Tu manual me ayudo mucho en mi trabajo.

    Sigue asi.

    Saludos.

    ResponderEliminar
  11. Muy bueno pude migrar todo mas de 11gb

    ResponderEliminar
  12. Hola! Excelente tu manual, me ayudará mucho con una migración que debo realizar. Pero tengo una pregunta, tienes idea de como indicarle al archivo . properties que la migración es de SQL server a PostgreSQL pero en diferentes servidores? Es decir, que no sea local

    ResponderEliminar
    Respuestas
    1. Hola Orsire. Sí. Eso lo modificás en la URL, tanto del target como del source. En vez de escribir "localhost" escribes el dominio o la IP de tus servidores. Espero que te sirva. Saludos!

      Eliminar
  13. Es necesario tener instalado SQL Server 2008 o 2012?

    ResponderEliminar
  14. Es necesario tener instalado SQL Server 2008 o 2012? Aclarame esto. Por que solo tengo instalado pgAdmin III y la base de datos postgres 9. No es suficiente con el archivo que descargue de Microsoft? O es necesario tener instalado SQL Server 2008 o 2012?

    ResponderEliminar
    Respuestas
    1. Hola José, si es necesario tenes instaldo SQL Server, ya que a través del driver jdbc te conectas al motor. Saludos

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  15. Ok. Ya instale Microsoft® SQL Server® 2008 Express y su Management Studio Express

    y pude crear el login "qw" con clave "qw" en servidor "localhost" con autenticacion de SQL no de Windows y logro entrar muy bien. Pero con el login "sa' con clave "sa" con el mismo servidor no lo logro . Ok eso es en cuanto a SQL.

    Cuando ejecuto las lineas de comando indicadas por usted me genera el siguiente error:

    Source database connectivity info...
    conn =jdbc:jtds:sqlserver://localhost/basededatosfuente
    user =qw
    password=******
    Target database connectivity info...
    conn =jdbc:postgresql://localhost:5432/basededatosobjetivo
    user =postgres
    password=******
    Connecting with source SQL Server database server...
    Error: java.lang.Exception: Network error IOException: Connection refused: connect
    Stack Trace:
    java.sql.SQLException: java.lang.Exception: Network error IOException: Connection refused: connect
    at com.edb.MigrationToolkit.initToolkit(MigrationToolkit.java:2624)
    at com.edb.MigrationToolkit.main(MigrationToolkit.java:1279)

    One or more schema objects could not be imported during the migration process. Please review the migration output for more details.

    Migration logs have been saved to C:\Users\Jose Peña\.enterprisedb\migration-toolkit\logs

    ******************** Migration Summary ********************

    Total objects: 0
    Successful count: 0
    Failure count: 0

    *************************************************************

    la configuracion del Toolkit.properties es:

    SRC_DB_URL=jdbc:jtds:sqlserver://localhost/basededatosfuente
    SRC_DB_USER=qw
    SRC_DB_PASSWORD=qw
    TARGET_DB_URL=jdbc:postgresql://localhost:5432/basededatosobjetivo
    TARGET_DB_USER=postgres
    TARGET_DB_PASSWORD=postgres

    ResponderEliminar
  16. Woooooooow!!! Lo resorví aqui esta la URL de mi solucion a mi problema particular:

    https://cgsrv1.arrc.csiro.au/blog/2010/05/24/java-sql-sqlexception-network-error-ioexception-connection-refused-connect-sql-express/


    A Ricardo Lopez (más arriba) le ocurrió lo mismo.

    Saludos y gracias a todos.

    ResponderEliminar
    Respuestas
    1. Me alegro José por tu solución y gracias por el aporte! Ahora lo agrego al post. Saludos!

      Eliminar
  17. Buenas y si solo quiero migrar algunos campos como:
    usuarios, eventos pero en postgres la tabla que los contiene se llama diferente a la tabla de origen en sqlsrv?

    ResponderEliminar
    Respuestas
    1. Te recomiendo cambiarle luego el nombre, desde PostgreSQL. Saludos

      Eliminar
  18. Respuestas
    1. Si mal no recuerdo, en vez de -allTables hay que pasarle el nombre de la/s tabla/s. Por favor , si no estoy en lo correcto que alguien me corrija. Saludos

      Eliminar
  19. Este proceso de migración incluye los procedimientos almacenados?

    saludos

    ResponderEliminar
    Respuestas
    1. Pasando el parámtro -allTables solo realiza la migración de tablas. Saludos

      Eliminar
    2. tendras el parametro para migrar la base de datos completa con todo y store procedures,vistas y usuarios.

      Eliminar
  20. Me esta dando el siguiente error

    C:\Program Files (x86)\PostgresPlus\EnterpriseDB-MigrationToolkit>runMTK.bat -so
    urcedb type sqlserver -targetdbtype postgres -allTables -targetSchema public dbo


    You have specified invalid command-line arguments. Run runMTK -help to see the u
    sage details.


    ResponderEliminar
  21. Revisá la sintaxis el toolkit.properties, debés estar insertando algo mal. Saludos

    ResponderEliminar
  22. estoy utilizando sql server 2005 expres pero no logro conectarme como lo prodria hacer puesto que necito migrar de sql server a postgres

    ResponderEliminar
  23. Hola me podrian ayudar estoy haciendo la migracion pero no pasan tablas ni nada y tampo sale ningun error gracias soy nuevo en esto.


    C:\Program Files (x86)\PostgresPlus\EnterpriseDB-MigrationToolkit>runMTK.bat -so
    urcedbtype sqlserver -targetdbtype postgres -allTables public migracion
    Source database connectivity info...
    conn =jdbc:jtds:sqlserver://localhost/ZINA2
    user =sa
    password=******
    Target database connectivity info...
    conn =jdbc:postgresql://localhost:5432/ZINA2
    user =postgres
    password=******
    Connecting with source SQL Server database server...
    Connecting with target Postgres database server...
    Importing sql server schema migracion...
    Creating Schema...migracion

    Schema migracion imported successfully.


    Migration process completed successfully.

    Migration logs have been saved to C:\Users\Administrador\.enterprisedb\migration
    -toolkit\logs

    ******************** Migration Summary ********************

    Total objects: 0
    Successful count: 0
    Failure count: 0

    ResponderEliminar

  24. C:\Program Files (x86)\PostgresPlus\EnterpriseDB-MigrationToolkit>runMTK.bat -so
    urcedb type sqlserver -targetdbtype postgres -allTables -targetSchema public dbo


    You have specified invalid command-line arguments. Run runMTK -help to see the u
    sage details.

    ResponderEliminar

  25. C:\Program Files (x86)\PostgresPlus\EnterpriseDB-MigrationToolkit>runMTK.bat -so
    urcedb type sqlserver -targetdbtype postgres -allTables -targetSchema public dbo


    You have specified invalid command-line arguments. Run runMTK -help to see the u
    sage details.

    ResponderEliminar
  26. Me esta dando el siguiente error

    C:\Program Files (x86)\PostgresPlus\EnterpriseDB-MigrationToolkit>runMTK.bat -so
    urcedb type sqlserver -targetdbtype postgres -allTables -targetSchema public dbo


    You have specified invalid command-line arguments. Run runMTK -help to see the u
    sage details.

    Y ya comprobe todos los campos estan totalmente iguales, claramente especificado los datos y nombres de mi servidores y base de datos

    ResponderEliminar
  27. Hola! cómo corrijo este errror que me manda?

    Connecting with source SQL Server database server...
    MTK-11009: Error Connecting Database "SQL Server"
    java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver

    ResponderEliminar
  28. C:\Program Files (x86)\edb\mtk\bin>runMTK.bat -sourcedbtype sqlserver -targetdbtype postgres -allTables -targetSchema public dbo
    Running EnterpriseDB Migration Toolkit (Build 50.0.1) ...
    Source database connectivity info...
    conn =jdbc:jtds:sqlserver://192.168.231.177,49250/PCENTER_91200
    user =informat
    password=******
    Target database connectivity info...
    conn =jdbc:postgresql://192.168.231.177:5432/inet_pg
    user =informat
    password=******
    Connecting with source SQL Server database server...
    MTK-11009: Error Connecting Database "SQL Server"
    java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver

    One or more schema objects could not be imported during the migration process. P
    lease review the migration output for more details.

    Migration logs have been saved to C:\Users\jvillagran.INFODESARROLLO\.enterprise
    db\migration-toolkit\logs

    ******************** Migration Summary ********************

    Total objects: 0
    Successful count: 0
    Failed count: 0
    Invalid count: 0

    *************************************************************

    ResponderEliminar
  29. Hola. He seguido el tutorial y no consigo hacerlo funcionar.
    El error que tengo es el siguiente:
    "Connecting with target Postgres database server...
    Exception in thread "main" java.lang.NoClassDefFoundError: org/postgresql/Driver
    at com.edb.dbhandler.postgresql.PGConnection.(PGConnection.java:32)
    at com.edb.common.MTKFactory.createMTKConnection(MTKFactory.java:241)
    at com.edb.MigrationToolkit.createNewTargetConnection(MigrationToolkit.java:6362)
    at com.edb.MigrationToolkit.initToolkit(MigrationToolkit.java:3560)
    at com.edb.MigrationToolkit.main(MigrationToolkit.java:1819)
    Caused by: java.lang.ClassNotFoundException: org.postgresql.Driver
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 5 more "

    Alguna Sugerencia?????

    Desde ya muchas gracias

    ResponderEliminar
  30. Solucionado: el problema era que en el archivo edbmtk-51.config, esta JAVA_EXECUTABLE_PATH="C:\Program Files (x86)\Java\jdk1.8.0_171\jre\bin\java.exe" , pero en mi pc la variable de entorno JAVA_HOME apunta a: C:\Program Files\Java\jdk1.8.0_171, tengo instalado Java para x86 y x64, colocando el driver: postgresql-42.2.2.jar en la ruta del x86 funcionó, aqui: C:\Program Files (x86)\Java\jdk1.8.0_171\jre\lib\ext
    Pude hacer la migracion de una base en SQL 2008 a PostgreSQL 9.6 y PostgreSQL 10

    ResponderEliminar
  31. Saludos a todos, no he podido lograr la conexión.

    Mi archivo toolkit.properties es:

    SRC_DB_URL=jdbc:jtds:sqlserver://127.0.0.1:1433/DB_ORIGEN
    SRC_DB_USER=sa
    SRC_DB_PASSWORD=password
    TARGET_DB_URL=jdbc:postgresql://localhost:5432/DB_DESTINO
    TARGET_DB_USER=postgresql
    TARGET_DB_PASSWORD=password

    Mi BD es un SQL Express 2017 en mi pc.
    He probado cambiando en el SRC_DB_URL, pero sin resultados.
    He seguido los pasos y las recomendaciones, incluso de los comentarios, pero me sigue saliendo el mismo error:

    *************************************************************

    2020-02-28 13:35:05 Connecting with source SQL Server database server...
    2020-02-28 13:35:06 MTK-11009: Error Connecting Database "SQL Server"
    DB-08S01: java.sql.SQLException: Network error IOException: Connection refused: connect
    java.net.ConnectException: Connection refused: connect
    2020-02-28 13:35:06 Stack Trace:
    com.edb.MTKException: MTK-11009: Error Connecting Database "SQL Server"
    at com.edb.common.MTKFactory.createMTKConnection(MTKFactory.java:276)
    at com.edb.MigrationToolkit.createNewSourceConnection(MigrationToolkit.java:6543)
    at com.edb.MigrationToolkit.initToolkit(MigrationToolkit.java:3603)
    at com.edb.MigrationToolkit.main(MigrationToolkit.java:1882)
    Caused by: java.sql.SQLException: Network error IOException: Connection refused: connect
    at net.sourceforge.jtds.jdbc.JtdsConnection.(JtdsConnection.java:436)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at com.edb.common.JTDSConnection.(JTDSConnection.java:50)
    at com.edb.common.MTKFactory.createMTKConnection(MTKFactory.java:274)
    ... 3 more
    Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:606)
    at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:288)
    at net.sourceforge.jtds.jdbc.SharedSocket.(SharedSocket.java:251)
    at net.sourceforge.jtds.jdbc.JtdsConnection.(JtdsConnection.java:331)

    *************************************************************

    Espero me puedan apoyar, gracias de antemano!

    ResponderEliminar
  32. Hola, realice todos los pasos pero me sale este error:
    java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver

    espero me puedas ayudar Gracias.

    ResponderEliminar