volcado una que postgres pasar migrar datos mysql postgresql

que - pasar una base de datos de mysql a postgres



Importar volcado de MySQL a la base de datos PostgreSQL (15)

Mac OS X

brew update && brew install pgloader pgloader mysql://user@host/db_name postgresql://user@host/db_name

¿Cómo puedo importar un volcado "xxxx.sql" de MySQL a una base de datos PostgreSQL?


Al igual que con la mayoría de las migraciones de bases de datos, realmente no hay una solución de corte y secado.

Estas son algunas ideas para tener en cuenta al realizar una migración:

  1. Los tipos de datos no van a coincidir. Algunos lo harán, otros no. Por ejemplo, los bits de SQL Server (booleano) no tienen un equivalente en Oracle.
  2. Las secuencias de claves primarias se generarán de manera diferente en cada base de datos.
  3. Las claves foráneas apuntarán a tus nuevas secuencias.
  4. Los índices serán diferentes y probablemente será necesario modificarlos.
  5. Cualquier procedimiento almacenado deberá ser reescrito.
  6. Esquemas Mysql no los usa (al menos no desde que lo he usado), Postgresql los usa. No pongas todo en el esquema público. Es una mala práctica, pero la mayoría de las aplicaciones (Django viene a la mente) que son compatibles con Mysql y Postgresql intentarán hacer que uses el esquema público.
  7. Migración de datos. Vas a tener que insertar todo desde la base de datos antigua a la nueva. Esto significa deshabilitar claves primarias y externas, insertar los datos y luego habilitarlos. Además, todas sus nuevas secuencias deberán restablecerse a la ID más alta en cada tabla. Si no, el siguiente registro que se inserta fallará con una violación de la clave principal.
  8. Reescriba su código para trabajar con la nueva base de datos. Debería funcionar pero probablemente no lo hará.
  9. No olvides los disparadores. Utilizo los activadores de fecha de creación y actualización en la mayoría de mis tablas. Cada db los ubica un poco diferente.

Ten esto en cuenta. La mejor manera es escribir una utilidad de conversión. ¡Que tengas una feliz conversión!


Aquí hay un programa simple para crear y cargar todas las tablas en una base de datos mysql (honey) para postgresql. La conversión de tipos desde mysql es de grano grueso pero se refina fácilmente. Tendrás que recrear los índices manualmente:

import MySQLdb from magic import Connect #Private mysql connect information import psycopg2 dbx=Connect() DB=psycopg2.connect("dbname=''honey''") DC=DB.cursor() mysql=''''''show tables from honey'''''' dbx.execute(mysql); ts=dbx.fetchall(); tables=[] for table in ts: tables.append(table[0]) for table in tables: mysql=''''''describe honey.%s''''''%(table) dbx.execute(mysql); rows=dbx.fetchall() psql=''drop table %s''%(table) DC.execute(psql); DB.commit() psql=''create table %s (''%(table) for row in rows: name=row[0]; type=row[1] if ''int'' in type: type=''int8'' if ''blob'' in type: type=''bytea'' if ''datetime'' in type: type=''timestamptz'' psql+=''%s %s,''%(name,type) psql=psql.strip('','')+'')'' print psql try: DC.execute(psql); DB.commit() except: pass msql=''''''select * from honey.%s''''''%(table) dbx.execute(msql); rows=dbx.fetchall() n=len(rows); print n; t=n if n==0: continue #skip if no data cols=len(rows[0]) for row in rows: ps='', ''.join([''%s'']*cols) psql=''''''insert into %s values(%s)''''''%(table, ps) DC.execute(psql,(row)) n=n-1 if n%1000==1: DB.commit(); print n,t,t-n DB.commit()


Esta pregunta es un poco vieja, pero hace unos días estaba tratando con esta situación y encontré pgloader.io .

Esta es la forma más fácil de hacerlo, necesita instalarlo y luego ejecutar un simple script lisp ( script.lisp ) con las siguientes 3 líneas:

/* content of the script.lisp */ LOAD DATABASE FROM mysql://dbuser@localhost/dbname INTO postgresql://dbuser@localhost/dbname; /*run this in the terminal*/ pgloader script.lisp

Y después de eso, su base de datos postgresql tendrá toda la información que tenía en su MySQL SB.

En una nota al margen, asegúrese de compilar pgloader ya que en el momento de esta publicación, el instalador tiene un error. (versión 3.2.0)


Hace poco tuve que hacer esto con muchos archivos .sql grandes de aproximadamente 7 GB de tamaño. Incluso VIM tuvo problemas para editar esos. Su mejor apuesta es importar el .sql a MySql y luego exportarlo como un csv que luego puede importarse a Postgres.

Sin embargo, la exportación de MySQL como CSV es tremendamente lenta, ya que ejecuta la selección * de su consulta de tabla . Si tiene una base de datos / tabla grande, sugeriría usar algún otro método. Una forma es escribir un script que lea las inserciones de sql línea por línea y use la manipulación de cadenas para reformatearlas a las declaraciones de inserción "compatibles con Postgres" y luego ejecutar estas declaraciones en Postgres.


La forma más rápida (y más completa) que encontré fue usar Kettle. Esto también generará las tablas necesarias, convertirá los índices y todo lo demás. El argumento de compatibilidad mysqldump no funciona.

Los pasos:

  1. Descargue Pentaho ETL desde http://kettle.pentaho.org/ (versión de la comunidad)

  2. Descomprima y ejecute Pentaho (spoon.sh/spoon.bat dependiendo de unix / windows)

  3. Crear un nuevo trabajo

  4. Cree una conexión de base de datos para la fuente MySQL (Herramientas -> Asistente -> Crear conexión de base de datos)

  5. Cree una conexión de base de datos para la fuente PostgreSQL (como arriba)

  6. Ejecute el asistente Copy Tables (Herramientas -> Asistente -> Copiar tablas)

  7. Ejecutar el trabajo


