pg_basebackup. Realiza backups en PostgreSQL

postgre-sql pg_basebackup

Hola de nuevo. Hoy os queríamos comentar una forma de realizar backup en PostgreSQL poco conocida pero con una funcionalidad muy alta y que nos permite realizar una copia consistente de todos los binarios de nuestra instancia y con poca carga en el servidor. La herramienta se llama pg_basebackup y se utiliza en la mayoría de los casos para crear una réplica en un servidor secundario pero también lo podemos utilizar como backup de un servidor primario.

El comando pg_basebackup hace una conexión con el protocolo de replicación (como si fuera un cliente de replicación normal) y entonces crea una copia binaria de los datos que están en el directorio $PGDATA. La copia que se genera es consistente ya que todos los ficheros se corresponden al estado del final de una transacción.

Esto implica que pg_basebackup necesita conectarse con un usuario al que se le permite la conexión explícita con el protocolo de replicación. Esto se hace añadiendo líneas al fichero pg_hba.conf como estas:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   replication     myuser                                  peer
host    replication     myuser          10.0.0.1/32             peer 

 Al tener las opciones de conexión de casi todas las herramientas de PostgreSQL nos permite la conexión remota, lo que nos permite dejar el backup de los ficheros en un servidor secundario y si queremos comprimido, ¡qué más podemos pedir!

pg_basebackup --help
pg_basebackup obtiene un respaldo base a partir de un servidor PostgreSQL en ejecución.
 
Empleo:
  pg_basebackup [OPCIÓN]...
 
Opciones que controlan la salida:
  -D, --pgdata=DIR       directorio en el cual recibir el respaldo base
  -F, --format=p|t       formato de salida (plano (por omisión), tar)
  -r, --max-rate=TASA    máxima tasa a la que transferir el directorio de datos
                         (en kB/s, o use sufijos «k» o «M»)
  -R, --write-recovery-conf
                         escribe configuración para replicación
  -T, --tablespace-mapping=ANTIGUO=NUEVO
                         reubicar el directorio de tablespace de ANTIGUO a NUEVO
      --waldir=DIRWAL    ubicación para el directorio WAL
  -X, --wal-method=none|fetch|stream
                         incluye los archivos WAL necesarios,
                         en el modo especificado
  -z, --gzip             comprimir la salida de tar
  -Z, --compress=0-9     comprimir salida tar con el nivel de compresión dado
 
Opciones generales:
  -c, --checkpoint=fast|spread
                         utilizar checkpoint rápido o extendido
  -C, --create-slot      crear un slot de replicación
  -l, --label=ETIQUETA   establecer etiqueta del respaldo
  -n, --no-clean         no hacer limpieza tras errores
  -N, --no-sync          no esperar que los cambios se sincronicen a disco
  -P, --progress         mostrar información de progreso
  -S, --slot=NOMBRE      slot de replicación a usar
  -v, --verbose          desplegar mensajes verbosos
  -V, --version          mostrar información de versión, luego salir
      --no-slot          evitar la creación de un slot de replicación temporal
      --no-verify-checksums
                         no verificar checksums
  -?, --help             mostrar esta ayuda, luego salir
 
Opciones de conexión:
  -s, --dbname=CONSTR    cadena de conexión
  -h, --host=ANFITRIÓN   dirección del servidor o directorio del socket
  -p, --port=PORT        número de port del servidor
  -s, --status-interval=INTERVALO (segundos)
                         tiempo entre envíos de paquetes de estado al servidor
  -U, --username=NOMBRE  conectarse con el usuario especificado
  -w, --no-password      nunca pedir contraseña
  -W, --password         forzar un prompt para la contraseña
                         (debería ser automático) 

Backup comprimido con pg_basebackup

Un ejemplo de backup comprimido puede ser:

pg_basebackup -h server1 -U pgbackup -p 5434 -D /backup/Backup_full  -Ft -z -Xs –P

Este comando realiza un backup comprimido con gzip incluyendo los ficheros de wal necesarios para su recuperación. Si nuestra instancia tiene tablespaces en ubicaciones que no corresponden con el PGDATA este sistema es perfecto, ya que si la copia la realizamos en el mismo servidor (también se puede sin problemas) y lo sacamos sin compresión tendremos un error del tipo:

pg_basebackup: directory "/data_pgbench" exists but is not empty

Este error se produce porque el backup “plano” intenta realizar la copia de los tablespaces en la misma ruta que en origen, por lo al realizarse en localhost se produce al error al ya existir los ficheros. Si queremos hacer el backup sin compresión en plano (-Fp) y en el mismo servidor tenemos que realizar una conversión con –T de la siguiente forma:

pg_basebackup -h localhost -U pgbackup -p 5434 -D /backup/Backup_full 
-T "/postgrest1=/backup/Backup_full/postgrest1" 
-T "/postgrest2=/backup/Backup_full/postgrest2" 
-T "/postgrest3=/backup/Backup_full/postgrest3"
-Fp -Xs -P 

Con este sistema no se puede realizar la recuperación de uno solo de los objetos (para eso la complementamos con pg_dump) pero nos permite levantar de una forma rápida una réplica de nuestra instancia totalmente operativa y poder extraer de ella los datos que necesitemos.

Esperamos que osa sea de utilidad y os aficionéis al backup  de PostgreSQL con este comando tan útil.

Si no quieres perderte nada del mundo de las bases de datos y el open source, suscríbete a nuestra newsletter. Con un solo email al mes, estarás informado.

Fuente: https://www.postgresql.org/docs/10/app-pgbasebackup.html