Actualizar con pg_upgrade

Al actualizar versiones principales (por ej. 8.4 a 9.0) es necesario crear una nueva instancia (debido a cambios en el almacenamiento interno), lo que conlleva a realizar un respaldo y restauración completa o una migración de los archivos existentes.

Para realizar un respaldo completo, ver pg_dumpall.

Para la migración de una instalación existente, se utilizar pg_upgrade como se detalla en este instructivo a continuación:

Entorno

Para evitar errores, es conveniente definir las variables de entorno con directorios, binarios y configuraciones a utilizar:

# directorios viejo y nuevo (datos y binarios)
export PGDATAOLD=~/pg/data84
export PGDATANEW=~/pg/data90
export PGBINOLD=/usr/lib/postgresql/8.4/bin 
export PGBINNEW=~/pg/bin
export PGPORTNEW=5435

Instalar contribs

pg_upgrade es una contribución que se distribuye junto con PostgreSql (versión 9.0 y superior), se debe instalar de la siguiente forma:

cd contrib/pg_upgrade
make install
cd ../contrib/pg_upgrade_support
make install

Mover cluster viejo

Si se va a actualizar el motor actual, mover el directorio viejo para poder instalar el nuevo:

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

Inicializar nuevo cluster

$PGBINNEW/initdb -D $PGDATANEW

Ajustar autenticación

Revisar pg_hba.conf para no solicitar contraseña (requerido por pg_update)

Detener ambos servidores

$PGBINNEW/pg_ctl -D $PGDATAOLD stop $PGBINNEW/pg_ctl -D $PGDATANEW stop

Actualizar

Ejecutar pg_upgrade (última versión disponible), con --check para verificar:

$PGBINNEW/pg_upgrade --old-datadir $PGDATAOLD --new-datadir $PGDATANEW -b $PGBINOLD -B PGBINNEW --check

Si todo funciona ok y las instancias son compatibles, la salida esperada sería:

Performing Consistency Checks
-----------------------------
Checking old data directory (/home/reingart/pg/data84)      ok
Checking old bin directory (/usr/lib/postgresql/8.4/bin)    ok
Checking new data directory (/home/reingart/pg/data90)      ok
Checking new bin directory (/home/reingart/pg/bin)          ok
Checking for reg* system oid user data types                ok
Checking for /contrib/isn with bigint-passing mismatch      ok
Checking for large objects                                  ok
Checking for presence of required libraries                 ok

# Clusters are compatible*

Recordar que el comando anterior no modificó la base, para migrar definitivamente ejecutar pg_upgrade sin --check, opcionalmente con --link para enlazar -no copia los archivos!-:

$PGBINNEW/pg_upgrade --old-datadir $PGDATAOLD --new-datadir $PGDATANEW -b $PGBINOLD -B PGBINNEW

Si la actualización es exitosa, la salida del proceso de migración será similar a la verificación ocurrida con --check más la migración propiamente dicha:

| If pg_upgrade fails after this point, you must
| re-initdb the new cluster before continuing.
| You will also need to remove the ".old" suffix
| from /home/reingart/pg/data84/global/pg_control.old.

Performing Migration
--------------------
Adding ".old" suffix to old global/pg_control               ok
Analyzing all rows in the new cluster                       ok
Freezing all rows on the new cluster                        ok
Deleting new commit clogs                                   ok
Copying old commit clogs to new server                      ok
Setting next transaction id for new cluster                 ok
Resetting WAL archives                                      ok
Setting frozenxid counters in new cluster                   ok
Creating databases in the new cluster                       ok
Adding support functions to new cluster                     ok
Restoring database schema to new cluster                    ok
Removing support functions from new cluster                 ok
Restoring user relation files
                                                            ok
Setting next oid for new cluster                            ok
Creating script to delete old cluster                       ok
Checking for large objects                                  ok

Iniciar cluster nuevo

En este punto el directorio nuevo contiene los datos actualizados de la versión previa, por lo que debería ser posible levantarlo normalmente:

$PGBINNEW/pg_ctl -D $PGDATANEW start

Procesamiento post-migración

En ocasiones es necesario ejecutar scripts para terminar la migración, para ello realizar:

$PGBINNEW/psql .p $PGPORTNEW --username postgres --file script.sql postgres 

Regenerar Estadísticas

Las estadísticas no son transferidas automáticamente, por ello es recomendado regeneralas:

$PGBINNEW/vacuumdb --all --analyze-only -p $PGPORTNEW

Borrar cluster viejo

De corresponder, luego de finalizar y comprobar la migración, puede eliminarse la carpeta de datos vieja (y no se ha usado --link):

delete_old_cluster.sh

En caso de ser necesario, y si no se a eliminado, es posible revertir a cluster viejo si se ha usado --check, no se ha usado --link. Revisar pg_control.old

Bibliografía

Para mayor información dirigirse a: