master
  1#!/bin/bash
  2
  3while [ $# -gt 0 ]; do
  4  case $1 in
  5    -c)
  6      CONFIG_FILE_PATH="$2"
  7      shift 2
  8      ;;
  9    *)
 10      ${ECHO} "Unknown Option \"$1\"" 1>&2
 11      exit 2
 12      ;;
 13  esac
 14done
 15
 16if [ -z $CONFIG_FILE_PATH ] ; then
 17  SCRIPTPATH=$(cd ${0%/*} && pwd -P)
 18  CONFIG_FILE_PATH="${SCRIPTPATH}/pg_backup.config"
 19fi
 20
 21if [ ! -r ${CONFIG_FILE_PATH} ] ; then
 22  echo "Could not load config file from ${CONFIG_FILE_PATH}" 1>&2
 23  exit 1
 24fi
 25
 26source "${CONFIG_FILE_PATH}"
 27
 28if [ "$BACKUP_USER" != "" -a "$(id -un)" != "$BACKUP_USER" ] ; then
 29  echo "This script must be run as $BACKUP_USER. Exiting." 1>&2
 30  exit 1
 31fi
 32
 33if [ ! $HOSTNAME ]; then
 34  HOSTNAME="localhost"
 35fi;
 36
 37if [ ! $USERNAME ]; then
 38  USERNAME="postgres"
 39fi;
 40
 41function perform_backups()
 42{
 43  SUFFIX=$1
 44  FINAL_BACKUP_DIR=$BACKUP_DIR"`date +\%Y-\%m-\%d`$SUFFIX/"
 45
 46  echo "Making backup directory in $FINAL_BACKUP_DIR"
 47
 48  if ! mkdir -p $FINAL_BACKUP_DIR; then
 49    echo "Cannot create backup directory in $FINAL_BACKUP_DIR. Go and fix it!" 1>&2
 50    exit 1;
 51  fi;
 52
 53  for SCHEMA_ONLY_DB in ${SCHEMA_ONLY_LIST//,/ }
 54  do
 55    SCHEMA_ONLY_CLAUSE="$SCHEMA_ONLY_CLAUSE or datname ~ '$SCHEMA_ONLY_DB'"
 56  done
 57
 58  SCHEMA_ONLY_QUERY="select datname from pg_database where false $SCHEMA_ONLY_CLAUSE order by datname;"
 59  echo -e "\n\nPerforming schema-only backups"
 60  echo -e "--------------------------------------------\n"
 61  SCHEMA_ONLY_DB_LIST=`psql -h "$HOSTNAME" -U "$USERNAME" -At -c "$SCHEMA_ONLY_QUERY" postgres`
 62  echo -e "The following databases were matched for schema-only backup:\n${SCHEMA_ONLY_DB_LIST}\n"
 63
 64  for DATABASE in $SCHEMA_ONLY_DB_LIST
 65  do
 66    echo "Schema-only backup of $DATABASE"
 67
 68    if ! pg_dump -Fp -s -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" | gzip > $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress; then
 69      echo "[!!ERROR!!] Failed to backup database schema of $DATABASE" 1>&2
 70    else
 71      mv $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE"_SCHEMA.sql.gz
 72    fi
 73  done
 74
 75  for SCHEMA_ONLY_DB in ${SCHEMA_ONLY_LIST//,/ }
 76  do
 77    EXCLUDE_SCHEMA_ONLY_CLAUSE="$EXCLUDE_SCHEMA_ONLY_CLAUSE and datname !~ '$SCHEMA_ONLY_DB'"
 78  done
 79
 80  FULL_BACKUP_QUERY="select datname from pg_database where not datistemplate and datallowconn $EXCLUDE_SCHEMA_ONLY_CLAUSE order by datname;"
 81
 82  echo -e "\n\nPerforming full backups"
 83  echo -e "--------------------------------------------\n"
 84
 85  for DATABASE in `psql -h "$HOSTNAME" -U "$USERNAME" -At -c "$FULL_BACKUP_QUERY" postgres`
 86  do
 87    if [ $ENABLE_PLAIN_BACKUPS = "yes" ]
 88    then
 89      echo "Plain backup of $DATABASE"
 90
 91      if ! pg_dump -Fp -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" | gzip > $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress; then
 92        echo "[!!ERROR!!] Failed to produce plain backup database $DATABASE" 1>&2
 93      else
 94        mv $FINAL_BACKUP_DIR"$DATABASE".sql.gz.in_progress $FINAL_BACKUP_DIR"$DATABASE".sql.gz
 95      fi
 96    fi
 97
 98    if [ $ENABLE_CUSTOM_BACKUPS = "yes" ]
 99    then
100      echo "Custom backup of $DATABASE"
101
102      if ! pg_dump -Fc -h "$HOSTNAME" -U "$USERNAME" "$DATABASE" -f $FINAL_BACKUP_DIR"$DATABASE".custom.in_progress; then
103        echo "[!!ERROR!!] Failed to produce custom backup database $DATABASE"
104      else
105        mv $FINAL_BACKUP_DIR"$DATABASE".custom.in_progress $FINAL_BACKUP_DIR"$DATABASE".custom
106      fi
107    fi
108  done
109  echo -e "\nAll database backups complete!"
110}
111
112DAY_OF_MONTH=`date +%d`
113
114if [ $DAY_OF_MONTH -eq 1 ];
115then
116  # Delete all expired monthly directories
117  find $BACKUP_DIR -maxdepth 1 -name "*-monthly" -exec rm -rf '{}' ';'
118  perform_backups "-monthly"
119  exit 0;
120fi
121
122DAY_OF_WEEK=`date +%u` #1-7 (Monday-Sunday)
123EXPIRED_DAYS=`expr $((($WEEKS_TO_KEEP * 7) + 1))`
124
125if [ $DAY_OF_WEEK = $DAY_OF_WEEK_TO_KEEP ];
126then
127  find $BACKUP_DIR -maxdepth 1 -mtime +$EXPIRED_DAYS -name "*-weekly" -exec rm -rf '{}' ';'
128  perform_backups "-weekly"
129  exit 0;
130fi
131
132find $BACKUP_DIR -maxdepth 1 -mtime +$DAYS_TO_KEEP -name "*-daily" -exec rm -rf '{}' ';'
133perform_backups "-daily"
134
135[ -z "$S3_PATH" ] && echo "no aws backup" && exit 0;
136
137/usr/local/bin/aws s3 sync $BACKUP_DIR $S3_PATH