jueves, 7 de febrero de 2013

Backup y Restore selectivo de tablas o campos con Postgres

pg_dump es una herramienta muy buena para hacer backups de bases de datos completas o tablas enteras.

Pero cuando solo quiero extraer unas pocas columnas (id1,c2,c3) de alguna tabla (t1), de una base de datos (bb1), para restaurarlas posteriormente en otra base de datos diferente (bd2) y tabla diferente de la original que solo contiene los campos que hemos seleccionado (t2), lo mejor es utilizar la utilidad \copy de psql.

Primero descargamos el contenido de la tabla t1 de la base de datos origen bd1, en el fichero salida
psql -h host1 -U postgres bd1 -c "\copy t1 (id1,c2,c3) to salida"

Después borro el contenido de la tabla en la base de datos de destino para que no haya problemas de identificadores duplicados:
psql -h host2 -U postgres bd2 -c "delete from t1"

Por último restauro los datos en la tabla de la base de datos de destino bd2 y tabla destino t2:
psql -h host2 -U postgres bd2 -c "\copy t2 (id1,c2,c3) from salida"

¿Para que sirve esto? Pues por ejemplo si tengo una tabla de usuario con los campos:

id, nick, password, preferencias, dato1, dato2, dato3...

Y en una base de datos diferente necesito una tabla que contenga solo un par de campos de usuario para realizar estudios:

id, nick

Puedo automatizar de forma sencilla, una carga nocturna de los datos.