2009-04-21 7 views
32

Estoy contemplando un cambio de MySQL a PostgreSQL.Cambiar de MySQL a PostgreSQL: consejos, trucos y errores?

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

¿Qué debería buscar un MySQLer?

Consulte también: How different is PostgreSQL to MySQL?
Consulte también: Migrate from MySQL to PostgreSQL

Nota - No creo que esto es 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

+0

Solo una nota: esto en realidad no está relacionado con las noticias sobre Oracle y Sun. Tengo una aplicación Rails que necesita múltiples bases de datos y que busca usar esquemas PostgreSQL. –

+0

Ver: http://stackoverflow.com/questions/724867/how-different-is-postgresql-to-mysql – vartec

Respuesta

49

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

  • la caja de texto sensible
  • La falta de INSERT IGNORE y REPLACE
  • conversión explícita necesaria en casi todas partes
  • No hay acentos abiertos
  • LOAD DATA INFILE (COPY está cerca, pero no lo suficientemente cerca)
  • Cambio autoincrement a SERIAL
  • A pesar de la mala forma en MySQL, en Postgres, un INNER JOIN sin una cláusula de ON no puede suceder, utilice CROSS JOIN o similares
  • COUNT(*) puede ser locos lentos
  • bases de datos son codificados con juegos de caracteres, tablas no
  • Usted puede tener varias bases de datos, con varios esquemas (MySQL realmente tiene sólo una base de datos y el esquema múltiple)
  • particionamiento es diferente
  • MySQL vs intervalinterval Postgres (por intervalos de tiempo)
  • cambio de nombre de la columna implícita, Postgres requiere AS
  • No se puede actualizar varias tablas al mismo tiempo en Postgres
  • funciones Postgres son de gran alcance. Entonces no hay CALL proc();; reescriba proc() como una función y SELECT proc();.
+0

+1: ¿Autoincremento a serie? No hay secuencias como? –

+1

@OMG Ponies: en las versiones modernas de PG, no tiene que usar secuencias explícitamente para auto ID. Los tipos serial y bigserial ocultan la semántica de todo, pero debajo todavía hay secuencias y todo su poder. Crean una secuencia auto nombrada y establecen el valor predeterminado de la columna en nextval. – rfusca

+0

Vengo de Oracle, así que tengo una preferencia por las secuencias. ¿Cuándo se introdujo la funcionalidad serial/bigserial - 8.x? –

5

Antes de convertir, configurar su MySQL para ANSI-rigurosidad al iniciar el servidor con: --transaction-isolation = SERIALIZABLE --sql-mode = ANSI

Asegúrese de que usted no está utilizando tablas MyISAM.

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

Sus procs, funciones y activadores almacenados tendrán que 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 añade un montón de extensiones: la no-iguales operador puede ser != como en C, que 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.

9

Va a ser una tarea masiva que tendrá que poner a prueba su totalidad código base - cada consulta, en cualquier lugar, por

  • Sintaxis
  • comportamiento correcto (es decir, devuelve el mismos resultados)
  • Rendimiento - por ejemplo ¿Hay alguna regresión/mejora de rendimiento, y puede manejarlos?
  • El manejo de errores - no se comportan de la misma en condiciones de error, tal vez su código se basa en códigos de error específicos

vista operacional tendrá que tener en cuenta:

  • de copia de seguridad/restauración
  • la utilización del espacio de disco
  • la utilización de memoria
  • una sola vez la migración de datos - tarea podría ser un gran/tiempo
  • Rollback plan para si falla
  • Monitoreo - ¿Cómo se está monitoreando su MySQL, y se puede adaptar esos métodos
  • (si procede) - replicación

Definitivamente va a tener que hacer grandes cantidades de las pruebas de rendimiento antes de considerar tal movimiento.

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

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

+4

Este es un proyecto nuevo, por lo que no hay ningún costo en la migración en esta etapa. Pero este es todo un excelente consejo para su consideración. –

6

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

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

instalado por

$ pip install py-mysql2pgsql 

Run

$ py-mysql2pgsql 

en cualquier carpeta, y se creará una plantilla de archivo de configuración para usted (mysql2pgsql.yml) que se puede editar y ingrese los detalles de su base de datos en.

Tuve que instalar argpars e para que funcione

$ pip install argparse 

Cuando los datos de su base de datos se rellenan, basta con ejecutar de nuevo

$ py-mysql2pgsql 

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

+0

Acabo de descubrir que no pude agregar publicaciones o comentarios en mi foro (el software que usa la base de datos), pero se resolvió exportando la base de datos postgresql a un archivo, soltando y creando la base de datos, e importando el archivo. Quién sabe, podría haber tenido los permisos de usuario incorrectos para el usuario en mi test-db donde lo importé la primera vez .. – Dahlo

1

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

El método más fiable de transferencia de datos (mesa por mesa, siempre que las estructuras son 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.

Cuestiones relacionadas