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:
- Documentación Oficial
- PostgreSQL 9 Administration Cookbook, Simon Riggs - Hannu Krosing, Packt Publishing, 2010
