18.6. Actualizar un clúster de PostgreSQL #

18.6.1. Actualizar datos mediante pg_dumpall
18.6.2. Actualizar datos mediante pg_upgrade
18.6.3. Actualizar datos mediante replicación

Esta sección describe cómo actualizar los datos de tu base de datos de una versión de PostgreSQL a una más nueva.

Los números de versión actuales de PostgreSQL constan de un número de versión mayor y otro menor. Por ejemplo, en el número de versión 10.1, el 10 es el número de versión mayor y el 1 es el número de versión menor, lo que significa que esta sería la primera versión menor de la versión mayor 10. Para las versiones anteriores a la versión 10.0 de PostgreSQL, los números de versión constan de tres números, por ejemplo, 9.5.3. En esos casos, la versión mayor consta de los dos primeros grupos de dígitos del número de versión, por ejemplo, 9.5, y la versión menor es el tercer número, por ejemplo, 3, lo que significa que esta sería la tercera versión menor de la versión mayor 9.5.

Las versiones menores nunca cambian el formato de almacenamiento interno y siempre son compatibles con las versiones menores anteriores y posteriores del mismo número de versión mayor. Por ejemplo, la versión 10.1 es compatible con la versión 10.0 y la versión 10.6. De manera similar, por ejemplo, la 9.5.3 es compatible con la 9.5.0, 9.5.1 y 9.5.6. Para actualizar entre versiones compatibles, simplemente reemplazas los ejecutables mientras el servidor está apagado y reinicias el servidor. El directorio de datos permanece inalterado; las actualizaciones menores son así de sencillas.

Para las versiones mayores de PostgreSQL, el formato de almacenamiento de datos interno está sujeto a cambios, lo que complica las actualizaciones. El método tradicional para mover datos a una nueva versión mayor es volcar y restaurar la base de datos, aunque esto puede ser lento. Un método más rápido es pg_upgrade. También hay métodos de replicación disponibles, como se detalla más adelante. (Si estás utilizando una versión preempaquetada de PostgreSQL, es posible que proporcione scripts para ayudar con las actualizaciones de versiones mayores. Consulta la documentación del paquete para obtener más detalles).

Las nuevas versiones mayores también suelen introducir algunas incompatibilidades visibles para el usuario, por lo que podrían ser necesarios cambios en la programación de tus aplicaciones. Todos los cambios visibles para el usuario se enumeran en las notas de lanzamiento (Appendix E); presta especial atención a la sección titulada «Migración». Aunque puedes actualizar de una versión mayor a otra sin actualizar a las versiones intermedias, deberías leer las notas de lanzamiento de todas las versiones mayores intermedias.

Los usuarios precavidos querrán probar sus aplicaciones cliente en la nueva versión antes de realizar la transición completa; por lo tanto, a menudo es una buena idea configurar instalaciones concurrentes de las versiones antigua y nueva. Al probar una actualización mayor de PostgreSQL, considera las siguientes categorías de posibles cambios:

Administración

Las capacidades disponibles para que los administradores supervisen y controlen el servidor a menudo cambian y mejoran en cada versión mayor.

SQL

Normalmente esto incluye nuevas capacidades de comandos SQL y no cambios en el comportamiento, a menos que se mencione específicamente en las notas de lanzamiento.

API de bibliotecas

Normalmente las bibliotecas como libpq solo agregan nueva funcionalidad, de nuevo a menos que se mencione en las notas de lanzamiento.

Catálogos del sistema

Los cambios en los catálogos del sistema generalmente solo afectan a las herramientas de gestión de bases de datos.

API en lenguaje C del servidor

Esto implica cambios en la API de funciones internas (backend), que está escrita en el lenguaje de programación C. Estos cambios afectan al código que hace referencia a funciones internas en lo profundo del servidor.

18.6.1. Actualizar datos mediante pg_dumpall #

Un método de actualización consiste en volcar los datos de una versión mayor de PostgreSQL y restaurarlos en otra; para hacer esto, debes usar una herramienta de copia de seguridad lógica como pg_dumpall; los métodos de copia de seguridad a nivel de sistema de archivos no funcionarán. (Existen controles que evitan que utilices un directorio de datos con una versión incompatible de PostgreSQL, por lo que no se causará ningún daño grave por intentar iniciar la versión incorrecta del servidor en un directorio de datos).

Se recomienda que utilices los programas pg_dump y pg_dumpall de la versión más nueva de PostgreSQL, para aprovechar las mejoras que se hayan realizado en estos programas. Las versiones actuales de los programas de volcado pueden leer datos de cualquier versión de servidor a partir de la 9.2.

