CodeGym /Cursos /SQL SELF /Configuración de automatización de backups con pg_...

Configuración de automatización de backups con pg_cron y cron en Linux

SQL SELF
Nivel 44 , Lección 0
Disponible

Automatizar los backups es como tener un cepillo de dientes automático, pero para tu base de datos. Hacer copias de seguridad regularmente salva el mundo (bueno, tus datos) de catástrofes. Nadie quiere recibir un mensaje a las 3 de la mañana diciendo que el servidor se cayó y darse cuenta de que el último backup fue hace dos semanas. La automatización resuelve este problema: nunca más arriesgues tus datos por culpa del factor humano.

Hay un montón de herramientas para automatizar, pero hoy vamos a hablar de las dos más populares:

  1. cron — el planificador de tareas universal y de toda la vida en Linux.
  2. pg_cron — una extensión de PostgreSQL que te deja lanzar tareas directamente desde el propio servidor de base de datos.

La extensión pg_cron por debajo tira del servicio cron. ¡Este servicio solo está disponible en Linux!

¡Vamos allá!

Instalación de pg_cron

pg_cron es una extensión de PostgreSQL que te permite programar tareas automáticas directamente en la base de datos. Es bonito, cómodo y lleva tu PostgreSQL al nivel de un mini centro de operaciones.

Pasos para instalar:

  1. Asegúrate de estar usando PostgreSQL 10+, porque pg_cron solo funciona en versiones modernas.
  2. Instala la extensión usando el gestor de paquetes de tu sistema. Por ejemplo, en Ubuntu:

    sudo apt install postgresql-<version>-cron
    

    Sustituye <version> por la versión de PostgreSQL que tengas instalada.

  3. Activa la extensión en la configuración de PostgreSQL. Abre el archivo postgresql.conf y añade:

    shared_preload_libraries = 'pg_cron'
    

    ¿Por qué? pg_cron necesita que la librería se cargue al arrancar PostgreSQL — es obligatorio.

  4. Reinicia el servidor de PostgreSQL:

    sudo systemctl restart postgresql
    
  5. Activa la extensión en tu base de datos:

    CREATE EXTENSION pg_cron;
    

¡En este punto pg_cron ya está listo para usarse!

Crear una tarea para hacer backups automáticos

La gracia de pg_cron es que puedes lanzar comandos a la hora que quieras. Vamos a crear una tarea para ejecutar pg_dump automáticamente.

Ejemplo:

SELECT cron.schedule(
    'backup_nocturno', -- nombre de la tarea
    '0 2 * * *', -- horario (cada noche a las 2)
    $$pg_dump -U username -F c -f /backups/university_backup.dump university$$ -- comando
);

Destripando la magia:

  • 'backup_nocturno' — es el nombre personalizado de la tarea, así la puedes identificar fácil.
  • '0 2 * * *' — horario en formato cron: todos los días a las 2:00.
  • El comando dentro de $$ $$: ejecutamos pg_dump para crear una copia de seguridad de la base university.

¡Después de crear la tarea, se ejecutará según el horario!

Ver y borrar tareas de pg_cron

Para ver todas las tareas existentes:

SELECT * FROM cron.job;

Si alguna tarea ya no te sirve, bórrala así:

SELECT cron.unschedule(job_id);

Sustituye job_id por el identificador de la tarea que te salga en la consulta anterior.

Usar cron para automatizar

Si prefieres el método clásico de Linux para automatizar o pg_cron no está disponible por alguna razón, el todopoderoso cron te salva.

Configurar una tarea con cron

Primero asegúrate de que cron está instalado y funcionando:

sudo systemctl enable cron
sudo systemctl start cron

Ahora añade una tarea para crear el backup. Abre el editor para configurar tareas de cron:

crontab -e

Añade esta línea:

0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university

Esta línea mágica hace lo siguiente:

  • A las 2 de la mañana cada día (0 2 * * *) crea una copia de seguridad de la base university.
  • Todos los backups se guardan en el archivo /backups/university_backup.dump.

Después de guardar el archivo crontab, la tarea programada empezará a ejecutarse.

Logs de ejecución de cron

A veces viene bien saber qué salió mal. Asegúrate de que la salida de los comandos se guarda en un archivo de log para poder revisarla. Para eso, añade un redireccionamiento de salida al comando:

0 2 * * * pg_dump -U username -F c -f /backups/university_backup.dump university >> /var/log/backup.log 2>&1

Ahora todo lo que pase durante la tarea se guardará en /var/log/backup.log.

Comparación entre pg_cron y cron

Así que tenemos dos herramientas potentes. ¿Cómo elegir la mejor?

  • pg_cron es ideal si quieres programar y gestionar tareas directamente desde PostgreSQL. Es cómodo, no tienes que salir de la base de datos y puedes escalar tareas fácil.

  • cron es más universal. Puedes usarlo no solo para PostgreSQL, sino para automatizar cualquier cosa.

Característica pg_cron cron
Facilidad de integración Integrado en PostgreSQL, pero requiere extensión Funciona para cualquier proceso
Instalación Requiere instalar extensión Viene en la mayoría de sistemas Linux
Logs Se guardan en PostgreSQL (tabla cron.job_run_details) Se escriben en logs del sistema (normalmente /var/log/syslog)
Flexibilidad Solo ejecuta SQL dentro de PostgreSQL Puedes lanzar cualquier comando, script o binario

Comprobar que las tareas funcionan

Para comprobar que el backup funciona, puedes lanzar el comando de cron manualmente:

pg_dump -U username -F c -f /backups/university_backup.dump university

También es útil revisar si los archivos de backup están en la carpeta indicada, su tamaño y la fecha de creación. Por ejemplo:

ls -lh /backups/

Revisa los logs regularmente y asegúrate de que las tareas se ejecutan bien.

Protección sencilla contra errores típicos

Error nº1: "¡Se me olvidaron los permisos!"

Si el usuario que ejecuta cron no tiene permisos para usar pg_dump, las tareas no van a funcionar. Asegúrate de que el usuario tiene acceso a la base de datos.

Error nº2: "¡El archivo fue a otro sitio!"

Siempre pon la ruta completa a los archivos y comandos. cron no sabe nada de tu entorno — la ruta completa es obligatoria: pg_dump -> /usr/bin/pg_dump.

Error nº3: "¿Dónde están mis logs?"

No te olvides de redirigir la salida del comando a un archivo de log. Sin eso, no tendrás ninguna info sobre los problemas.

¡A estas alturas ya estás listo para automatizar los backups de tu base de datos! Así, aunque el servidor se vaya de vacaciones de repente, tus datos estarán a salvo.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION