En PostgreSQL, la actualización de versiones se realiza de diferentes maneras:
Instalar paquetes con una nueva versión de PostgreSQL. Este método es adecuado solo para actualizaciones menores. Antes de realizar la actualización, consulta las notas de la versión.
Uso del programa estándar pg_dumpall. Es un método confiable, pero puede haber un tiempo de inactividad prolongado.
Uso del programa estándar pg_upgrade. Otra forma rápida de actualizar, pero pueden ocurrir errores.
Actualizar mediante replicación lógica. Esta opción tiene un tiempo de inactividad mínimo, pero solo es adecuada para versiones de PostgreSQL superiores a la 10.0. Las versiones anteriores requieren extensiones. La elección depende de qué versión se utiliza en el servidor y a qué versión deseas actualizar.
En este artículo, veremos todos los métodos de actualización mencionados.
Lo principal es entender las particularidades de las actualizaciones entre diferentes versiones. Los números de versión consisten en dos dígitos, por ejemplo, 10.1. El primer dígito es el número de la versión principal (10). El segundo dígito es el número de la versión menor (1). Antes de PostgreSQL 10, los números de versión constaban de tres dígitos. Por ejemplo, en 9.6.3, 9.6 es el número de la versión principal y 3 es el número de la versión menor.
Debes comprender esta diferencia para elegir el método de actualización adecuado.
En las versiones menores, el formato de almacenamiento de datos no cambia, por lo que no hay problemas de compatibilidad. Por lo tanto, la transición de PostgreSQL 10.1 a 10.6 se puede realizar muy fácilmente. Para actualizar, apaga el servidor, reemplaza los archivos ejecutables y vuelve a iniciar el servidor.
Sin embargo, la documentación indica que algunas versiones pueden requerir cambios manuales. Por lo tanto, siempre lee las notas de la versión antes de realizar la actualización.
En las versiones principales, el formato de los datos puede cambiar. Esto hace que la actualización sea más difícil. Necesitarás exportar los datos e importarlos nuevamente, usar el programa pg_upgrade o utilizar replicación lógica.
Veamos cómo actualizar PostgreSQL versión 14.1 a PostgreSQL 14.3 en un servidor Ubuntu.
PostgreSQL está disponible en Ubuntu por defecto. Comienza con el comando:
sudo apt-get upgrade
Debian y Ubuntu solo lanzan una versión de PostgreSQL por cada versión del sistema operativo. Por ejemplo, Debian Squeeze/6.0 solo tiene PostgreSQL 8.4. Si necesitas una versión diferente de PostgreSQL, usa los paquetes de PGDG.
Si deseas la última versión de PostgreSQL, primero debes instalar el repositorio de Postgres.
Agrega un repositorio:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Importa la clave de firma:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Actualiza la lista de paquetes en el sistema:
sudo apt-get update
Instala la versión requerida de PostgreSQL:
sudo apt-get -y install postgresql-14.3
Para ver la lista de DBMS instalados, ejecuta:
dpkg --get-selections | grep postgres
También ve la lista de clusters:
pg_lsclusters
Detén PostgreSQL antes de hacer cambios:
sudo service postgresql stop
Cuando se instalan los paquetes de PostgreSQL, crean un cluster predeterminado para ti. Debes cambiar el nombre del nuevo cluster de Postgres para evitar conflictos con el nombre del antiguo cluster al actualizar.
sudo pg_renamecluster 14.3 main main_pristine
Actualiza el antiguo cluster:
sudo pg_upgradecluster 14.1 main
Inicia el servicio:
sudo service postgresql start
Verifica nuevamente la lista de clusters y asegúrate de que el nuevo cluster esté funcionando:
pg_lsclusters
Elimina el antiguo cluster:
sudo pg_dropcluster 14.1 main
Si necesitas cambiar la versión principal, usa el programa pg_dumpall. La esencia de este método es descargar los datos de una versión principal y luego cargarlos en otra.
Antes de descargar los datos, asegúrate de que no se estén realizando cambios en la base de datos en ese momento. De lo contrario, algunos de los cambios pueden no ser incluidos en la descarga final.
Obtén la descarga y escríbela en un archivo:
pg_dumpall > output_file
Detén el servidor:
pg_ctl stop
Cambia el nombre del antiguo directorio para evitar conflictos de nombres:
mv /usr/local/pgsql /usr/local/pgsql.old
El antiguo directorio puede eliminarse. Pero es más sabio renombrarlo para dejar espacio para la restauración. En lugar de /usr/local/pgsql, especifica la ruta a tu directorio.
Instala la nueva versión desde la fuente. Hay una guía detallada en la documentación.
Crea un nuevo cluster:
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
Transfiere todos los cambios a los archivos pg_hba.conf y postgresql.conf.
Inicia el servidor de bases de datos:
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
Restaura los datos desde la copia de seguridad:
/usr/local/pgsql/bin/psql -d postgres -f output_file
El inconveniente de este método es que el servidor estará apagado durante mucho tiempo. Para reducir el tiempo de inactividad, puedes instalar el nuevo servidor en un directorio diferente y luego ejecutar los servidores antiguo y nuevo en diferentes puertos. Para transferir los datos, usa el comando:
pg_dumpall -p 5432 | psql -d postgres -p 5433
En lugar de 5432 y 5433, especifica los números de puerto en los que ejecutaste los servidores.
Para evitar descargar e importar los datos, usa el programa pg_upgrade. Ayuda a actualizar más rápido. El programa pg_upgrade crea nuevas tablas del sistema, teniendo en cuenta los cambios en las últimas versiones de PostgreSQL. En este caso, los antiguos archivos de datos se mantienen. Además, pg_upgrade verifica que los clusters sean compatibles.
El programa pg_upgrade te ayuda a actualizar desde PostgreSQL 8.4.X a la versión actual del DBMS.
Veamos un plan de actualización general usando pg_upgrade.
Mueve el antiguo cluster. Esto debe hacerse si la carpeta no estaba vinculada a la antigua versión. Por ejemplo, si se encuentra en /usr/local/pgsql. Si no lo renombras, ocurrirá un conflicto durante la actualización.
El renombrado se realiza cuando el servidor está apagado con el comando:
mv /usr/local/pgsql /usr/local/pgsql.old
Construye la nueva versión desde la fuente. Ajusta la configuración para que las opciones sean compatibles con la configuración del antiguo cluster. Antes de iniciar la actualización, pg_upgrade verificará la compatibilidad de las opciones.
Instala nuevos archivos ejecutables. Para colocar el servidor en un directorio no estándar, usa el prefijo:
make prefix=/usr/local/pgsql.new install
Usa initdb para inicializar un nuevo cluster. Verifica que las opciones sean compatibles con las del antiguo cluster.
Instala los archivos de objetos compartidos de la extensión. Si hay actualizaciones disponibles, pg_upgrade creará automáticamente un script para su posterior instalación.
Transfiere los archivos de búsqueda de texto completo.
Configura la autenticación de pares en pg_hba.conf. Esto debe hacerse porque pg_upgrade se conectará a los antiguos y nuevos hosts varias veces.
Verifica que los servidores antiguo y nuevo estén detenidos:
pg_ctl -D /opt/PostgreSQL/9.6 stop
pg_ctl -D /opt/PostgreSQL/14 stop
Ejecuta pg_upgrade desde el nuevo servidor. Primero, ejecuta el programa en modo de verificación agregando la opción: pg_upgrade --check. Como respuesta, recibirás una lista de ajustes que deben realizarse manualmente después de la actualización.
Si hiciste cambios en el archivo pg_hba.conf, restáuralo a su estado anterior. A veces, otras configuraciones en el nuevo cluster deben cambiarse para que coincidan con la configuración del antiguo cluster.
Inicia el servidor.
Si estás satisfecho con el resultado, elimina el antiguo cluster.
Para detalles y características del uso de pg_upgrade, consulta la documentación.
Desde la versión 10 de PostgreSQL, tenemos un método para la replicación lógica de objetos de datos y los cambios en ellos. Está basado en el uso de identificadores de replicación; generalmente son claves primarias.
La replicación lógica usa el modelo de publicación-suscripción. El usuario crea una instantánea de la base de datos publicada y la copia al suscriptor. En la documentación de PostgreSQL, uno de los escenarios típicos para usar replicación lógica es precisamente la replicación entre diferentes versiones principales de PostgreSQL.
El servidor de respaldo puede estar en el mismo host o en otro. Después de que la sincronización esté completa, se pueden usar diversas opciones. Por ejemplo, puedes hacer que el nuevo servidor sea el principal y apagar el antiguo.
El principal beneficio de la replicación lógica es el tiempo de inactividad mínimo. La interrupción del servidor, en algunos casos, se limita a unos pocos segundos.
Examinamos los métodos universales para actualizar PostgreSQL a una nueva versión principal y actualizar dentro de una versión principal.
Con esta guía, puedes elegir el método que funcione mejor para tu caso particular y actualizar tu versión actual de PostgreSQL.