Link

pg_backup.sh - backing up PostgreSQL databases

Poorly written bash script which backups Postgres databases and e-mails me:

#!/bin/bash

set -o pipefail

_db_user=${POSTGRES_USER}
_db_host=${POSTGRES_HOST}
_root_backup_path=${NFS_MOUNT}/pg_backups

_failed_backups=()

PGBACKUP=""

_db2backup=$(psql -w -t -h ${_db_host} -U ${_db_user} -c "SELECT datname FROM pg_database where datname not in ('template0', 'template1', 'postgres')")

now_cet() {
  unset _current_cet
  date +%Y-%m-%d_%Hh%Mm%Ss_%Z
}

emailDate() {
  date "+%H:%M - %A, %d/%m/%Y %Z"
}

_backup_path="${_root_backup_path}/$(now_cet)"

sendEmailOk() {
  echo "Backups for $(emailDate) finished successfully.

  The following dababases where backed up:

$(for db in ${_db2backup}; do
    echo "  - $db: ${_backup_path}/${db}.sql"
  done)" | mail -s "PostgreSQL: Backups $(emailDate) OK" ${ALERTS_EMAIL}
}

sendEmailError() {
  echo "Something went wrong with while backing up the following databases:  $(for db in ${_failed_backups}; do
    echo "  - $db"
  done)" | mail -s "PostgreSQL: ERROR -> Backups $(emailDate) FAILED" ${ALERTS_EMAIL}
}

mkdir $_backup_path

echo " ========================================================"
echo "    "$(now_cet)" - Starting PG db backups"
echo " ========================================================" && echo ""

for db in ${_db2backup}; do
  _dump_name="${_backup_path}/${db}.sql"
  echo "  Backing up ${db}: ${_dump_name}"
  pg_dump -U ${_db_user} -w -F p --inserts -h ${_db_host} ${db} >${_dump_name}
  rc=$?
  if [[ $rc != 0 ]]; then
    echo '    ERROR'
    export PGBACKUP=ERROR
    export _failed_backups+=("$db")
  else
    echo '    OK'
  fi
  printf "\n"
done

if [[ $PGBACKUP == "ERROR" ]]; then
  echo "" && echo " >>> ERROR: Something went wrong during the backup process"
  sendEmailError
else
  echo "  Cleaning up backup directory ${_backup_path}."
  for file in $(find ${_root_backup_path}/ -mmin +2160 -name '*.sql'); do
    echo "  Deleting $file ."
    #find ${_root_backup_path}/ -type d -mtime +2 -execdir rmdir -- '{}' \;
  done
  echo "" && echo " >>> INFO: Database backups successfully completed"
  sendEmailOk
fi
printf "\n\n"

Expected e-mail:

Backups for 00:00 - Thursday, 09/01/2019 CET finished successfully.

  The following dababases where backed up:

  - db1: /somefs/pg_backups/2019-01-09_00h00m01s_CET/db1.sql
  - db2: /somefs/pg_backups/2019-01-09_00h00m01s_CET/db2.sql
  - db3: /somefs/pg_backups/2019-01-09_00h00m01s_CET/db3.sql
  [...]
  - db50: /somefs/pg_backups/2019-01-09_00h00m01s_CET/db50.sql