Saltar al contenido

pg_dump

pg_dump – pg_restore (PostgreSQL)

  • admin 

Cuando se trabaja con base de datos, uno de las cosas más importantes de hacer es respaldar los datos en caso de que ocurra cualquier situación que dañe nuestro servidor de base de datos. De nada nos serviría hacer esos respaldos si no los podemos volver a cargar (restaurar) cuando lo necesitemos.
En este post,  trataremos la forma de hacer respaldos y restauración de datos cuando se utiliza postgreSQL como DBMS.

Respaldando los datos: pg_dump

pg_dump es una herramienta de línea de comandos que nos permita hacer un respaldo de alguna de las bases de datos  (o todas) en nuestro servidor postgres. Permite hacer el volcado de datos en diferentes formatos ya sean compresos, texto plano, etc. En resumen, escribe en un archivo (o salida estándar) las instrucciones SQL necesarias para hacer un respaldo de la base de datos.

El formato del comando pg_dump es:
   pg_dump [opciones] [nombre_base]
Entre las opciones que se pueden utilizar están:
dbname: Nombre de la base de datos de la que se desea hacer respaldo.
-a o –data-only: Hace un volcado solo de los datos y no del esquema.
-c o –clean: Crea instrucciones para eliminar los elementos antes de crearlos. Es útil para evitar los errores del tipo ‘la relacion nombre_relación ya existe’ a la hora de restaurar el respaldo.

-C o –create:  Escribe las instrucciones para la creación de la base de datos dentro del script del respaldo.

-f <archivo> o –file=<archivo>:  Escriba la salida (el volcado) en el archivo especificado. En caso de que no se utilice esta opción, el volcado se hace a la salida estándar.

-F <formato_de_archivo> o –format=<formato_de_archivo>: Permite especificar el formato de la salida del dump. El formato de salida puede ser:

p o plain: Texto plano.

c o custom:  Formato de salida customizable. Este tipo de salida siempre se realiza compreso por defecto.

t o tar: Crea la salida en formato tar.

-n <nombre_esquema> o –schema=<nombre_esquema>: Realiza el dumpúnicamente del esquema (y todos los objetos que contengan) que concuerde con el<nombre_esquema>. Si no se especifica, se hará un dump de todos los esquemas que no sean del sistema y que estén en la base destino. Si se quiere incluir en el dump más de un esquema se pueden poner multiples -n <nombre_esquema> como sean necesarios.

-N <nombre_esquema> o –exclude-schema=<nombre_esquema>: Omite los esquemas que concuerden con <nombre_esquema> del dump a realizarse. Se pueden incluir tantos -N como sean necesarios.

-s o –schema-only: Hace un volcado únicamente del esquema, no de los datos.

-t <nombre_tabla> o –table=<nombre_tabla>: Hace un volcado solo de las tablas que se especifiquen. Se pueden utilizar -t <nombre_tabla> tantas veces como se necesite. Se debe tener en cuenta que pg_dump no hace un seguimiento de las tablas de las que pueda depender la tabla que se desee volcar con el dump, así que hay que tener cuidado de incluirlas todas las que sean necesarias (que tengan relación con llaves primarias o foráneas) para garantizar que se puede hacer la restauración de los datos exitosamente.

-T <nombre_tabla> o — exclude-table: <nombre_tabla>: Excluye del dumplas tablas listadas. Esta opción puede ser utilizada más de una vez.

— inserts: Utiliza inserts en lugar de copy en las instrucciones de SQL.

— port = <puerto>: Especifica el puerto TCP o local en el cual el servidor está escuchando.

-U <nombre_de_usuario>: Especifica el nombre de usuario con el que se hará la conexión a la base de datos que se desea respaldar.

Ejemplos:
Si tenemos una base de datos llamada base_de_prueba y queremos respaldarla completamente en un archivo llamado base_de_prueba.sql, podemos utilizar el siguiente comando:
   pg_dump base_de_prueba > base_de_prueba.sql

