PgBackupAll

From campisano.org
Jump to navigation Jump to search

This script make a full backup of all PostgreSQL databases and sent email with the status. Optionally, it can send the backup by the email itself or by FTP . It is possible to restore this backup following the info at PostgreSQL.

Requirements

The dest path (default /srv/backup/data/postgresql/alldatabases/) must exists and be owned by postgres user, and the required commands (pg_dumpall, gzip, mail, mutt, ftp) must be installed (apt-get install mailutils mutt gzip ftp).

Script

#!/bin/bash
#
# NAME      postgres_backup_all.sh
# VERSION   1.2
# REQUIRED  pg_dumpall, gzip, mail, mutt , ftp
#
# Note:
# you can use it with cron add something like the follows in the crontab
#
# 00 4   *     *     *     root   cd /tmp && run-parts --report --regex='^[a-zA-Z0-9_-]+\.sh$' /etc/cron/cron.daily_4h
#
# and add this file in the /etc/cron/cron.daily_4h path
#   - you should be able to send email from your system, for instance, configuring exim4
#   dpkg-reconfigure exim4-config # choose "internet site;"



# Var

BACKUP_DIR="/srv/backup/data/postgresql/alldatabases/";
BACKUP_FILE="bkp-postgresql_alldatabases-`date +%Y.%m.%d_%H.%M.%S`-dump.sql.gz";
BACKUP_COMMAND="pg_dumpall | gzip > ${BACKUP_DIR}${BACKUP_FILE}";
BACKUP_USER="postgres";
ROTATE_USER="postgres";
ROTATE_DAYS="8";
EMAIL="[WHO@MAILSERVER.WHR]";
SUBJECT="[YOURDOMAIN.WHR] Postgresql backup";

SEND_BY_FTP="false";
FTP_HOST="[DESTDOMSIN.WHR]";
FTP_DIR="[REMOTEPATH]";
FTP_USER="[USER]";
FTP_PASS="[PASS]";

SEND_BY_EMAIL="false";



# Test

if test ! -e "`which mail`"
then
   echo "Command mail not found, exit." >&2;
   exit 1;
fi;

if test ! -e "`which pg_dumpall`"
then
   echo "Command pg_dumpall not found, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
   exit 1;
fi;

if test ! -e "`which gzip`"
then
   echo "Command gzip not found, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
   exit 1;
fi;

if test "${SEND_BY_FTP}" = "true" -a ! -e "`which ftp`"
then
   echo "Command ftp not found, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
   exit 1;
fi;

if test "${SEND_BY_EMAIL}" = "true" -a ! -e "`which mutt`"
then
   echo "Command mutt not found, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
   exit 1;
fi;

if ! test -d "${BACKUP_DIR}";
then
   echo "Directory ${BACKUP_DIR} don't exist, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
   exit 1;
fi;

if test -f "${BACKUP_DIR}${BACKUP_FILE}";
then
    echo "File ${BACKUP_DIR}${BACKUP_FILE} alredy exist, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
    exit 1;
fi;

if ! su - "${BACKUP_USER}" -c "touch ${BACKUP_DIR}${BACKUP_FILE}";
then
    echo "User ${BACKUP_USER} cannot write in ${BACKUP_DIR}${BACKUP_FILE}, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
    exit 1;
fi;

su - "${BACKUP_USER}" -c "rm -f ${BACKUP_DIR}${BACKUP_FILE}";



# Backup

if ! su - "${BACKUP_USER}" -s /bin/sh -c "${BACKUP_COMMAND}";
then
    echo "Backup ${BACKUP_COMMAND} failure, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
    exit 1;
fi;

chown "${ROTATE_USER}":"${ROTATE_USER}" "${BACKUP_DIR}${BACKUP_FILE}";



# Rotate

if ! su - "${ROTATE_USER}" -s /bin/sh -c "ls -t ${BACKUP_DIR}*-dump.sql.gz | tail -n +${ROTATE_DAYS} | xargs -d '\n' rm -f";
then
    echo "Rotate ${BACKUP_DIR} failure, exit." | mail -s "${SUBJECT} error." "${EMAIL}";
    exit 1;
fi;



# Upload to FTP if required

if test "${SEND_BY_FTP}" = "true";
then
    ftp -i -n ${FTP_HOST} << EOF
user ${FTP_USER} ${FTP_PASS}
binary
put ${BACKUP_DIR}${BACKUP_FILE} ${FTP_DIR}${BACKUP_FILE}
quit
EOF

    if test $? -ne 0;
    then
        echo "Upload to ${FTP_HOST} failure, exit." | mail -s "${SUBJECT} error." ${EMAIL};
        exit 1;
    fi;
fi;



# Send by mail if required, or send succes email

if test "${SEND_BY_EMAIL}" = "true";
then
    ls -l "${BACKUP_DIR}"  | mutt -n -e 'set copy=no' -s "${SUBJECT} success." -a "${BACKUP_DIR}${BACKUP_FILE}" -- "${EMAIL}";
    exit 0;
else
    ls -l "${BACKUP_DIR}"  | mail -s "${SUBJECT} success." "${EMAIL}";
fi;



# End