
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