Para hacer el volcado en un archivo de extensión personalizada (opción -F y c para custom):

   pg_dump -Fc base_de_prueba > base_de_prueba.dump

Para volcar solo una tabla de la base:

   pg_dump -t nombre_tabla base_de_prueba > mi_tabla_dump.sql

Restaurando los datos: pg_restore

Para realizar la restauración de los datos volcados con pg_dump, podemos utilizar la herramienta pg_restore. pg_restore restaura una base de datos que ha sido respaldada con pg_dump.

Entre las ventajas de utilizar esta utilidad para la restauración es que se puede seleccionar qué partes del respaldo se quieren restaurar o incluso reordenar los items antes de hacer la restauración

La sintáxis del comando es la siguiente:

   pg_restore [opciones] [fichero_a_restaurar]

Entre las opciones más comunes utilizadas con este comando están:

-a o –data-only:  Restaura solo los datos, no el esquema.

-c o –clean: Elimina los objetos antes de volverlos a crear.

-C o –create: Crea la base de datos especificada con la opción -d, sin embargo, los datos son restaurados a la base de datos que aparece en el script.
-d <nombre_base> o –dbname=<nombre_base>: Conecta a la base de datos<nombre_base> y restaura los datos directamente en ella.

-j <numero> o –jobs=<numero>: Realiza la restauración de los datos utilizando<numero> hilos o procesos (dependiendo del sistema operativo). Cada jobs es un proceso o hilo que utiliza una conexión separada. La utlización de esta opción, permite poder restaurar un dump en una forma más rápida, sin embargo, utiliza más recursos en el servidor. La velocidad de la restauración, por tanto, depende en gran medida de la configuración del hardware del servidor.

-n <nombre_esquema> o –schema=<nombre_esquema>: Realiza la restauración únicamente del esquema llamado <nombre_esquema>.

-s o –schema-only: Restura solo el esquema, no los datos.

-t <nombre_tabla> o –table=<nombre_tabla>:  Restaura únicamente la tabla con el nombre <nombre_tabla>. <nombre_tabla> puede ser una expresión regular.

-U <nombre_usuario> o –username=<nombre_usuario>:  Nombre de usuario con el que se desea hacer la conexión.
Uno de las cosas a tomar en cuenta a la hora de restaurar un respaldo es que si éste ha sido hecho en un formato particular (custom), no podrá ser visible con herramientas como more,cat o algún editor de texto.

Debido a que no se puede ver que usuarios se utilizan o a que base de debe conectar, se pueden correr problemas a la hora de quererlos restaurar en otra máquina que no tenga los usuarios o bases que correspondan con los que están en el archivo creado con pg_dump.
Una forma de solucionar esto es hacer una restauración sin especificar la base de datos a la que se desea restaurar los datos. Esto hace que pg_restore mande la salida a la salida estandar. Esta salida estandar puede ser enviada a un archivo que contendrá las instrucciones de respaldo en texto plano.
Por ejemplo, asumiendo que tenemos un archivo creado con pg_dump en formato .dump, llamado respaldo-base.dump y queremos pasarlo a texto plano en un fichero, podemos hacer lo siguiente:
$ pg_restore respaldo-base.dump > respaldo-base.sql
El operador > redirecciona la salida de la salida estándar (pantalla) al archivo respaldo-base.sql. Después de haberse ejecutado el comando, el fichero puede ser leido con cualquier editor de texto.

Otros ejemplos:

$ pg_restore -C -d postgres db.dump
Crea la base de datos postgres (por la opción -C) pero siempre vuelca los datos en la base que el script especifica.
 $ pg_restore -d mi_base db.dump
Restaura los datos en la base llamada mi_base. Esta base debe haber sido creada previamente.

 

Como habrán notado, las herramientas pg_dump y pg_restore comparten muchas opciones comunes entre sí y representan un par de herramientas bastante útiles a la hora de restaurar y manipular los respaldos hechos de nuestras bases de datos.