Mac / Win

Descargue la versión de prueba de Navicat durante 14 días (no entiendo $ 1300) - paquete empresarial completo:

Conectar ambas bases de datos mysql y postgres.

menú - herramientas - transferencia de datos

Conecte ambos dbs en esta primera pantalla. Si bien aún está en esta pantalla, hay una / opciones generales - debajo de las opciones de verificación en el lado derecho - continuar en caso de error * nota que probablemente desee desmarcar el índice y las teclas de la izquierda ... puede reasignarlas fácilmente en Postgres.

¡Al menos consigue tus datos de MySQL en Postgres!

¡espero que esto ayude!


No es posible importar un volcado de Oracle (binario) a PostgreSQL.

Si el volcado de MySQL está en un formato de SQL simple, deberá editar el archivo para que la sintaxis sea correcta para PostgreSQL (por ejemplo, elimine el presupuesto de comillas no estándar, elimine la definición del motor para las sentencias CREATE TABLE, ajuste los tipos de datos y mucho de otras cosas)


No esperes que funcione sin editar. Tal vez un montón de edición.

mysqldump tiene un argumento de compatibilidad , --compatible=name , donde "nombre" puede ser "oracle" o "postgresql", pero eso no garantiza la compatibilidad. Creo que las configuraciones del servidor como ANSI_QUOTES también tienen algún efecto.

Obtendrá más ayuda útil aquí si incluye el comando completo que utilizó para crear el volcado, junto con los mensajes de error que recibió en lugar de decir "Nada me funcionó".




Puedes usar pgloader.

sudo apt-get install pgloader

Utilizando:

pgloader mysql://user:pass@host/database postgresql://user:pass@host/database


Tengo este script de bash para migrar los datos, no crea las tablas porque se crean en los scripts de migración, por lo que solo necesito convertir los datos. Utilizo una lista de las tablas para no importar datos de las tablas de migrations y sessions . Aquí está, solo probado:

#!/bin/sh MUSER="root" MPASS="mysqlpassword" MDB="origdb" MTABLES="car dog cat" PUSER="postgres" PDB="destdb" mysqldump -h 127.0.0.1 -P 6033 -u $MUSER -p$MPASS --default-character-set=utf8 --compatible=postgresql --skip-disable-keys --skip-set-charset --no-create-info --complete-insert --skip-comments --skip-lock-tables $MDB $MTABLES > outputfile.sql sed -i ''s/UNLOCK TABLES;//g'' outputfile.sql sed -i ''s/WRITE;/RESTART IDENTITY CASCADE;/g'' outputfile.sql sed -i ''s/LOCK TABLES/TRUNCATE/g'' outputfile.sql sed -i "s/''0000/-00/-00 00/:00/:00''/NULL/g" outputfile.sql sed -i "1i SET standard_conforming_strings = ''off'';/n" outputfile.sql sed -i "1i SET backslash_quote = ''on'';/n" outputfile.sql sed -i "1i update pg_cast set castcontext=''a'' where casttarget = ''boolean''::regtype;/n" outputfile.sql echo "/nupdate pg_cast set castcontext=''e'' where casttarget = ''boolean''::regtype;/n" >> outputfile.sql psql -h localhost -d $PDB -U $PUSER -f outputfile.sql

Recibirá muchas advertencias que puede ignorar de manera segura como esta:

psql:outputfile.sql:82: WARNING: nonstandard use of escape in a string literal LINE 1: ...,(1714,38,2,0,18,131,0.00,0.00,0.00,0.00,NULL,''{/"prospe... ^ HINT: Use the escape string syntax for escapes, e.g., E''/r/n''.


Use su archivo xxx.sql para configurar una base de datos MySQL y hacer uso de FromMysqlToPostrgreSQL . Muy fácil de usar, configuración corta y funciona a la perfección. Importa su base de datos con el conjunto de claves primarias, claves externas e índices en las tablas. Incluso puede importar datos solo si configura el indicador apropiado en el archivo de configuración.

La herramienta de migración FromMySqlToPostgreSql de Anatoly Khaytovich, proporciona una migración precisa de datos de tabla, índices, PK, FK ... Hace un uso extensivo del protocolo COPY de PostgreSQL.

Vea aquí también: PG Wiki Page


Para aquellos Googlers que están en 2015+ .
He perdido todo el día en esto y me gustaría resumir las cosas.

He probado todas las soluciones descritas en this artículo por Alexandru Cotioras (que está lleno de desesperación). De todas las soluciones mencionadas solo una funcionó para mí.

- lanyrd / mysql-postgresql-converter @ github.com (Python)

Pero esto solo no va a hacer. Cuando importará su nuevo archivo de volcado convertido:

# /i ~/Downloads/mysql-postgresql-converter-master/dump.psql

PostgreSQL le informará sobre los tipos desordenados de MySQL :

psql:/Users/jibiel/Downloads/mysql-postgresql-converter-master/dump.psql:381: ERROR: type "mediumint" does not exist LINE 2: "group_id" mediumint(8) NOT NULL DEFAULT ''0'',

Así que tendrás que arreglar esos tipos manualmente según this tabla.

En resumen es:

tinyint(2) -> smallint mediumint(7) -> integer # etc.

Puedes usar regex y cualquier editor genial para hacerlo.

MacVim + Substitute :

:%s!tinyint(/w/+)!smallint!g :%s!mediumint(/w/+)!integer!g