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
andREPLACE
- Lanzamiento explícito necesario casi en todas partes
- Sin retrocesos
-
LOAD DATA INFILE
(COPY
está cerca, pero no lo suficientemente cerca) - Cambiar
autoincrement
aSERIAL
- Aunque la forma incorrecta en MySQL, en Postgres, una
INNER JOIN
sin una cláusulaON
no puede suceder, useCROSS 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();
; reescribaproc()
como una función ySELECT 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.