#!/bin/sh CONFIG=/etc/pgbackup.conf if [ ! -f "$CONFIG" ] ; then echo "Config file $CONFIG not exist!" exit 1 fi . "$CONFIG" DT=`date '+%Y%m%d'` umask 0137 remove_old() { DB="$1" EXT="$2" echo -n "`date '+%Y:%m:%d %H:%M:%S'` Remove old archives of $DB... " FULL_LIST=`find "$BACKUPS_PATH" -mindepth 1 -maxdepth 1 -type f -name "$DB.*.$EXT" | sort` NEED_LIST=`echo "$FULL_LIST" | tail -n "$DAYS"` (echo "$FULL_LIST" ; echo "$NEED_LIST") \ | sort \ | uniq -u \ | xargs -r rm echo "done" } echo -n "`date '+%Y:%m:%d %H:%M:%S'` Backing up postgresql config..." cp /etc/postgresql/15/main/postgresql.conf $BACKUPS_PATH/postgresql.$DT.conf \ && echo " done" \ || (rm $BACKUPS_PATH/postgresql.$DT.conf \ && echo " failed") remove_old postgresql conf echo -n "`date '+%Y:%m:%d %H:%M:%S'` Backing up hba config..." cp /etc/postgresql/15/main/pg_hba.conf $BACKUPS_PATH/pg_hba.$DT.conf \ && echo " done" \ || (rm $BACKUPS_PATH/pg_hba.$DT.conf \ && echo " failed") remove_old pg_hba conf echo -n "`date '+%Y:%m:%d %H:%M:%S'` Backing up global objects..." su - postgres -c "pg_dumpall -g > $BACKUPS_PATH/global.$DT.sql" \ && echo " done" \ || (rm $BACKUPS_PATH/global.$DT.sql \ && echo " failed") remove_old global sql DBS=`echo "SELECT datname FROM pg_catalog.pg_database WHERE datistemplate = false AND datname <> 'postgres' ORDER BY 1;" | su - postgres -c "psql -qt"` echo "$DBS" \ | while read DB do if [ -z "$DB" ] ; then continue fi TSDB=`echo "SELECT 1 FROM pg_catalog.pg_extension WHERE extname = 'timescaledb';" | su - postgres -c "psql -qtd $DB"` if [ -z "$TSDB" ] ; then echo -n "`date '+%Y:%m:%d %H:%M:%S'` Backing up common database $DB..." else echo -n "`date '+%Y:%m:%d %H:%M:%S'` Backing up timescaledb database $DB..." fi if [ -f "$BACKUPS_PATH/$DB.$DT.sql.bz2" ] ; then echo " already done" continue fi su - postgres -c "pg_dump --no-owner --no-acl --dbname=$DB 2>/dev/null | bzip2 > $BACKUPS_PATH/$DB.$DT.sql.bz2" \ && echo " done" \ || (rm $BACKUPS_PATH/$DB.$DT.sql.bz2 \ && echo " failed") remove_old $DB sql.bz2 done REPLICA=`echo "SELECT COUNT(*) FROM pg_stat_wal_receiver;" | su - postgres -c "psql -qt"` if [ "$REPLICA" -gt "0" ] ; then ssh -ni "$RKEY" "$RUSER@$RSERVER" "mkdir -p $RPATH" 2>/dev/null DBS=`echo "SELECT datname FROM pg_catalog.pg_database WHERE datistemplate = false AND datname <> 'postgres' ORDER BY 1;" | su - postgres -c "psql -qt"` echo "$DBS" \ | while read DB do if [ -z "$DB" ] ; then continue fi echo -n "`date '+%Y:%m:%d %H:%M:%S'` Archiving database $DB to remote storage..." SRC=`find "$BACKUPS_PATH" -mindepth 1 -maxdepth 1 -type f -name "$DB.*.sql.bz2" | sort | tail -n 1` scp -qi "$RKEY" "$SRC" "$RUSER@$RSERVER:$RPATH$DB.sql.bz2" 2>/dev/null if [ "$?" -eq "0" ] ; then echo " done" else echo " failed" fi done fi