Cómo migrar un servidor de base de datos MySQL Server a un servidor de base de datos PostgreSQL. Explicamos cómo convertir manualmente un fichero de script SQL generado con mysqldump para ser ejecutado y exportado a PostgreSQL. Explicamos cómo hacer la copia de seguridad en MySQL y cómo importarla (tras su adaptación) a PostgreSQL. Mostramos una tabla de correspondencias entre tipos de datos MySQL y PostgreSQL.

¿Por qué migrar de MySQL Server a PostgreSQL? MySQL vs PostgreSQL

Existen multitud de motivos para cambiar nuestro motor de base de datos de MySQL Server a PostgreSQL. A continuación expondremos algunos de ellos. Aunque hay que hacerlo con precaución y conocimiento de causa, pues es un paso importante y delicado.

No existe un motor de base de datos mejor que otro, existe nuestro entorno y el motor de base de datos que mejor se adapte a él, según nuestras exigencias. Por lo que la decisión de migrar de un motor de base de datos a otro es muy personal.

PostgreSQL es un motor de base de datos mucho más robusto que MySQL, posee una estructura al estilo de Oracle y es Open Source y gratuita, con licencia GPL. En cambio MySQL tiene un sistema de licenciamiento dual, posee una parte privada y otra GPL. Si bien MySQL es un proyecto Open Source, desde su adquisición por parte de Oracle se ha parado bastante. Casi no salen nuevas versiones ni mejoras.

Algunas de las ventajas (pros) de PostgreSQL:

  • Ejecución eficaz tanto de SQL estático (por ejemplo, PHP) como de SQL parametrizado (por ejemplo, de Java).
  • Optimizador avanzado basado en costo, con opciones de planes de ejecución y recopilación de estadísticas para personalización.
  • Indexación parcial, funcional, de múltiples índices combinados, con cuatro tipos de índice diferentes.
  • Sistema de compresión de datos TOAST (The Oversized-Attribute Storage Technique).
  • Gran escalabilidad al ampliar el número de procesadores o la memoria RAM.
  • Soporta rollback, subconsultas, transacciones y control de integridad referencial.
  • Soporta triggers y procedimientos almacenados.
  • Soporta tipos de datos para sistemas SIG ó GIS (Sistema de Información Geográfica).
  • Tiene licencia BSD, mucho más permisiva que la GPL.
  • El desarrollo de PostgreSQL no está controlado por una empresa, sino que es dirigido por una comunidad de desarrolladores que trabajan de forma desinteresada, altruista, libre y/o apoyados por organizaciones comerciales. Es un proyecto en contínua actualización, lanzando nuevas versiones con muchas mejoras cada cierto tiempo.
  • Posee casi todas las características de otros motores de base de datos comerciales como Oracle, Microsoft SQL Server, Informix.
  • Utiliza control de concurrencia multi-versión.
  • Totalmente conforme a ACID (Atomicity, Consistency, Isolation and Durability: Atomicidad, Consistencia, Aislamiento y Durabilidad) en sus transacciones.

Algunos inconvenientes (contras) de PostgreSQL:

  • Consume bastantes recursos en el equipo donde se instala.
  • Es más lento en consultas SELECT que MySQL, aunque no en todos los casos y configuraciones.

Para el caso de MySQL, exponemos algunas de sus ventajas (pros):

  • En determinadas configuraciones con el motor MyISAM puede ser muy rápido, sobre todo en consultas SELECT.
  • Soporta múltiples motores de almacenamiento: MyISAM, Merge, InnoDB, BDB, Memory/heap, MySQL Cluster, Federated, Archive, CSV, Blackhole y Example en 5.x, permitiendo al usuario escoger la que sea más adecuada para cada tabla de la base de datos, dependiendo del uso que se le vaya a dar.
  • Agrupación de transacciones, reuniendo múltiples transacciones de varias conexiones para incrementar el número de transacciones por segundo.
  • MySQL Embedded Database.
  • Suele consumir pocos recursos del equipo donde se instala, en función de la configuración elegida.
  • Existen multitud de aplicaciones para la administración de MySQL.

Algunos inconvenientes (contras) de MySQL:

  • Ante todo la adquisición de MySQL por parte de Oracle no deja claro su futuro. No queda claro si se seguirá el desarrollo de MySQL con nuevas versiones con mejores y más características.
  • Facilidad de uso y configuración: MySQL es bastante más sencilla de administrar y configurar que PostgreSQL.
  • Hasta la versión 6 que sigue en estado alpha no soporta integridad referencial.
  • De momento no implementa una buena escalabilidad por lo que no es aconsejable para grandes bases de datos.

