From 0896b5ac081c46ef528b48bc51e07e91f75b7722 Mon Sep 17 00:00:00 2001 From: Frank Brehm Date: Thu, 16 Nov 2017 14:30:01 +0100 Subject: [PATCH] Finalizing bin/backup_pgsql.sh --- bin/backup_pgsql.sh | 140 ++++---------------------------------------- 1 file changed, 11 insertions(+), 129 deletions(-) diff --git a/bin/backup_pgsql.sh b/bin/backup_pgsql.sh index f152c74..f015414 100755 --- a/bin/backup_pgsql.sh +++ b/bin/backup_pgsql.sh @@ -23,11 +23,10 @@ # # PGSQL_SYS_USER # BACKUP_ROOTDIR -# DATABASES # # * Add crontab job for root user (or whatever user you want): # -# # crontab -e -u root +# # crontab -e -u postgres # 1 4 * * * bash /path/to/backup_pgsql.sh # # * Make sure 'crond' service is running. @@ -43,7 +42,7 @@ VERBOSE="n" DEBUG="n" QUIET='n' -VERSION="2.2" +VERSION="2.3" # console colors: RED="" @@ -387,6 +386,15 @@ cleanup_tmp_dir() { #------------------------------------------------------------------------------ prepare_dirs() { + if [[ ! -d "${BACKUP_ROOTDIR}" ]] ; then + error "Directory '${RED}${BACKUP_ROOTDIR}${NORMAL}' does not exists or is not a directory." + exit 5 + fi + if [[ ! -w "${BACKUP_ROOTDIR}" ]] ; then + error "No write access to '${RED}${BACKUP_ROOTDIR}${NORMAL}'." + exit 6 + fi + info "Creating all necessary directories ..." MKDIR -p "${BACKUP_DIR}" TMP_DIR=$( mktemp -d -p "${HOME}" backup.XXXXXXXX.d ) @@ -547,130 +555,4 @@ main "$@" exit 0 - - - -export SUDO="" -if [[ "$( id -u -n )" != "${PGSQL_SYS_USER}" ]] ; then - export SUDO="sudo -i -u ${PGSQL_SYS_USER} " -fi - -# Detect existing databases -export DATABASES="$( ${SUDO}psql --list --tuples-only --no-align --no-readline --expanded --field-separator=',' | grep -i '^Name' | awk -F ',' '{print $2}' )" - -export PATH='/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin' - -# Commands. -export CMD_DATE='/bin/date' -export CMD_DU='du -sk' -export CMD_COMPRESS='bzip2 -9' -export COMPRESS_SUFFIX='bz2' -export CMD_PG_DUMP='pg_dump' - -# Date. -export YEAR="$(${CMD_DATE} +%Y)" -export MONTH="$(${CMD_DATE} +%m)" -export DAY="$(${CMD_DATE} +%d)" -export TIME="$(${CMD_DATE} +%H:%M:%S)" -export TIMESTAMP="${YEAR}-${MONTH}-${DAY}-${TIME}" - -# Pre-defined backup status -export BACKUP_SUCCESS='YES' - -# Define, check, create directories. -export BACKUP_DIR="${BACKUP_ROOTDIR}/pgsql/${YEAR}/${MONTH}/${DAY}" - -# Find the old backup which should be removed. -export REMOVE_OLD_BACKUP='NO' -if which python &>/dev/null; then - export REMOVE_OLD_BACKUP='YES' - py_cmd="import time; import datetime; t=time.localtime(); print datetime.date(t.tm_year, t.tm_mon, t.tm_mday) - datetime.timedelta(days=${KEEP_DAYS})" - shift_date=$(python -c "${py_cmd}") - shift_year="$(echo ${shift_date} | awk -F'-' '{print $1}')" - shift_month="$(echo ${shift_date} | awk -F'-' '{print $2}')" - shift_day="$(echo ${shift_date} | awk -F'-' '{print $3}')" - export REMOVED_BACKUP_DIR="${BACKUP_ROOTDIR}/pgsql/${shift_year}/${shift_month}/${shift_day}" -fi - -# Log file -export LOGFILE="${BACKUP_DIR}/${TIMESTAMP}.log" - -# Check and create directories. -if [[ ! -d "${BACKUP_DIR}" ]] ; then - ${SUDO}mkdir -p "${BACKUP_DIR}" -fi - -# Get HOME directory of PGSQL_SYS_USER -export PGSQL_SYS_USER_HOME=$( getent passwd "${PGSQL_SYS_USER}" | awk -F':' '{print $6}' ) - -# Initialize log file. -echo "* Starting at: ${YEAR}-${MONTH}-${DAY}-${TIME}." | ${SUDO}tee ${LOGFILE} -echo "* Backup directory: ${BACKUP_DIR}." | ${SUDO}tee -a ${LOGFILE} - -TMP_DIR=$( ${SUDO}mktemp -d -p "${PGSQL_SYS_USER_HOME}" backup.XXXXXXXX.d ) - -cleanup_tmp_dir() { - ${SUDO}rm -rf "${TMP_DIR}" -} - -trap cleanup_tmp_dir INT TERM EXIT ABRT - -# Backup. -echo "* Backing up databases: ${DATABASES}." | ${SUDO}tee -a ${LOGFILE} -for db in ${DATABASES}; do - - output_sql="${db}-${TIMESTAMP}.sql" - out_sql_tmp="${TMP_DIR}/${output_sql}" - out_sql_tgt="${BACKUP_DIR}/${output_sql}" - -# # Check database existence -# if ${SUDO}"psql -d ${db} -c '\q' >/dev/null 2>&1" ; then -# : -# else -# echo "Database '${db}' does not exists." | ${SUDO}tee -a ${LOGFILE} -# continue -# fi - - # Dump - ${SUDO}"${CMD_PG_DUMP}" ${db} | ${SUDO}tee "${out_sql_tmp}" >/dev/null - - # Move to backup directory. - ${SUDO}mv "${out_sql_tmp}" ${BACKUP_DIR} - - cd ${BACKUP_DIR} - - # Get original SQL file size - original_size="$(${CMD_DU} ${output_sql} | awk '{print $1}')" - echo " Original size ${output_sql}: ${original_size}" | ${SUDO}tee -a ${LOGFILE} - - # Compress - ${SUDO}${CMD_COMPRESS} ${out_sql_tgt} 2>&1 | ${SUDO}tee -a ${LOGFILE} - - ${SUDO}rm -f ${out_sql_tgt} | ${SUDO}tee -a ${LOGFILE} - echo -e " + ${db} [DONE]" | ${SUDO}tee -a ${LOGFILE} - -done - -# Append file size of backup files. -echo -e "* File size:\n----" | ${SUDO}tee -a ${LOGFILE} -${SUDO}${CMD_DU} ${BACKUP_DIR}/*${TIMESTAMP}*sql* | ${SUDO}tee -a ${LOGFILE} -echo "----" | ${SUDO}tee -a ${LOGFILE} - -echo "* Backup completed (Success? ${BACKUP_SUCCESS})." | ${SUDO}tee -a ${LOGFILE} - -if [[ "${BACKUP_SUCCESS}" == 'YES' ]]; then - echo -e "\n[OK] Backup successfully completed.\n" -else - echo -e "\n[ERROR] Backup completed with ERRORS.\n" >&2 -fi - -if [[ "${REMOVE_OLD_BACKUP}" == 'YES' && -d "${REMOVED_BACKUP_DIR}" ]]; then - echo -e "* Delete old backup: ${REMOVED_BACKUP_DIR}." | ${SUDO}tee -a ${LOGFILE} - echo -e "* Suppose to delete: ${REMOVED_BACKUP_DIR}" | ${SUDO}tee -a ${LOGFILE} - ${SUDO}rm -rf ${REMOVED_BACKUP_DIR} 2>&1 | ${SUDO}tee -a ${LOGFILE} -fi - -echo "* Backup log: ${LOGFILE}:" - - # vim: ts=4 et list -- 2.39.5