#!/bin/sh #----------------------------------------------------------------------------- # /var/install/bin/postgresql-tools-backup # # Copyright (c) 2005 Daniel Vogel # # Creation: 26.09.2005 dv # Last Update: $Id$ # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #----------------------------------------------------------------------------- #include eislib . /var/install/include/eislib . /etc/config.d/postgresql PROG=/usr/local/pgsql/bin/pg_dump if [ "$1" = "-auto" ] then MANUAL="false" else MANUAL="true" fi if [ "$MANUAL" == "true" ] then clrhome # Mount backup media if [ ! -z "$POSTGRESQL_BACKUP_MOUNT" ] then eval ${POSTGRESQL_BACKUP_MOUNT} 2>&1 if [ "$?" != "0" ] then echo "unable to execute: $POSTGRESQL_BACKUP_MOUNT" anykey exit 1 fi fi # select database mecho -info "Select database for backup:" echo { echo "SELECT d.datname AS \"Name\"," echo " u.usename AS \"Owner\"," echo " pg_catalog.pg_encoding_to_char(d.encoding) AS \"Encoding\"" echo "FROM pg_catalog.pg_database d" echo " LEFT JOIN pg_catalog.pg_user u ON d.datdba = u.usesysid" echo "ORDER BY 1;" } | /usr/local/pgsql/bin/psql template1 postgres echo -e 'database: \c' read database if [ "$database" = "" ] then mecho -info "command cancelled" anykey exit 0 fi mecho -info "Select database user for backup:" echo "select usename from pg_user;" | \ /usr/local/pgsql/bin/psql template1 postgres echo -e 'Database user [postgres]: \c' read dbuser if [ "$dbuser" = "" ] then dbuser='postgres' fi # make sure backup dir exists mkdir -p "$POSTGRESQL_BACKUP_TARGET" 2>&1 >/dev/null # create new filename backupfile="$database-`/bin/date +%Y-%m-%d-%H%M%S`.backup" backupfile="$POSTGRESQL_BACKUP_TARGET/$backupfile" # perform backup echo -n "Backup of database $database... " $PROG -i -U "$dbuser" -F c -b -v -f "$backupfile" $database if [ "$?" = "0" ] then echo "" echo "Backup completed successfully!" echo "" else echo "" echo "Backup failed!" echo "" fi # Unount if [ ! -z "$POSTGRESQL_BACKUP_UMOUNT" ] then eval ${POSTGRESQL_BACKUP_UMOUNT} 2>&1 if [ "$?" != "0" ] then echo "unable to execute: $POSTGRESQL_BACKUP_UMOUNT" fi fi anykey exit 0 else # initialize error counter errcount=0 { # Mount if [ ! -z "$POSTGRESQL_BACKUP_MOUNT" ] then eval ${POSTGRESQL_BACKUP_MOUNT} 2>&1 if [ "$?" != "0" ] then errcount=`/usr/bin/expr $errors + 1` fi fi if [ "$errcount" -eq "0" ] then # make sure backup dir exists mkdir -p "$POSTGRESQL_BACKUP_TARGET" 2>&1 >/dev/null # perform all backups idx=1 while [ "$idx" -le "$POSTGRESQL_BACKUP_N" ] do eval database='$POSTGRESQL_BACKUP_'$idx'_DBNAME' eval dbuser='$POSTGRESQL_BACKUP_'$idx'_USER' eval maxfiles='$POSTGRESQL_BACKUP_'$idx'_MAX' # reduce backup files to configured limit if [ "$maxfiles" -lt "1" ] then maxfiles='1' fi maxfiles=`/usr/bin/expr $maxfiles - 1` backup_files=`/bin/ls -t "$POSTGRESQL_BACKUP_TARGET/"$database-*.backup 2>/dev/null` c='0' for file in $backup_files do if [ "$c" -ge "$maxfiles" ] then rm "$file" fi c=`/usr/bin/expr $c + 1` done # create new filename backupfile="$database-`/bin/date +%Y-%m-%d-%H%M%S`.backup" backupfile="$POSTGRESQL_BACKUP_TARGET/$backupfile" # perform backup echo -n "Backup of database $database... " $PROG -i -U "$dbuser" -F c -b -f "$backupfile" $database 2> /tmp/pg_dump$$.log if [ "$?" = "0" ] then echo "ok" else echo "failed" echo echo "Error report:" cat /tmp/pg_dump$$.log echo errcount=`/usr/bin/expr $errcount + 1` fi rm /tmp/pg_dump$$.log # count idx=`/usr/bin/expr $idx + 1` done # Unount if [ ! -z "$POSTGRESQL_BACKUP_UMOUNT" ] then eval ${POSTGRESQL_BACKUP_UMOUNT} 2>&1 if [ "$?" != "0" ] then errcount=`/usr/bin/expr $errcount + 1` fi fi fi } > /tmp/backup-$$.log if [ -f "/tmp/backup-$$.log" ] then if [ "$POSTGRESQL_BACKUP_NOTIFY" != "" -a "$errcount" -gt "0" ] then /usr/bin/mail -s "PostgreSQL database backup service on \"$HOSTNAME\"" \ $POSTGRESQL_BACKUP_NOTIFY < /tmp/backup-$$.log fi rm /tmp/backup-$$.log fi fi