#!/bin/sh -eu # SYNTAX: $database_pattern -- $snapshot_eval # DESCRIPTION: crée un instantané pour chaque base de données PostgreSQL $database donnée # DESCRIPTION: dans ~backup/snapshot/postgresql/"$database", # DESCRIPTION: puis évalue $snapshot_eval, # DESCRIPTION: puis efface l'instantané. ${TRACE:+set -x} test "$(id -u)" = "$(id -u backup)" database_pattern=$1; shift test ! "${1-}" = -- || shift test ! $# = 0 || set -- : install -d -m 770 -o backup -g backup \ ~backup/snapshot/postgresql trap_exit () { errno=$? test $errno = 0 || cat >&2 <<-EOF ERROR: $0 "$database" "$@" EOF #return $errno } trap trap_exit EXIT while IFS=' \r' read -r database do test "${database:+set}" test ! -e ~backup/snapshot/postgresql/"$database" # NOTE: soit une sauvegarde est déjà en cours, # soit une précédente a échoué. install -d -m 770 -o backup -g backup \ ~backup/snapshot/postgresql/"$database" psql --quiet "$database" -c "VACUUM (ANALYSE);" pg_dump --blobs --compress 0 --format custom ${TRACE:+--verbose} \ --file ~backup/snapshot/postgresql/"$database"/dump.sql \ "$database" eval "$@" rm -rf \ ~backup/snapshot/postgresql/"$database" done <<-EOF $(psql --quiet --tuples-only postgres <<-EOF || exit 1 \set ON_ERROR_STOP on SELECT datname FROM pg_catalog.pg_database WHERE datallowconn AND datname LIKE '$database_pattern'; EOF ) EOF