DEV Community

Cover image for Automatizando Backups no PostgreSQL

Automatizando Backups no PostgreSQL

Agora que você esta pronto, Vamos lá !
Recentemente, precisei criar alguns scripts para implementar backups automatizados para o meu ambiente de produção com o PostgreSQL. Desenvolvi um script de backup no ambiente de produção e salvo o backup no servidor de homologação para posterior restauração.
Usando o cronjob, você possui uma a automatização da execução desses backups . Os scripts produzem os seguintes formatos de backups:
Backup simples: produz uma versão gzip do script SQL
Backup personalizado: produz um arquivo compactado em formato personalizado, adequado para entrada no pg_restore.
Crie o arquivo pg_backup.sh e cole o seguinte conteúdo nele.

#!/bin/bash
##############################
## POSTGRESQL BACKUP CONFIG ##
##############################
# Optional hostname to adhere to pg_hba policies. Will default to "localhost" if none specified.
HOSTNAME=localhost
# Optional username to connect to database as. Will default to "postgres" if none specified.
USERNAME=postgres
# This dir will be created if it doesn't exist. This must be writable by the user the script is
# running as.
BACKUP_DIR=/home/jcottobboni/backups/database/postgresql/
SUFFIX="-daily"
FINAL_BACKUP_DIR=$BACKUP_DIR"`date +\%Y-\%m-\%d`$SUFFIX/"
# Database name to backup
DATABASE=db_name
# Will produce a custom-format backup if set to "yes"
ENABLE_CUSTOM_BACKUPS=yes
# Will produce a gzipped plain-format backup if set to "yes"
ENABLE_PLAIN_BACKUPS=yes
#### SETTINGS FOR ROTATED BACKUPS ####
# Number of days to keep daily backups
DAYS_TO_KEEP=15
#### SETTINGS FOR COPY BACKUPS ####
STAGING_ADDRESS='user@ip'
STAGING_FOLDER="$FINAL_BACKUP_DIR"
###########################
### INITIALISE DEFAULTS ###
###########################
if [ ! $HOSTNAME ]; then
HOSTNAME="localhost"
fi;
if [ ! $USERNAME ]; then
USERNAME="postgres"
fi;
###########################
#### START THE BACKUPS ####
###########################
function perform_backups()
{
./slack-cli chat send "Starting backup to database ${DATABASE}" '##slack-channel-name'
echo "Making backup directory in $FINAL_BACKUP_DIR"
if ! mkdir -p $FINAL_BACKUP_DIR; then
echo "Cannot create backup directory in $FINAL_BACKUP_DIR. Go and fix it!" 1>&2
exit 1;
fi;
echo -e "\n\nPerforming full backup of $DATABASE"
echo -e "--------------------------------------------\n"
if [ $ENABLE_PLAIN_BACKUPS = "yes" ]
then
echo "Plain backup of $DATABASE"
if ! pg_dump -Fp -h $HOSTNAME -U $USERNAME $DATABASE | gzip > $FINAL_BACKUP_DIR$DATABASE.sql.gz.in_progress; then
echo "[!!ERROR!!] Failed to produce plain backup database $DATABASE" 1>&2
else
mv $FINAL_BACKUP_DIR$DATABASE.sql.gz.in_progress $FINAL_BACKUP_DIR$DATABASE.sql.gz
fi
fi
if [ $ENABLE_CUSTOM_BACKUPS = "yes" ]
then
echo "Custom backup of $DATABASE"
if ! pg_dump -Fc -h $HOSTNAME -U $USERNAME $DATABASE -f $FINAL_BACKUP_DIR$DATABASE.custom.in_progress; then
echo "[!!ERROR!!] Failed to produce custom backup database $DATABASE"
else
mv $FINAL_BACKUP_DIR$DATABASE.custom.in_progress $FINAL_BACKUP_DIR$DATABASE.custom
fi
fi
./slack-cli chat send "Finishing Backup Production for database: ${DATABASE}" '#slack-channel-name'
echo -e "\nDatabase backup complete!"
}
function copy_backups_to_staging_server()
{
echo "Making backup directory in $FINAL_BACKUP_DIR on Staging Server"
if ! ssh $STAGING_ADDRESS "mkdir -p $FINAL_BACKUP_DIR"; then
echo "Cannot create backup directory in $FINAL_BACKUP_DIR. Go and fix it!" 1>&2
exit 1;
fi;
scp $FINAL_BACKUP_DIR$DATABASE.sql.gz $STAGING_ADDRESS:$STAGING_FOLDER
}
# DAILY BACKUPS
# Delete daily backups older than DAYS_TO_KEEP
find $BACKUP_DIR -maxdepth 1 -mtime +$DAYS_TO_KEEP -name "*-daily" -exec rm -rf '{}' ';'
perform_backups
copy_backups_to_staging_server
view raw pg_backup.sh hosted with ❤ by GitHub

Agora precisamos conceder ao script permissão de execução

chomd +x pg_backup.sh
Enter fullscreen mode Exit fullscreen mode

Os comando scp envia uma cópia do backup para outro servidor, neste exemplo, envio para o meu servidor de homologação para manter uma copia atual todos os dias em homologação, além da redundância ao guardar o arquivo sempre que preciso restaurar a base de homologação ja tenho um arquivo no servidor, mas você pode enviar para qualquer máquina que desejar, para este comando funcionar sem a necessidade de digitar a senha, é necessário copiar sua chave ssh para o servidor com este comando:

ssh-copy-id -i ~/.ssh/id_rsa.pub 'user'@'server-address-or-ip'
Enter fullscreen mode Exit fullscreen mode

Por último para que esse backup seja executado automaticamente precisamos criar uma entrada no agendador de tarefas do linux, digite o comando para abrir o crontab:

crontab -e
Enter fullscreen mode Exit fullscreen mode

Agora insira esta linha no arquivo

# PostgreSQL Backup
 00 00 * * * /path/to/script/pg_backup.sh
Enter fullscreen mode Exit fullscreen mode

Top comments (0)