Script y método de uso para respaldar la base de datos Postgre en Docker
Este esquema utiliza la herramienta de copia de seguridad lógica nativa de PostgreSQL, `pg_dump`, junto con scripts en el host y tareas programadas, para lograr la captura periódica y la recuperación segura de los datos.
Renderizando...
Este plan utiliza la herramienta de copia de seguridad lógica nativa de PostgreSQL, `pg_dump`, junto con scripts del host y tareas programadas, para lograr la captura periódica de datos y su recuperación segura.
> El contenido del artículo se basa en un entorno Linux. Para otros entornos como Windows, modifíquelo según sea necesario.
## 1. Preparación del script
```bash
#!/bin/bash
# --- Configuración ---
CONTAINER_NAME="pgsql" # Nombre de tu contenedor
DB_USER="postgres" # Usuario de la base de datos
DB_NAME="loden" # Nombre de la base de datos (usar "all" para todas las bases de datos)
BACKUP_DIR="/root/pgsql/backup" # Ruta de backup en el host
DATE=$(date +%Y%m%d_%H%M%S) # Formato de fecha para el nombre del archivo
RETENTION_DAYS=10 # Días de retención
# --- Asegurar que el directorio existe ---
mkdir -p $BACKUP_DIR
# --- Ejecutar la copia de seguridad ---
# Principio: Ejecutar pg_dump dentro del contenedor y redirigir la salida estándar (stdout) a un archivo en el host
echo "Haciendo backup del contenedor [$CONTAINER_NAME] ..."
if [ "$DB_NAME" == "all" ]; then
# Hacer backup de todas las bases de datos
docker exec $CONTAINER_NAME pg_dumpall -c -U $DB_USER > "$BACKUP_DIR/full_backup_$DATE.sql"
else
# Hacer backup de una sola base de datos (recomendado usar formato personalizado -Fc, comprimido y de recuperación rápida)
docker exec $CONTAINER_NAME pg_dump -U $DB_USER -F c $DB_NAME > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump"
fi
# Verificar si el archivo de backup se generó (y que su tamaño no sea 0)
if [ -s "$BACKUP_DIR/${DB_NAME}_${DATE}.dump" ] || [ -s "$BACKUP_DIR/full_backup_$DATE.sql" ]; then
echo "¡Backup exitoso!"
else
echo "Fallo en el backup, por favor verifica el estado del contenedor o los logs."
# Opcional: Enviar correo de alerta en caso de fallo
exit 1
fi
# --- Limpiar backups antiguos ---
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -name "*.dump" -delete
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -name "*.sql" -delete
```
## 2. Configuración del entorno
Antes de ejecutar el script, asegúrate de que tu entorno host esté listo:
1. **Crear directorio de backup**: Se recomienda almacenar los archivos de backup en una ruta independiente fuera del punto de montaje de Docker:
```Bash
mkdir -p /root/pgsql/backup
```
2. **Dar permisos de ejecución al script**:
```Bash
chmod +x /root/pgsql/pg_backup.sh
```
3. **Configurar entorno sin contraseña (clave)**: Para que el script se ejecute automáticamente sin supervisión, necesitas evitar que solicite la contraseña. Hay dos métodos nativos:
- **Método A (Recomendado)**: Añadir `PGPASSWORD: tu_contraseña` en `environment` del `docker-compose.yml`.
- **Método B**: Añadir la variable de entorno en la línea de backup del script, por ejemplo: `docker exec -e PGPASSWORD=... $CONTAINER_NAME pg_dump ...`.
## 3. Activar backup automático
Usa la tarea programada `crontab` integrada de Linux para que el script de backup se ejecute automáticamente en horas de baja actividad, como la madrugada. Por ejemplo:
1. Ingresa el comando para abrir el editor: `crontab -e`
2. Añade una línea de configuración (ejecutar backup todos los días a las 3:00 AM):
```Bash
0 3 * * * /bin/bash /root/pgsql/pg_backup.sh >> /root/pgsql/backup.log 2>&1
```
*Nota: La parte `>> ...log` guardará el registro del backup, facilitando la verificación de su éxito.*
## 4. Recuperación de datos
Cuando ocurra una eliminación accidental de datos (como `TRUNCATE` o `DROP`), sigue estos pasos para recuperarlos.
Antes de recuperar, verifica el formato del archivo de backup. Si tu script hizo backup de una base de datos específica (`-F c`), la extensión del archivo suele ser `.dump`. Este tipo de archivos debe restaurarse con la herramienta `pg_restore`.
Comando de recuperación: En el host, restaurar directamente el backup a la base de datos especificada
```Bash
docker exec -i pgsql pg_restore -U postgres -d loden_new --clean --if-exists < /root/pgsql/backup/loden_20260106_164814.dump
```
Explicación de parámetros comunes del comando de recuperación:
- `-d <db_name>`: Especifica la base de datos destino (se recomienda crear primero una base de datos de prueba para practicar la recuperación, como `loden_new` en el comando).
- `--clean`: Limpia los objetos de datos existentes antes de la recuperación (peligroso pero efectivo).
- `-j <n>`: Ejecuta tareas de recuperación en paralelo. Si la base de datos es muy grande, se puede usar `-j 4` para acelerar el proceso.Comentario
Inicia sesión para ver y publicar comentarios
Ir a iniciar sesión