#!/usr/bin/env sh # # Backup a Postgresql database into a daily file. #!/usr/bin/env bash VER=0.1 SCRIPT_NAME="backup.sh" PROJECT="https://github.com/PierNola/BackupPg/" SCRIPT_FILENAME=`basename "$0"` BACKUP_DIR=/tmp/backup DATA_DIR=${BACKUP_DIR}/data ARCH_DIR=${BACKUP_DIR}/archives LOG_DIR=${BACKUP_DIR}/log DAY_TO_KEEP_DUMP=14 DAY_TO_KEEP_LOG=14 DATE=$(date +"%Y%m%d-%H%M") LOG_FILE=${LOG_DIR}/${DATE}-backup.log backup() { _date_echo "Starting PostgreSQL backup" >${LOG_FILE} DATABASES=`psql -l -t | cut -d'|' -f1 | sed -e 's/ //g' -e '/^$/d'` 2>>${LOG_FILE} for DB in ${DATABASES}; do GZ_DMP_FILE=${DATA_DIR}/${DB}.dmp.gz ARCH_GZ_DMP_FILE=${ARCH_DIR}/${DATE}-${DB}.dmp.gz _date_echo "Starting backup of database '${DB}'" >>${LOG_FILE} pg_dump -Upostgres -v ${DB} -F p 2>>${LOG_FILE} | gzip >${GZ_DMP_FILE} _date_echo "Creating backup archives of database '${DB}'" >>${LOG_FILE} cp ${GZ_DMP_FILE} ${ARCH_GZ_DMP_FILE} done _date_echo "Prune all archives backup older then ${DAY_TO_KEEP_DUMP} days" >>${LOG_FILE} find ${ARCH_DIR} -type f -maxdepth 1 -mtime +${DAY_TO_KEEP_DUMP} -name "*.gz" -delete 2>&1 >>${LOG_FILE} _date_echo "End PostgreSQL backup" >>${LOG_FILE} # prune old logs find ${LOG_DIR} -type f -maxdepth 1 -mtime +${DAY_TO_KEEP_LOG} -name "*.log" -delete } _vacuum_db() { if [ "`date +%d`" = "17" ]; then echo "`date` : vacuum full analyze" /usr/bin/psql $dbname -c "vacuum full analyze;" else echo "`date` : vacuum" /usr/bin/psql $dbname -c "vacuum;" fi } _reindex_db() { if [ "`date +%u`" = "7" ]; then /usr/bin/reindexdb -a fi } install() { _date_echo "Starting Installation to directory '${BACKUP_DIR}'" if [ -e ${BACKUP_DIR} ] ; then _err "${BACKUP_DIR} already exists" exit 1 fi # Create all directories mkdir -p ${BACKUP_DIR} mkdir ${BACKUP_DIR}/data mkdir ${BACKUP_DIR}/log mkdir ${BACKUP_DIR}/archives # Install script to backup directory cp ${SCRIPT_FILENAME} ${BACKUP_DIR}/${SCRIPT_NAME} chmod +x ${BACKUP_DIR}/${SCRIPT_NAME} # Change Backup Directory in installed script sed -i -r "s!^BACKUP_DIR=.*!BACKUP_DIR=$BACKUP_DIR!" ${BACKUP_DIR}/${SCRIPT_NAME} # Install Cron Job crontab -l | { cat; echo "30 22 * * * ${BACKUP_DIR}/${SCRIPT_NAME} -r >/dev/null 2>&1"; } | crontab - } _date_echo() { date +"[%Y-%m-%d %H:%M] ${1}" } _err(){ echo "[ERROR] ${1}" } _process(){ while [ ${#} -gt 0 ]; do case "${1}" in --help | -h) showhelp return ;; --version | -v) version return ;; --install | -i) if [ -n "${2}" ]; then BACKUP_DIR=${2} fi install return ;; --run | -r) backup return ;; *) echo "Unknown parameter : ${1}" return 1 ;; esac shift done } version() { echo "${PROJECT} - Version ${VER}" } showhelp() { version echo "Usage: $SCRIPT_NAME [commands] Commands: -h, --help Show this help message. -v, --version Show version info. -i, --install Install to the specific direcotry. -r, --run Run backup of all databases " } main() { [ -z "$1" ] && showhelp && return _process "$@" } main "$@"