En resumen, cada motor de base de datos será interesante para cada situación. La elección del motor de base de datos a usar es muy personal y dependerá de las necesidades y uso que se le vaya a dar. Por ejemplo, para una empresa que quiera montar un servidor web con un sitio web dinámico que sea muy rápido y requiera de pocas modificaciones e inserciones se recomienda MySQL con el motor MyISAM. En cambio, para empresas que requieran de un robusto motor de base de datos con muchas modificaciones e inserciones concurrentes será conveniente usar PostgreSQL.

Así pues no nos podemos decantar por un motor u otro, pues sería un error, cada motor tiene sus ventajas y sus inconvenientes.

Consejos iniciales antes de la migración de MySQL a PostgreSQL

Por supuesto, no en todos los entornos es recomendable cambiar o migrar de MySQL a PostgreSQL. Por ejemplo, en casos de servidores web con Apache, MySQL y PHP, no siempre es recomendable pasar de MySQL a PostgreSQL. MySQL puede ser más rápido en determinados entornos que PostgreSQL. Sobre todo cuando no hay muchas inserciones (INSERT) o modificaciones (UPDATE), cuando hay muchas consultas. En este caso, usando MyISAM de MySQL pueden obtenerse mejores resultados que con PostgreSQL.

Y repetimos, no es conveniente migrar por migrar de un motor de base de datos a otro, conviene estudiar bien las características de cada uno y analizar las que mejor se adapten a nuestro entorno. Hay que tener en cuenta que el uso que se le da a cada base de datos en cada organización o empresa es muy personal. Por ejemplo, una empresa dedicada a la contabilidad y facturación no tendrá los mismos requisitos que una empresa dedicada a servicios web.

Por ello, antes de lanzarse a realizar un cambio de estas dimensiones, es fundamental analizar y realizar las pruebas pertinentes de rendimiento, productividad y disponibilidad en entornos de virtualización. Así garantizaremos que el cambio será exitoso, de lo contrario podremos tener «sorpresas» desagradables.

Copia de seguridad de MySQL Server lógica (a fichero SQL)

Por supuesto y como siempre hemos de realizar copia de seguridad de los datos de MySQL. Vamos a explicar cómo hacer una copia lógica (exportación de los datos a fichero SQL). Esta copia será la usada para la migración o importación a PostgreSQL, usaremos el fichero generado aquí y lo adaptaremos para poder ser ejecutado en PostgreSQL.

Para realizar una copia de seguridad lógica podremos usar cualquier aplicación del mercado o alguna gratuita. Por ejemplo, podremos usar AjpdSoft Copia Seguridad MySQL, como indicamos en el siguiente artículo:

En realidad, la aplicación anterior usa el comando mysqldump de MySQL.

También podremos usar MySQL Administrator, herramienta gratuita disponible en la web de MySQL. Una vez abierta y conectados a la base de datos MySQL, pulsaremos (a la izquierda) en «Backup», pulsaremos en «New Project» y seleccionaremos en «Schemata» el esquema del que haremos copia de seguridad, pasándolo a la derecha con el botón «>». En «Project Name» introduciremos el nombre del proyecto de copia de seguridad, por ejemplo «Copia_ajpdsoft». Si queremos guardar el proyecto pulsaremos «Save Project», si queremos ver más opciones pulsaremos «Advanced Options» y si queremos programarlo para que se ejecute de forma periódica pulsaremos en «Schedule». En nuestro caso lo ejecutaremos directamente pulsando en «Execute Backup Now» pues queremos migrar el sistema MySQL a PosgreSQL y no queremos volver a hacer copia de seguridad:

Copia de seguridad de MySQL Server lógica (a fichero SQL)

Por supuesto, en el caso de hacer copia de seguridad para una migración a otro entorno, como es este caso, debemos asegurarnos de que ningún equipo cliente esté accediendo a la base de datos MySQL mientras hacemos la copia de seguridad. Pues si algún cliente accede y hace modificaciones no quedarán guardadas en el fichero de copia de seguridad y no serán migradas a PostgreSQL. Por lo que debemos asegurarnos de que la copia de seguridad para la migración definitiva se hace sin ningún usuario conectado.

Copia de seguridad física de MySQL (ficheros de la BD)

Es conveniente realizar también una copia de los ficheros físicos que conforman la base de datos MySQL. Si vamos a eliminar el servidor con MySQL para cambiarlo por uno con PostgreSQL es muy recomendable hacer copia también de los ficheros físicos de la base de datos, además de la copia lógica. La ubicación de estos ficheros puede consultarse en el fichero my.ini de configuración de MySQL, en el parámetro datadir.

Para hacer la copia de seguridad física de MySQL detendremos el servicio previamente:

Copia de seguridad física de MySQL (ficheros de la BD)

Una vez detenido haremos un «copiar pegar», copiaremos los ficheros en un medio no volátil (CD, DVD, unidad de cinta, etc.) y lo guardaremos en lugar seguro. No es conveniente eliminar esta copia de seguridad, pues si se complica el proceso de migración a PostgreSQL siempre podremos volver a MySQL.

