Actualidad

Copias de seguridad programadas en PostgreSQL

Por Zéltika


Publicado 3 enero, 2023
Categorías:

El objetivo de este artículo es documentar cómo realizar una copia de seguridad de una base de datos PostgreSQL en un servidor Ubuntu para automatizarla.

Esto nos viene muy bien si estamos usando aplicaciones basadas en este sistema de base de datos, como puede ser Odoo.

Para ello vamos a realizar las siguientes tareas.

 

Cómo crear copia de seguridad en PostgreSQL

PostgreSQL proporciona la utilidad pg_dump para simplificar la copia de seguridad de una sola base de datos. Este comando debe ejecutarse como un usuario con permisos de lectura en la base de datos que desea respaldar.

En primer lugar, accedemos al usuario postgres:

su - postgres

Volcamos el contenido de una base de datos a un fichero:

pg_dump dbnombre > dbnombre.bak

El archivo de respaldo resultante, "dbnombre.bak", puede transferirse a otro host con scp o almacenarse localmente para su uso posterior. Es recomendable añadir una etiqueta identificativa como la fecha:

pg_dump dbnombre > dbnombrebackup-$(date +"%d%m%Y").bak

Se debe comprobar periodicamente que nuestras copias de seguridad se restauran sin problema. En caso de no hacerlo, podemos estar en problemas de cara a futuro.

 

Cómo enviar ficheros por ftp desde Ubuntu

Usando ftp:

Una vez realizada la copia, debemos enviarla a un lugar de almacenamiento diferente de nuestro equipo. Para ello usaremos un FTP.

Podemos usar el comando ftp que tenemos disponible por defecto y permite a los usuarios interactuar con servidores FTP y gestionar los archivos del servidor remoto.

En primer lugar vamos a establecer la conexión con el servidor FTP, para esto empleamos el comando:

ftp -np ftp.servidor.com

En este comando vemos que empleamos las opciones -np que quieren decir:

-n: evita la autentificación de forma automática durante el establecimiento de la conexión. De esta forma será necesario introducir manualmente el nombre de usuario y la contraseña.
-p: usa el modo pasivo para las transferencias de archivos. Esto es útil cuando el servidor FTP está detrás de un firewall, pero también es necesario que el servidor remoto tenga soporte para el modo pasivo.

Tras ejecutar este comando tendremos que autentificarnos con un usuario y contraseña, ya que nuestro servidor FTP así lo requiere. Para autentificarnos usaremos el comando:

ftp> user usuario contraseña.

Llegados este punto usaremos el comando FTP put para enviar el archivo:

ftp> put /tmp/backup.tar.gz /backups/backup_copy.tar.gz

 

En este comando se diferencian tres partes:

put: es el comando FTP que envía un archivo al servidor remoto.
/tmp/backup.tar.gz: es el archivo local que queremos transferir por FTP.
/backups/backup_copy.tar.gz: es el archivo remoto. En nuestro ejemplo hemos especificado que se guarde dentro de la carpeta backups, pero para que todo vaya bien, esa carpeta tiene que existir y tener permisos de escritura para nuestro usuario. Si no especificamos un nombre de archivo remoto, se empleará el nombre del archivo local.

Para finalizar, nos desconectamos del servidor FTP con el comando:

ftp> quit

Si queremos automatizarlo, como es nuestro caso, podemos utilizar:

ftp -n <<EOF
open ftp.ejemplo.com
user usuario contraseña
put archivo.tar.gz
EOF

 

Una alternativa al cliente ftp es usar cURL.

 

Usando cURL:

Para instalar cURL ejecutamos el comando:

sudo apt-get install curl

Para subir un archivo por FTP con cURL ejecutamos desde la terminal:

curl -T backup.tar.gz ftp://192.168.247.128 --user usuario:contraseña

Ya solo nos queda automatizar la realización de la copia en nuestro servidor.

 

Automatizar la tarea de copia de seguridad con Cron

Por último, veamos cómo automatizar esta tarea para que sea realizada por el sistema de forma automática con la periodicidad que deseemos.

Cron

Cron es un demonio concebido para ejecutar tareas previamente programadas de forma periódica. Y como cualquier demonio o servicio en Linux podemos arrancarlo, pararlo, reiniciarlo o comprobar su estado con el comando service:

sudo service cron start
sudo service cron stop
sudo service cron restart
sudo service cron status

Crontab

Crontab es el nombre que se le da a los archivos dónde definimos las tareas programadas. En él definimos la frecuencia con la que se ejecutarán. Existe un archivo crontab «principal» /etc/crontab, que será gestionado por el administrador del equipo, pero además cada usuario del sistema tiene el suyo propio archivo.

Los ficheros crontab son simples ficheros de texto dónde especificaremos una tarea por línea, y la estructura de cada línea es la siguiente:

# ┌───────────── minutos
# |
# │ ┌───────────── horas
# | |
# │ │ ┌───────────── día del mes
# | | |
# │ │ │ ┌───────────── mes
# | | | |
# │ │ │ │ ┌───────────── día de la semana
# │ │ │ │ │
# │ │ │ │ │
* * * * * comando

