This is simple script which makes backup of PostgreSQL instance in tar format and archives tar files on Google storage.
#!/usr/bin/env bash #script makes full backup of postgresql instance using pg_basebackup #create different env files with variables for script: # #env file contains: #export BACKUP_MAIN_DIR=... - full path to backups main directory #export BACKUP_GS_PATH=... - bucket and path in Google storage #export BACKUP_PG_IP=... - IP of postgresql instance to be backuped envfile=$1 function echo_log { echo "$(date +"%Y-%m-%d %H:%M:%S.%N"): $1" } [ -z "$envfile" ] && echo "USAGE: ./$(basename $0) env_file" && exit 1 if [ ! -f ${envfile} ]; then echo_log "cannot find env file: ${envfile}" exit 1 fi homedir=$( dirname "${BASH_SOURCE[0]}") cd $homedir . ./${envfile} [ -z "$BACKUP_MAIN_DIR" ] && echo "$(basename $0): ERROR: variable BACKUP_MAIN_DIR empty or undefined" && exit 1 [ -z "$BACKUP_GS_PATH" ] && echo "$(basename $0): ERROR: variable BACKUP_GS_PATH empty or undefined" && exit 1 [ -z "$BACKUP_PG_IP" ] && echo "$(basename $0): ERROR: variable BACKUP_PG_IP empty or undefined" && exit 1 backupstamp=$(date +"%Y%m%d%H%M%S") echo_log "======= pg_basebackup ${BACKUP_PG_IP} - ${backupstamp} =======" backupmaindir=${BACKUP_MAIN_DIR} if [ ! -d ${backupmaindir} ]; then echo_log "cannot find backup main directory: ${backupmaindir}" exit 1 fi echo_log "backup main dir: ${backupmaindir}" mkdir -p ${backupmaindir}/${backupstamp} if [[ $? -ne 0 ]]; then echo_log "$(basename $0): cannot create backup directory - ${backupmaindir}/${backupstamp}" exit 1 fi echo_log "backup dir: ${backupmaindir}/${backupstamp}" pg_basebackup -h ${BACKUP_PG_IP} -D ${backupmaindir}/${backupstamp} -X stream -U barman -P -F t if [[ $? -ne 0 ]]; then echo_log "$(basename $0): error in pg_basebackup" exit 1 fi if [ -d ${backupmaindir}/${backupstamp} ]; then for ff in $(ls -Sr ${backupmaindir}/${backupstamp}/*.tar*); do f=$(basename ${ff}) echo_log "copying ${backupmaindir}/${backupstamp}/${f} to ${BACKUP_GS_PATH}/${backupstamp}/${f}" gsutil cp ${backupmaindir}/${backupstamp}/${f} ${BACKUP_GS_PATH}/${backupstamp}/${f} if [[ $? -ne 0 ]]; then echo_log "$(basename $0): error in copy to GS - file: ${ff}" exit 1 fi done else echo_log "problem with: ${backupmaindir}/${backupstamp}" exit 1 fi echo_log "deleting backup files on instance..." for ff in $(ls -Sr ${backupmaindir}/${backupstamp}/*.tar*); do rm ${ff} done rmdir ${backupmaindir}/${backupstamp} if [[ $? -ne 0 ]]; then echo_log "$(basename $0): cannot remove backup directory - ${backupmaindir}/${backupstamp}" exit 1 fi echo_log "ALL DONE"