146 lines
3.4 KiB
Bash
146 lines
3.4 KiB
Bash
|
#!/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 <directory> Install to the specific direcotry.
|
||
|
-r, --run Run backup of all databases
|
||
|
"
|
||
|
}
|
||
|
|
||
|
main() {
|
||
|
[ -z "$1" ] && showhelp && return
|
||
|
_process "$@"
|
||
|
}
|
||
|
|
||
|
main "$@"
|