Como se puede apreciar, en cada línea hay cinco campos reservados a definir la periodicidad, y uno más para hacer lo propio con el comando a ejecutar, todos ellos separados por espacios. Todos los campos deben ser rellenados obligatoriamente. Los rangos de valores posibles para cada campo son:

  • Campo minutos: 0 – 59
  • Campo horas: 0 – 23
  • Campo día del mes: 0 – 31
  • Campo mes: 1 – 12
  • Campo día de la semana: 0 – 6, dónde 0 es domingo y 6 sábado.

Caracteres especiales en crontab

Para definir la periodicidad de la tarea, podemos ayudarnos de algunos «modificadores» que nos permitirán ampliar enormemente las posibilidades:

Combinación Significado Ejemplo
* Todos los valores *
, Listado de valores 2,5,9
Rango de valores 5-9
/ Cada */5
rango/excep. Excepto 0-23/2

Otro carácter imprescindible es la almohadilla (#), que lo utilizaremos al comienzo de una línea para indicar que es un comentario.

Ejemplos de tareas programadas

Para disipar cualquier duda que podamos tener con respecto de los ficheros crontab, lo más sencillo es que veamos algunos ejemplos:

# Diariamente a las 02:00 am, ejecutamos el script definido
* 2 * * * service /home/user/script.sh
# Cada lunes a las 02:00 am, reiniciamos Apache
* 2 * * 1 service apache2 restart
# Cada 5 minutos, monitoreamos el estado de nuestra web
*/5 * * * * /home/user/checkSiteStatus.sh
# Cada hora, limpiamos la cache
0 * * * * * /home/user/cleanCache.sh
# De lunes a viernes a las 14:00, enviamos un e-mail
0 14 * * 1-5 /home/user/mail.sh
# los días 5,15 y 25 del mes a las 00:00, enviamos un informe
0 0 5,15,25 * * /home/user/sendReport.sh

Como ves, este sistema es realmente sencillo y versátil, ofreciéndonos muchas opciones para programar la ejecución de nuestras tareas. Si aún así tienes dudas, puedes realizar tus pruebas en la web Crontab Guru, una herramienta on-line muy útil.

Administrar las tareas programadas en Cron

Ahora que ya tenemos claros los fundamentos, vamos a ver como realizar las tareas más habituales.

Agregar una nueva tarea

Ya hemos explicado que para programar una tarea debemos incluirla en el archivo crontab, y para ello utilizaremos nuestro editor preferido:

sudo vim /etc/crontab

Pero además del archivo principal de crontab, cada usuario tiene el suyo propio, de forma que podemos programar tareas sin ser administrador del equipo. Para editar este archivo utilizaremos la orden:

crontab -e

Y si tenemos los permisos necesarios, poder editar el archivo crontab de otros usuarios ayudándonos del modificador -u seguido del nombre de usuario:

crontab -e -u usuario

Así que ahora solo quedaría agregar las tareas que nos interesen siguiendo las indicaciones que ya hemos visto. Aprovecho para hacer referencia al artículo Comandos en Vim por si quéreis echarle un vistazo,

Ver las tareas programadas

En este punto podemos hacer uso de alguno de los múltiples comandos que nos ofrece Linux para visualizar archivos como puede ser el comando more:

more /etc/crontab

O en caso de querer ver el archivo crontab de un usuario lo haremos con la orden crontab -l, utilizando o no el modificador -u en función de nuestras necesidades:

crontab -l
crontab -u usuario -l

Resetear el archivo crontab

Esta opción bien podría haberla omitido por lo delicada, pero ahí la dejo:

crontab -r

Ojo que no pide confirmación.

Logs en Cron

Los logs de Cron se almacenan en el archivo /var/log/syslog, pero este archivo contiene otros logs además de los que nos interesan. Si queremos ver exclusivamente los losg de cron podemos lanzar el siguiente comando:

grep CRON /var/log/syslog

La información que recibiremos no es muy detallada, pero en caso de tener alguna duda es buen buen lugar para comenzar a investigar.

 

Conclusión

Con esta información ya estamos en disposición de crear una copia se seguridad automatizada de nuestras bases de datos. Recordar comprobar la correcta ejecución y la restauración para prevenir posibles pérdidas de información.

 

Ejemplo:

Creamos un fichero .sh en /etc/odoo/backup:


#!/bin/bash
sudo -u postgre pg_dump odoo22 > odoo22-$(date +"%Y%m%d").bak
curl -k -T odoo22-$(date +"%Y%m%d").bak sftp://server --user username:password

 

 

Fuentes:
URL:https://www.ochobitshacenunbyte.com/2020/09/10/copias-de-seguridad-en-postgresql-y-como-restaurarlas/
URL:https://www.vozidea.com/como-enviar-un-archivo-por-ftp-desde-la-consola-en-linux
URLhttps://blog.ahierro.es/programar-tareas-en-ubuntu-con-cron/


Comentarios cerrados.