Respaldos PostgreSQL con Bash

Clase 41 de 43Curso de Programación en Bash Shell

Resumen

Implementa con confianza un flujo completo de backup y restore para Postgres en Bash. Aquí verás cómo validar directorios, gestionar permisos con sudo, generar archivos .back con fecha y restaurar en una base de datos destino usando pg_dump y pg_restore, tal como se construyó en el script 32.

¿Cómo automatizar backups en Postgres con Bash?

La lógica inicia listando bases de datos para elegir cuál respaldar. Se usa el primer argumento del script como directorio de destino, se valida su existencia y se aseguran permisos antes de ejecutar el respaldo. El archivo se guarda con nombre y fecha, por ejemplo: BDD_respaldo_2018-12-19.back.

  • Listar bases de datos con sudo -u postgres psql -c "\l".
  • Capturar la base a respaldar con read -p.
  • Validar el directorio argumento 1 con [ -d "$1" ].
  • Ajustar permisos con chmod 755 vía sudo.
  • Generar la fecha con date en formato año-mes-día.
  • Ejecutar pg_dump para crear el .back.
# Listar bases de datos
sudo -u postgres psql -c '\l'

read -p "Elegir la base de datos a respaldar: " bdd_respaldo

# Directorio recibido como primer argumento
dir_backup="$1"

if [ -d "$dir_backup" ]; then
  # Permisos (requiere privilegios de sudo)
  sudo chmod 755 "$dir_backup"
  echo -e "Realizando respaldo...\n"

  fechaActual=$(date +"%Y-%m-%d")
  archivo="$dir_backup/BDD_respaldo_${fechaActual}.back"

  # Respaldo con pg_dump en formato personalizado
  sudo -u postgres pg_dump -F c -f "$archivo" "$bdd_respaldo"

  echo "Respaldo realizado correctamente en: $archivo"
else
  echo "El directorio que viene con el argumento número 1 no existe."
fi

¿Qué variables y comandos son clave?

  • Argumento 1: directorio de backups, evita pedirlo de nuevo.
  • fechaActual: se arma con date y formato %Y-%m-%d.
  • Mensajes con echo -e: para saltos de línea y retroalimentación clara.
  • Permisos 755: garantizan ejecución y lectura del directorio.

¿Cómo validar, listar y elegir un respaldo para restaurar?

Para restaurar, primero se lista el contenido del directorio de backups, se elige el archivo .back y se solicita la base de datos destino. Si la BDD no existe, se crea. Luego se ejecuta pg_restore y se valida listando de nuevo las bases.

  • Ingresar directorio de backups y listar con ls -la.
  • Elegir el archivo .back a restaurar con read -p.
  • Solicitar BDD destino y verificar si existe con psql + grep.
  • Crear la BDD si no existe con CREATE DATABASE.
  • Validar el archivo con [ -f ] antes de restaurar.
  • Restaurar con pg_restore -F c -d y listar con \l.
read -p "Ingresar el directorio donde están los respaldos: " dir_backup
ls -la "$dir_backup"

read -p "Elegir el respaldo a restaurar: " respaldo_restaurar
read -p "Ingrese el nombre de la base de datos destino: " bdd_destino

# Verificar si la BDD destino existe
a=$(sudo -u postgres psql -tA -c '\l' | cut -d '|' -f1 | grep -wq "$bdd_destino")
if sudo -u postgres psql -tA -c '\l' | cut -d '|' -f1 | grep -wq "$bdd_destino"; then
  echo "Restaurando en la BDD destino: $bdd_destino"
else
  sudo -u postgres psql -c "CREATE DATABASE $bdd_destino;"
fi

# Verificar archivo y restaurar
if [ -f "$dir_backup/$respaldo_restaurar" ]; then
  echo "Restaurando respaldo..."
  sudo -u postgres pg_restore -F c -d "$bdd_destino" "$dir_backup/$respaldo_restaurar"
  sudo -u postgres psql -c '\l'
else
  echo "No existe el respaldo: $respaldo_restaurar"
fi

¿Cómo se verifica correctamente el proceso?

  • Listando bases antes y después con psql -c "\l".
  • Confirmando mensajes de éxito: "Respaldo realizado correctamente" y "Restaurando respaldo...".
  • Observando el archivo .back con la fecha, por ejemplo: 2018-12-19.

¿Qué errores comunes resolver y cómo probar?

Durante la prueba se corrigieron detalles prácticos: falta de espacio en un comando, uso de un carácter incorrecto en lugar de pipe y necesidad de usar el path completo al validar el archivo del respaldo. También se ajustó la verificación de existencia de archivo con la ruta completa del argumento 1.

  • Usar el path completo del respaldo al verificar con [ -f ].
  • Reemplazar el carácter incorrecto por | para el pipe.
  • Cuidar espacios en comandos, especialmente en psql y banderas.
  • Probar el flujo: opción 3 para sacar respaldo y opción 4 para restaurar.
  • Ejemplo funcional: BDD_respaldo_2018-12-19.back restaurado en una BDD destino llamada "prueba".
  • Utilidades usadas: ls, read -p, echo -e, sleep, sudo, chmod, psql, pg_dump, pg_restore.

Si quieres, comparte en comentarios tu versión del script 32, dudas puntuales o cómo resolviste los retos planteados para retroalimentarnos entre todos.