En esta entrada se realizará una actualización de una base de datos PostgreSQL de una versión major a otra superior.
En PostgreSQL las actualizaciones se definen por dos nombres minor y major. Las actualizaciones minor, son aquellas en los que normalmente se aplican parches y correcciones de seguridad entre otras cosas, pero nada que suela alterar el «core» del software en sí. Las actualizaciones major son aquellas en las que si existe una actualización de este core por lo que la adaptación de una base de datos a este nueva release de forma ininterrumpida no es posible.
Las actualizaciones minor las podemos realizar directamente desde el apt de nuestra distribución de linux sin riesgo alguno. No sucede lo mismo con las major, que para ello debemos instalar la siguiente release en la que debe existir una transición del clúster viejo de la base de datos al clúster nuevo.
Antes de probar a actualizar una base de datos de producción, es una obligación realizar pruebas en entornos de test, para familiarizarse con el proceso y ver qué resultado tendremos con nuestra base de datos. Por lo que antes de comenzar incluso en un servidor de test, si la pérdida de los datos puede suponer un problema, es necesario sacar un backup antes.
Antes de proceder con la actualización realiza un backup de tus bases de datos para poder revertir el proceso.
En mi caso tengo una versión de PostgreSQL 9.4, la cual voy a actualizar a una versión 9.6.8, para empezar, tendré que instalar la versión 9.6.8:
apt-get install postgresql-9.6
Una vez instalado veremos que nos crea un nuevo clúster y nos lo dejará en estado offline, mediante el comando pg_lscluster listaremos los clusters:
root@psql:/var/lib# pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 9.4 main 5432 online postgres /var/lib/postgresql/9.4/main /var/log/postgresql/postgresql-9.4-main.log 9.6 main 5433 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log root@psql:/var/lib#
Como la versión destino a la que nosotros queremos ir es la 9.6 borraremos el cluster que nos creo al instalar esta versión, a través del siguiente comando:
root@psql:/var/lib# pg_dropcluster 9.6 main --stop root@psql:/var/lib#
Una vez borrado lo único que tendremos que hacer es actualizar el cluster 9.4 a la versión 9.6. Paramos el cluster 9.4 ya que en caso contrario nos dará error al intentar actualizar, una vez hecho procedemos a actualizarlo
root@psql:/var/lib# pg_ctlcluster 9.4 main stop root@psql:/var/lib# pg_upgradecluster -v 9.6 9.4 main Disabling connections to the old cluster during upgrade... Restarting old cluster with restricted connections... Creating new PostgreSQL cluster 9.6/main ...
Una vez finalizado el proceso, puede demorar horas en función de nuestras bases de datos, observaremos que hay dos clusters, uno offline de la versión original y otro nuevo con la versión destino. Procederemos a hacer un drop de la versión vieja y luego a purgar la versión vieja de PostgreSQL
root@psql:/var/lib# pg_dropcluster 9.4 main root@psql:/var/lib# apt-get --purge remove postgresql-client-9.4 postgresql-9.4 Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be REMOVED: postgresql-9.4* postgresql-client-9.4* postgresql-contrib-9.4* 0 upgraded, 0 newly installed, 3 to remove and 1 not upgraded. After this operation, 24.9 MB disk space will be freed. Do you want to continue? [Y/n] Y
Si lo que queremos es crear un cluster lo podremos realizar mediante el siguiente comando:
root@psql:/var/lib# pg_createcluster --start-conf auto 9.6 main Creating new PostgreSQL cluster 9.6/main ... /usr/lib/postgresql/9.6/bin/initdb -D /var/lib/postgresql/9.6/main --auth-local peer --auth-host md5 The files belonging to this database system will be owned by user "postgres".
Toda la información utilizada aquí se ha sacado del fork del usuario @dmitrykustov en GitHub, al cual quiero agradecer por compartir la guía. Cabe destacar que he utilizado este procedimiento en servidores de producción sin el menor tipo de problemas. Como anotación me gustaría indicar que este mismo procedimiento sirve exactamente igual para actualizar a la versión major de PostgreSQL 10.3
En la anterior entrada os dejamos un script para monitorizar una base de datos PostgreSQL, lo podrás ver aquí.
Hasta la próxima.