Estas instrucciones asumen que tu instalación existente se encuentra bajo el directorio /usr/local/pgsql, y que el área de datos está en /usr/local/pgsql/data. Sustituye tus rutas según corresponda.

  1. Al realizar una copia de seguridad, asegúrate de que tu base de datos no se esté actualizando. Esto no afecta la integridad de la copia de seguridad, pero por supuesto los datos modificados no se incluirían. Si es necesario, edita los permisos en el archivo /usr/local/pgsql/data/pg_hba.conf (or equivalente) para denegar el acceso a todos excepto a ti. Consulta Chapter 20 para obtener información adicional sobre el control de acceso.

    Para hacer una copia de seguridad de tu instalación de la base de datos, escribe:

    pg_dumpall > archivo_salida
    

    Para hacer la copia de seguridad, puedes usar el comando pg_dumpall de la versión que estás ejecutando actualmente; consulta Section 25.1.2 para obtener más detalles. Para obtener los mejores resultados, sin embargo, intenta usar el comando pg_dumpall de PostgreSQL 18.4, ya que esta versión contiene correcciones de errores y mejoras sobre las versiones anteriores. Aunque este consejo pueda parecer peculiar ya que aún no has instalado la nueva versión, es recomendable seguirlo si planeas instalar la nueva versión en paralelo con la versión anterior. En ese caso, puedes completar la instalación normalmente y transferir los datos más tarde. Esto también disminuirá el tiempo de inactividad.

  2. Apaga el servidor antiguo:

    pg_ctl stop
    

    En sistemas que tienen PostgreSQL configurado para iniciarse al arrancar, probablemente haya un archivo de inicio que haga lo mismo. Por ejemplo, en un sistema Red Hat Linux uno podría encontrar que esto funciona:

    /etc/rc.d/init.d/postgresql stop
    

    Consulta Chapter 18 para obtener detalles sobre cómo iniciar y apagar el servidor.

  3. Si vas a restaurar desde la copia de seguridad, renombra o elimina el directorio de la antigua instalación si no es específico de la versión. Es una buena idea renombrar el directorio, en lugar de eliminarlo, en caso de que tengas problemas y necesites volver a él. Ten en cuenta que el directorio puede consumir un espacio considerable en el disco. Para renombrar el directorio, usa un comando como este:

    mv /usr/local/pgsql /usr/local/pgsql.old
    

    (Asegúrate de mover el directorio como una sola unidad para que las rutas relativas permanezcan inalteradas).

  4. Instala la nueva versión de PostgreSQL tal como se describe en Chapter 17.

  5. Crea un nuevo clúster de base de datos si es necesario. Recuerda que debes ejecutar estos comandos habiendo iniciado sesión con la cuenta especial del usuario de la base de datos (que ya tienes si estás actualizando).

    /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
    

  6. Restaura tu pg_hba.conf anterior y cualquier modificación de postgresql.conf.

  7. Inicia el servidor de bases de datos, de nuevo usando la cuenta especial del usuario de la base de datos:

    /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
    

  8. Finalmente, restaura tus datos desde la copia de seguridad con:

    /usr/local/pgsql/bin/psql -d postgres -f archivo_salida
    

    usando el nuevo psql.

El menor tiempo de inactividad se puede lograr instalando el nuevo servidor en un directorio diferente y ejecutando tanto el servidor antiguo como el nuevo en paralelo, en diferentes puertos. Luego puedes usar algo como:

pg_dumpall -p 5432 | psql -d postgres -p 5433

para transferir tus datos.

18.6.2. Actualizar datos mediante pg_upgrade #

El módulo pg_upgrade permite migrar una instalación en el sitio (in-place) de una versión mayor de PostgreSQL a otra. Las actualizaciones se pueden realizar en minutos, particularmente con el modo --link. Requiere pasos similares a los de pg_dumpall descritos anteriormente, por ejemplo, iniciar/detener el servidor, y ejecutar initdb. La documentación de pg_upgrade detalla los pasos necesarios.

18.6.3. Actualizar datos mediante replicación #

También es posible utilizar métodos de replicación lógica para crear un servidor en espera (standby) con la versión actualizada de PostgreSQL. Esto es posible porque la replicación lógica admite la replicación entre diferentes versiones mayores de PostgreSQL. El servidor en espera puede estar en la misma computadora o en una computadora diferente. Una vez que se haya sincronizado con el servidor primario (que ejecuta la versión anterior de PostgreSQL), puedes cambiar los roles de los servidores primarios, convertir al servidor en espera en el primario y apagar la instancia de base de datos anterior. Tal cambio resulta en solo unos pocos segundos de tiempo de inactividad para una actualización.

Este método de actualización se puede realizar utilizando las facilidades de replicación lógica integradas, así como sistemas externos de replicación lógica tales como pglogical, Slony, Londiste y Bucardo.