#!/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 snapshot () { local database="$1" && shift && 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" && : } exit=0 while IFS=' \r' read -r database do if ! snapshot "$database" "$@" then exit=1 cat >&2 <<-EOF ERROR: snapshot "$database" "$@" EOF fi 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 exit $exit