Realizar pruebas de las aplicaciones de nuestra empresa en la nueva BD PostgreSQL

Bien usando virtualización o mediante cualquier otro método, es muy recomendable montar un servidor PostgreSQL (en Windows o en Linux) y probar las aplicaciones de nuestra empresa que lo vayan a usar. Incluso aunque los desarrolladores nos aseguren que las aplicaciones son compatibles con PosgreSQL, antes de realizar el cambio de MySQL a PostgreSQL es conveniente testarlas en entornos de prueba (virtualizados o no).

Lo más sencillo y menos costoso es instalar algún software de virtualización como VMware, como indicamos aquí:

Una vez preparada la máquina virtual (con el sistema operativo elegido), instalaremos PostgreSQL, como indicamos aquí:

Para Windows:

Para Linux:

Cuando ya tengamos el entorno de pruebas deberemos cambiar las conexiones de nuestras aplicaciones (por el método indicado por los desarrolladores) para que «apunten» al servidor de PostgreSQL de prueba. Verificaremos que todo funciona correctamente.

Elección del sistema operativo para el servidor de PostgreSQL

Es muy importante tener claro el sistema operativo donde se instalará el motor de base de datos PostgreSQL y que convertiremos en servidor de PostgreSQL. No haremos una comparativa entre GNU Linux y Microsoft Windows para PostgreSQL en este manual porque no es el objetivo. Pero sí queremos dejar claro que es recomendable que hagáis las pruebas de rendimiento, estabilidad y disponibilidad o bien con máquinas virtuales o bien en entornos de prueba real. Tanto si se elige Microsoft Windows como si se elige GNU Linux lo importante es que previamente se hayan barajado los pros y los contras para la organización.

Para el caso de la elección del sistema operativo ocurre lo mismo que para el caso de la elección del motor de base de datos ¿Microsoft Windows vs GNU Linux? ¿MySQL vs PostgreSQL? en todos los casos existen ventajas e inconvenientes. Es cuestión de elegir el sistema operativo que mejor se adapte a las necesidades de la empresa.

Cambiar tipos de datos no coincidentes entre MySQL y PostgreSQL

Deberemos reemplazar los tipos de datos de MySQL no coincidentes con los de PostgreSQL por su correspondiente. Por ejemplo, el tipo de datos «int(10)» de MySQL es equivalente al tipo de datos «integer» de PostgreSQL.

Tipos de datos MySQL y PostgreSQL

En el siguiente artículo se pueden consultar los tipos de datos de MySQL:

En este otro artículo se pueden consultar los tipos de datos de PostgreSQL:

Siguiendo estos manuales, reemplazaremos en el fichero SQL resultante de la exportación de los datos y tablas de MySQL los tipos de datos de MySQL con sus correspondientes PostgreSQL.

Tabla de correspondencias entre algunos tipos de datos de MySQL y PostgreSQL

Indicamos algunos tipos de datos MySQL y su correspondiente PostgreSQL:

MySQLPostgreSQL
INT(10)INTEGER
TINYINTSMALLINT
MEDIUMINTINTEGER
BIGINT UNSIGNEDNUMERIC(20)
DOUBLEDOUBLE PRECISION
FLOATREAL
TINYTEXTTEXT
MEDIUMTEXTTEXT
LONGTEXTTEXT
BINARY(n)BYTEA
VARBINARY(n)BYTEA
TINYBLOBBYTEA
BLOBBYTEA
MEDIUMBLOBBYTEA
LONGBLOBBYTEA
DATETIMETIMESTAMP
AUTO_INCREMENTSERIAL (o usar secuencias para generar el autoincremento)

Campos autoincremento de MySQL, simular el auto_increment de MySQL en PostgreSQL con secuencias

En MySQL el «tipo de datos» autoincremento al uso no existe, MySQL permite generar autoincrementos añadiendo la cláusula «AUTO_INCREMENT» en la creación de una tabla, por ejemplo:

En el caso de PostgreSQL, sí que incorpora un tipo de dato llamado «serial» que es autoincremental. Con lo cual, en nuestro fichero SQL exportado de MySQL, deberemos reemplazar las líneas:

nombre_campo integer AUTO_INCREMENT

Por:

nombre_campo serial

En realidad, al indicar el tipo de datos «serial», será el propio PostgreSQL el que cree una secuencia y la asigne al campo. Por ello PostgreSQL también permite simular los autoincrementos a partir de secuencias (al igual que Oracle). Si queremos usar secuencias en vez del tipo de datos «serial» (que al final será lo mismo), para cada auntoincremento (auto_increment) que tengamos en el SQL de MySQL tendremos que crear una secuencia y luego, en el SQL de creación de la tabla, en el campo que es autoincremento habrá que añadir: DEFAULT NEXTVAL(‘nombre_esquema.nombre_secuencia).

