Skip to content
Snippets Groups Projects
pgsql.sh 3.28 KiB
#!/bin/bash
# ================================================================================
#
# LOCALDUMP :: POSTGRES
# create gzipped plain text backups from each scheme
#
# --------------------------------------------------------------------------------
# ah - Axel Hahn <axel.hahn@iml.unibe.ch>
# ds - Daniel Schueler <daniel.schueler@iml.unibe.ch>
#
# 2016-11-10  ah,ds  v1.0
# 2017-03-29  .....  v1.1  added restore
# 2022-01-20         v1.2  fixes with shellcheck
# ================================================================================

if [ -z "$BACKUP_TARGETDIR" ]; then
  echo "ERROR: you cannot start $(basename $0) directly"
  rc=$rc+1
  exit 1
fi

# --------------------------------------------------------------------------------
# CONFIG
# --------------------------------------------------------------------------------

  # unix user of postgres database
  PGUSER=postgres


# --------------------------------------------------------------------------------
# FUNCTION
# --------------------------------------------------------------------------------

function doPgsqlBackup(){

  create_targetdir

  # ----- change owner of directory because of su command
  chown ${PGUSER}. "${BACKUP_TARGETDIR}"

  # ----- GO

  sSqlGetDblist="select datname from pg_database where not datistemplate and datallowconn order by datname;"
  for DATABASE in $(su ${PGUSER} -c "psql -At -c '$sSqlGetDblist' postgres" 2>/dev/null)
  do
    echo "----- $DATABASE"
    echo -n "backup ... "
    OUTFILE="${BACKUP_TARGETDIR}/$(get_outfile ${DATABASE}).sql"
    su ${PGUSER} -c "pg_dump -Fp ${DATABASE} >$OUTFILE"
    fetchrc

    if [ $myrc -eq 0 ]; then
      echo -n "compress ... "
      compress_file "$OUTFILE"
    else
      color error
      echo "ERROR occured - no gzip"
      color reset
      # mv $OUTFILE $OUTFILE
    fi
    ls -l "$OUTFILE"*
  echo
  done
}


# restore database dump file into database
# param  string  database dump file (gzipped)
# param  string  optional: database to import; default: database is parsed from file
function restoreByFile(){
  sMyfile=$1
  sMyDb=$2

  if [ -z "$sMyDb" ]; then
    h2 "analyze dump $sMyfile"
    sMyDb="$(guessDB "$sMyfile" )"
    echo "detected db schema from file: [${sMyDb}]"
  else
    echo "db schema from param 2: [${sMyDb}]"
  fi

  echo

  echo import to "$sMyDb"...

  h2 "deleting database [$sMyDb] ..."
  color cmd
  su ${PGUSER} -c "dropdb ${sMyDb}"
  color reset

  h2 "ensure that database exists ..."
  color cmd
  su ${PGUSER} -c "psql -c \"CREATE DATABASE ${sMyDb};\""
  fetchrc
  color reset

  h2 "import ..."
  ls -l "${sMyfile}"
  echo "import to database [${sMyDb}]"
  color cmd
  zcat "${sMyfile}" | su ${PGUSER} -c "psql -d ${sMyDb}"
  fetchrc
  color reset

}


# --------------------------------------------------------------------------------
# MAIN
# --------------------------------------------------------------------------------

  # ----- requirements
  j_requireBinary "pg_dump"   1
  j_requireProcess "postgres" 1

  if [ $rc -ne 0 ]; then
    rc=0
    echo "SKIP: postgres seems not to be here"
  else
    if [ "$1" = "restore" ]; then
      shift 1
      restoreByFile $*

    else
      doPgsqlBackup
    fi

  fi

  echo "$0 $* [postgres] final returncode rc=$rc"

# --------------------------------------------------------------------------------