PostgreSQL – script para backup

Realizar copias de seguridad de bases de datos PostgreSQL es una tarea esencial, incluso en entornos pequeños o personales. A continuación, te muestro cómo implementar una solución sencilla con script Bash que hace un backup completo de todas las bases de datos de una instancia PostgreSQL, los comprime en gzip, y elimina los backups antiguos automáticamente.

Este script es ideal para servidores Linux con PostgreSQL instalado localmente.

Un cliente me ha pedido un sistema simple de backup para PostgreSQL. Este script hace un backup de todas las bases de datos de tu instancia PostgreSQL y las deja comprimidas en gzip.

#!/bin/bash

# Ruta donde se guardarán los backups
backup_dir="/var/backups/postgresql/"
mkdir -p "$backup_dir"

# Fecha actual para añadir al nombre de los archivos
backup_date=$(date +%Y-%m-%d)

# Días a conservar los backups
retention_days=30

# Obtener lista de bases de datos (excluyendo templates)
databases=$(sudo -u postgres psql -Atc "SELECT datname FROM pg_database WHERE datistemplate = false;")


# Backup de cada base de datos
for db in $databases; do
  echo "→ Haciendo backup de $db..."
  sudo -u postgres pg_dump -Fc "$db" | gzip > "$backup_dir${db}_${backup_date}.dump.gz"
done

# Limpieza de backups antiguos
echo "Eliminando backups de más de $retention_days días..."
find "$backup_dir" -type f -mtime +$retention_days -name "*.gz" -exec rm -f {} \;

echo "Backup completado correctamente en $backup_dir"

Notar que hemos añadido el “sudo -u postgres”.

Ahora podemos añadir esto al crontab para ejecutarlo como nos convenga.

Al final hay un rm -rf combinado con find para eliminar backups de más de N días de antigüedad.

Automatización con Cron

Puedes añadir este script al crontab para ejecutarlo automáticamente cada noche, por ejemplo a la 1:00 AM:

sudo crontab -e

Y añadir:

0 1 * * * /ruta/al/script/postgres_backup.sh >> /var/log/postgres_backup.log 2>&1

Asegúrate de que el script tenga permisos de ejecución (chmod +x postgres_backup.sh) y que /var/backups/postgresql/ tenga espacio suficiente.

Recomendaciones adicionales

  1. Separación por host o entorno
    Si tienes múltiples entornos (producción, staging…), añade un prefijo en el nombre del archivo:
    prod_dbname_2025-05-26.dump.gz.
  2. Envío a S3 o servidor externo
    Considera copiar los backups a un bucket de S3 u otro servidor remoto para mayor seguridad: bashCopyEditaws s3 cp "$backup_dir" s3://mi-bucket/backups/postgresql/ --recursive
  3. Encriptación (opcional)
    Si tus backups contienen datos sensibles, puedes cifrarlos con GPG: bashCopyEditgpg -c "$backup_dir${db}_${backup_date}.dump.gz"
  4. Notificaciones de error
    Configura alertas en caso de fallo con mailx o integración en Slack, por ejemplo si el script devuelve un código distinto de 0.

Restauración

Para restaurar uno de los backups comprimidos, usa:

gunzip -c prod_mibasededatos_2025-05-26.dump.gz | pg_restore -C -U postgres -d postgres

La opción -C recrea la base de datos si no existe.

Conclusión

Este sistema de backup puede no sustituir a soluciones más avanzadas como pgBackRest o Barman, pero es una forma eficaz y sencilla de proteger tus datos con herramientas disponibles en cualquier sistema Linux.

¿Ya haces copias de seguridad de tus bases de datos? ¿Cada cuánto las revisas? ¡Déjalo en los comentarios!

Links

3 thoughts on “PostgreSQL – script para backup

Leave a Reply

Your email address will not be published. Required fields are marked *