Será algo así, si tenemos este SQL de creación de una tabla en MySQL:

La consulta quedará dividida en dos para el caso de PostgreSQL:

1. Crear la secuencia para el autoincremento del campo «codigo» con:

2. Crear la tabla y en el campo «codigo» usar la secuencia anterior con:

Donde: «bdajpdsoft» será el nombre del esquema que usemos en PostgreSQL y «departamento» será el nombre de la tabla.

Restricciones de clave (llave única), diferencias entre MySQL y PostgreSQL

Para el caso de la declaración de las restricciones de claves (claves únicas y claves primarias), MySQL, al exportar con mysqldump, quedarán así:

Para el caso de PostgreSQL, la clave primaria (PRIMARY KEY) se declarará igual que para MySQL, y para las claves únicas, se declararán así:

Otra forma de definirlas en PostgreSQL, fuera de la consulta SQL de creación, es:

1. Para la clave primaria:

2. Para las claves únicas:

Tipo de motor de base de datos InnoDB y MyISAM

MySQL admite varios engines (InnoDB, MyISAM, CSV, Archive, Memory, Blackhole, etc.), dependiendo del que hayamos elegido para cada tabla, en el SQL resultante de la exportación con mysqldump, mostrará algo así en cada tabla:

ENGINE=InnoDB

ó

ENGINE=MyISAM

PostgreSQL no admite tipos de engine, por lo que deberemos eliminar estas declaraciones del fichero SQL resultante de la exportación de los datos de MySQL con mysqldump.

El sistema operativo de los servidores de MySQL y de PostgreSQL

En principio, el sistema operativo en el que estén ubicados los servidores de MySQL (origen de la migración) y de PosgreSQL (destino de la migración) es indiferente para el proceso de migración.

Lógicamente si utilizamos GNU Linux, Mac OS X ó Windows, los comandos, aplicaciones y ubicaciones de archivos variarán. Pero el procedimiento de exportación de MySQL a fichero SQL y de modificación (adaptación) del fichero SQL e importación a PostgreSQL será similiar en cualquiera de los sistemas operativos.

En el siguiente artículo explicamos cómo instalar y administrar PostgreSQL en Windows 7:

En este otro artículo instalamos PostgreSQL en Linux:

Probar y adaptar en caso necesario las aplicaciones que accederán a PostgreSQL

Una vez realizada la migración de MySQL a PostgreSQL deberemos asegurarnos de que las aplicaciones de nuestra empresa de facturación, contabilidad, recursos humanos, etc. que guardaban los datos en MySQL funcionan correctamente en PostgreSQL. Para ello deberemos saber el tipo de conexión que usan (ODBC, nativa, etc.) para adaptarla al nuevo motor de base de datos PostgreSQL.

Además, habrá que asegurarse de que las aplicaciones no usen funciones específicas de MySQL como por ejemplo DESCRIBRE table, SHOW DATABASES, SHOW TABLES, etc. que no existen en PostgreSQL. De ser así habrá que adaptarlas a PostgreSQL, contactando con los desarrolladores de las aplicaciones para que realicen las modificaciones pertinentes.

También habrá que tener en cuenta y verificar si las aplicaciones de nuestra empresa que usaban MySQL utilizan funciones de SQL propias de MySQL (cadena de texto, fecha y hora, etc.), que también habrá que adaptar a PostgreSQL.

Importación del fichero SQL en PostgreSQL resultante de la exportación de MySQL y la adaptación

Una vez que hayamos adaptado el fichero SQL resultante de la exportación de MySQL para que pueda ser ejecutado correctamente en PostgreSQL, como hemos indicando en pasos anteriores, lo revisaremos y lo importaremos a PostgreSQL, a continuación explicamos cómo realizar esta importación.

1. En primer lugar crearemos la conexión al servidor, la base de datos y el esquema como indicamos aquí:

2. En el caso de PostgreSQL en GNU Linux abriremos una ventana de terminal, iniciaremos sesión con el usuario postgres, para ello ejecutaremos el comando GNU Linux:

su postgres

Introduciremos la contraseña del usuario postgres (contraseña que configuramos en la instalación de PostgreSQL)

Para realizar la importación definitiva de MySQL a PostgreSQL, ejecutaremos el siguiente comando indicando el archivo de script sql:

psql -U postgres -f /home/ajpdsoft/copia_mysql.sql

Por supuesto, una vez ejecutado el comando para la importación deberemos revisar que los datos se han importado correctamente.

Anexo

Ejemplo de script de SQL generado con PostgreSQL Dump

Ejemplo de script de SQL generado con MySQL Dump