La migración a la última versión estable de Postgres, la versión 10.0, es equivalente a cualquier otra migración de versiones mayores, fácil para instalaciones que dispongan de espacio suficiente para tener una copia completa y complejo para quienes vayan justos de espacio (y eso sin tener en cuenta si tienes extensiones).
Los pasos a seguir para realizar la migración son los siguientes:
- Realizar un backup completo del cluster.
- instalar Postgresql 10 en tu servidor
- Actualizar los archivos de datos a la versión 10.
Consideraciones previas
La versión 10 de PostgreSQL contiene una serie de cambios que pueden afectar a la compatibilidad con versiones anteriores. Observe algunas de las incompatibilidades:
- Los índices hash deben ser reconstruidos después de actualizar a la versión 10.0.
- La carpeta de registro de escritura anticipada (WAL), pg_xlog, cambia de nombre, en postgre 10 se denomina pg_wal.
- El directorio de situación de la operación, pg_clog, cambia de nombre, en postgre10 se denomina pg_xact.
- Las funciones SQL , las herramientas y las opciones que hacían referencia a ” xlog “ hay que renombrarlas a “wal “ .Por ejemplo, pg_switch_xlog() se convierte pg_switch_wal(), pg_receivexlog se convierte pg_receivewal , y –xlogdir se convierte –waldir.
- Para obtener las propiedades de la secuencia, las aplicaciones deben buscarlas en el catálogo pg_sequence. También se puede usar la nueva vista del sistema pg_sequences, proporciona nombres de columna que son más compatibles con el código existente.
- El valor predeterminado del parámetro log_directory es “log”, en éste directorio se almacenan los registros Log.
Para conocer todas las incompatibilidades y sus características, visita la documentación oficial.
Migrar datos
En este caso, estoy utilizando una máquina virtual con un sistema operativo ubuntu de 64 bits, en ella, tengo una instalación (mediante código fuente) de postgresql de la versión 9.6.3.
Realizar un backup del cluster completo.
Por precaución se realiza una copia de seguridad del cluster antiguo. para ello vamos a utilizar una herramienta que viene incluida en el core, pg_dumpall
Este programa crea un script en el cual incluye todos los datos de cada una de las bases de datos que tengamos en el cluster y los objetos globales, como los usuarios.
La sintaxis de ejecución es sencilla, usamos la opción “-U” para indicar el usuario de conexión y la opción “-f” junto con la ruta y el nombre del fichero sql. No es necesario crear con anterioridad el fichero sql.
Ejemplo de sintaxis:
./pg_dumpall -U postgres96 -f /pruebas/postgresql9.6/copia.sql
Instalar Postgresql 10
En la misma máquina virtual se instala mediante código fuente la última versión estable de postgres. Antes de instalar se crean otros directorios para tener los ejecutables en otra ruta distinta a los ejecutables de la versión antigua. Además, se configura el puerto del servidor nuevo para así poder tener ambos cluster levantados y funcionando a la vez.
Actualizar los archivos de datos a la actual versión 10
Es necesario utilizar la herramienta pg_updrade para migrar los datos desde una versión antigua (a partid de la versión 8.4.x) a una versión mayor, por ejemplo 9.6.x o incluso a la actual versión que es la 10.0.
Lo primero que tenemos que hacer es parar ambos servidores, utilizando el comando pg_ctl. Para ello hay que usar la opción “-D” y la ruta del cluster.
Ejemplo:
pg_ctl -D /pruebas/postgresql9.6/datos/ stop
pg_ctl -D /pruebas/postgresql10/datos/ stop
A continuación hay que ejecutar la herramienta pg_upgrade desde los ejecutable de la nueva versión. Las opciones que se utilizan son estas:
- Ruta del directorio de los binarios antiguo –> “-b”.
- Directorio de los binarios nuevos –> “-B”.
- Carpeta del cluster antiguo –> “-d”.
- Ruta del cluster nuevo –> “-D”.
Este es un ejemplo de como sería la sintaxis:
./pg_upgrade -b /pruebas/postgresql9.6/bin/ -B /pruebas/postgresql10/bin/ -d /pruebas/postgresql9.6/datos/ -D /pruebas/postgresql10/data/
Por último, arrancamos el nuevo servidor y tendremos la base de datos de origen migrada a la nueva versión de PostgreSQL 10.