postgres pgloader online mysql postgresql migration load-data-infile

pgloader - ¿Cambiar de MySQL a PostgreSQL-consejos, trucos y errores?



mysql to postgresql online (6)

Antes de convertir, configure su MySQL a rigurosidad ANSI iniciando el servidor con: --transaction-isolation = SERIALIZABLE --sql-mode = ANSI

Asegúrate de no estar usando tablas MyIsam.

MySQL permite muchas conversiones que no debería; pg requerirá un yeso.

Sus procs, funciones y activadores almacenados deberán ser reescritos. pg le ofrece una selección de idiomas para estos, pero debe instalar los idiomas; no es tan fácil de usar como MySQL.

pg solo permitirá en una lista de selección columnas que están en un grupo por o son agregados; MySQL hará trampa seleccionando el primer valor en el grupo si lo hace.

MySQL agrega un montón de extensiones: el operador no igual puede ser != Como en C, permite ''&&'' como sinónimo de ''y'', ''||'' para ''o'', etc. En particular, pg usa ''||'' para significar catenation de cuerda.

Básicamente, pg es bastante estrictamente ANSI, MySQL no lo es. Recomiendo encarecidamente que MySQL cumpla lo más estrictamente posible con ANSI antes de convertir a pg, luego verifique las advertencias cuando ejecute sus aplicaciones.

Estoy contemplando un cambio de MySQL a PostgreSQL.

¿Cuáles son sus consejos, trucos y errores para trabajar con PostgreSQL?

¿Qué debería buscar un MySQLer?

Ver también: ¿Qué tan diferente es PostgreSQL a MySQL?
Ver también: migrar de MySQL a PostgreSQL

Nota: no creo que esto sea un duplicado. En particular, el tipo de respuestas son bastante diferentes y las respuestas aquí tienen muchos más detalles de implementación, que es lo que estaba buscando


Podrías probar los errores de PostgreSQL que contienen los problemas más comunes. Generalmente, la documentación de PostgreSQL es bastante buena también, así que mantenla debajo de tu almohada también.

Además, la conversión de MySQL a PostgreSQL en la wiki de pgsql.


Va a ser una tarea enorme, ya que tendrá que probar toda su base de códigos, cada consulta, en cualquier lugar, para

  • Sintaxis
  • Comportamiento correcto (es decir, devuelve los mismos resultados)
  • Rendimiento: por ejemplo, ¿hay regresiones / mejoras de rendimiento y puede manejarlas?
  • Manejo de errores: no se comportan igual en condiciones de error, tal vez su código se basó en códigos de error específicos

Operacionalmente deberás mirar:

  • Copia de seguridad de restauracion
  • Utilización del espacio del disco
  • Utilización de la memoria
  • Una migración de datos única: podría ser una tarea que requiera mucho tiempo.
  • Plan de restitución para si falla
  • Monitoreo: ¿cómo está monitoreando su MySQL, y pueden esos métodos ser adaptados?
  • (Si es relevante) - replicación

Definitivamente tendrá que hacer grandes cantidades de pruebas de rendimiento antes de considerar tal movimiento.

Estos costos hacen que moverse a una base de datos diferente sea demasiado costosa para la mayoría de las aplicaciones no triviales. Considere los beneficios MUY cuidadosamente contra el vasto y vasto costo de hacer todo lo anterior.

Me sorprendería si te lleva menos de tres meses, en una aplicación no trivial, durante ese tiempo no podrás continuar el desarrollo regular.


Acabo de pasar por esto yo mismo, bueno, todavía lo soy ...

  • Texto sensible a mayúsculas
  • La falta de INSERT IGNORE and REPLACE
  • Lanzamiento explícito necesario casi en todas partes
  • Sin retrocesos
  • LOAD DATA INFILE ( COPY está cerca, pero no lo suficientemente cerca)
  • Cambiar autoincrement a SERIAL
  • Aunque la forma incorrecta en MySQL, en Postgres, una INNER JOIN sin una cláusula ON no puede suceder, use CROSS JOIN o similar
  • COUNT(*) puede ser loco lento
  • Las bases de datos están codificadas con conjuntos de caracteres, no tablas
  • Puede tener múltiples bases de datos, con múltiples esquemas (MySQL realmente tiene solo una base de datos y múltiples esquemas)
  • El particionamiento es diferente
  • interval MySQL vs. interval Postgres (para intervalos de tiempo)
  • Renombre de columna implícita, Postgres requiere AS
  • No se pueden actualizar varias tablas al mismo tiempo en Postgres
  • Las funciones de Postgres son poderosas. Entonces no hay CALL proc(); ; reescriba proc() como una función y SELECT proc(); .

Encontré esta secuencia de comandos que se conectará a su base de datos MySQL y su base de datos PostgreSQL y simplemente transfiero los contenidos. Funcionó como un encanto para mí.

https://github.com/philipsoutham/py-mysql2pgsql

Instalado por

$ pip install py-mysql2pgsql

correr

$ py-mysql2pgsql

en cualquier carpeta, y creará un archivo de configuración de plantilla para usted (mysql2pgsql.yml) que puede editar e ingresar los detalles de sus bases de datos.

Tuve que instalar argparse para que funcione.

$ pip install argparse

Cuando los detalles de su base de datos estén completos, simplemente ejecútelo de nuevo

$ py-mysql2pgsql

en la misma carpeta que el archivo de configuración, y wham, ya terminaste. No imprimió nada en la pantalla, pero mi base de datos se copió por completo después.


Aparte de mover la estructura de la base de datos, donde no puede evitar los ajustes manuales ...

El método más confiable para transferir datos (tabla por tabla, siempre que las estructuras sean las mismas):

mysql --default-character-set=utf8 -e "SELECT * FROM mytable" > mytable.txt psql /copy mytable from ''/path/to/mytable.txt'' WITH NULL AS ''NULL'';

He estado probando cualquier otro enfoque recientemente (como mysqldump con toneladas de opciones + sed, etc.), pero nada funcionó tan bien como este.

Este enfoque también permite cierta flexibilidad cuando se cambia la estructura a lo largo del camino; simplemente escriba un SELECT apropiado.