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
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
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/
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.
ResponderEliminarNOTA: estoy utilizando SQL Server 2012 y la ultima versión de Postgress.
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!
Eliminarsin funciona con sql 2012. Comprobado!
ResponderEliminarBuenísimo Carlos! Gracias por el aporte! Y espero que te haya servido de ayuda, saludos!
EliminarHe migrado exitosamente! pero que podemos hacer con las tablas en la que los tipos son incoptibles porque esas no me las migró.
ResponderEliminarHola 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!
EliminarHola, 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.
ResponderEliminarEl 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!
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/
EliminarPero ahora me dice que: "Error: java.lang.Exception: Error de inicio de sesion del usuario 'sa'."
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!
Eliminaryo 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?? :/
ResponderEliminarHola 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
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola, cuando ejecuto en la linea de comandos de windows el archivo .bat me salta este error.
ResponderEliminarUnable to access jarfile lib/edb-migrationtoolkit.jar
A que se debe?
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!
EliminarBuenas disculpa he seguido los pasos y me sale de error conection reset por favor podrías ayudarme con este error
ResponderEliminarEn qué momento te sale el error? Hasta qué paso llegás? Sé mas específico así te puedo ayudar. Saludos
EliminarEn mi caso me sale en la consola cmd:
ResponderEliminarconn = null
sta con el usuario y contraseña de sqlserver ....
En qué momento te sale el error? Hasta qué paso llegás? Sé mas específico así te puedo ayudar. Saludos
EliminarMuchas gracias Javier Portaluppi.
ResponderEliminarTu manual me ayudo mucho en mi trabajo.
Sigue asi.
Saludos.
Muy bueno pude migrar todo mas de 11gb
ResponderEliminarHola! 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
ResponderEliminarHola 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!
EliminarEs necesario tener instalado SQL Server 2008 o 2012?
ResponderEliminarEs 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?
ResponderEliminarHola José, si es necesario tenes instaldo SQL Server, ya que a través del driver jdbc te conectas al motor. Saludos
EliminarEste comentario ha sido eliminado por el autor.
EliminarOk. Ya instale Microsoft® SQL Server® 2008 Express y su Management Studio Express
ResponderEliminary 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
Woooooooow!!! Lo resorví aqui esta la URL de mi solucion a mi problema particular:
ResponderEliminarhttps://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.
Me alegro José por tu solución y gracias por el aporte! Ahora lo agrego al post. Saludos!
EliminarBuenas y si solo quiero migrar algunos campos como:
ResponderEliminarusuarios, eventos pero en postgres la tabla que los contiene se llama diferente a la tabla de origen en sqlsrv?
Te recomiendo cambiarle luego el nombre, desde PostgreSQL. Saludos
Eliminarsi quiere migrar una sola tabla
ResponderEliminarSi 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
EliminarEste proceso de migración incluye los procedimientos almacenados?
ResponderEliminarsaludos
Pasando el parámtro -allTables solo realiza la migración de tablas. Saludos
Eliminartendras el parametro para migrar la base de datos completa con todo y store procedures,vistas y usuarios.
EliminarMe esta dando el siguiente error
ResponderEliminarC:\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.
Revisá la sintaxis el toolkit.properties, debés estar insertando algo mal. Saludos
ResponderEliminarestoy utilizando sql server 2005 expres pero no logro conectarme como lo prodria hacer puesto que necito migrar de sql server a postgres
ResponderEliminarHola me podrian ayudar estoy haciendo la migracion pero no pasan tablas ni nada y tampo sale ningun error gracias soy nuevo en esto.
ResponderEliminarC:\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
Agradezco su ayuda..lo mas pronto
ResponderEliminar
ResponderEliminarC:\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.
ResponderEliminarC:\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.
Me esta dando el siguiente error
ResponderEliminarC:\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
Hola! cómo corrijo este errror que me manda?
ResponderEliminarConnecting with source SQL Server database server...
MTK-11009: Error Connecting Database "SQL Server"
java.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver
C:\Program Files (x86)\edb\mtk\bin>runMTK.bat -sourcedbtype sqlserver -targetdbtype postgres -allTables -targetSchema public dbo
ResponderEliminarRunning 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
*************************************************************
Hola. He seguido el tutorial y no consigo hacerlo funcionar.
ResponderEliminarEl 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
Estimado Ariel pudiste solucionar ese error?
EliminarSolucionado: 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
ResponderEliminarPude hacer la migracion de una base en SQL 2008 a PostgreSQL 9.6 y PostgreSQL 10
Saludos a todos, no he podido lograr la conexión.
ResponderEliminarMi 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!
Hola, realice todos los pasos pero me sale este error:
ResponderEliminarjava.lang.ClassNotFoundException: net.sourceforge.jtds.jdbc.Driver
espero me puedas ayudar Gracias.