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
- 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
. - 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
- Encriptación (opcional)
Si tus backups contienen datos sensibles, puedes cifrarlos con GPG: bashCopyEditgpg -c "$backup_dir${db}_${backup_date}.dump.gz"
- Notificaciones de error
Configura alertas en caso de fallo conmailx
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
- http://www.defitek.com/blog/2010/01/06/a-simple-yet-effective-postgresql-backup-script/comment-page-1/#comment-821
- http://wiki.postgresql.org/wiki/Automated_Backup_on_Linuxhttp://www.postgresql.org/docs/8.1/static/backup.html
- http://www.cyberciti.biz/tips/howto-backup-postgresql-databases.html
- https://www.rubenortiz.es/2025/05/26/liberar-espacio-en-disco-en-rds-postgresql-por-replicacion-logica/
gracias x compartirlo…me funcionó perfectamente pero a la hora de ponerlo en el cron me pide contraseña???
Hola
hice esto hace bastante y no lo tengo por la mano. Pero entiendo que no debería pedirte nada 🙂
ejectuta el cron con el usuario postgres que sale haciendo “la willy”