From 468cadb7ccc1e1d965e662332befcf681b36ec8e Mon Sep 17 00:00:00 2001 From: "Hahn Axel (hahn)" <axel.hahn@unibe.ch> Date: Mon, 16 Dec 2024 09:09:50 +0100 Subject: [PATCH] on snapshot mode it can fallback for single database to normal pg_dump of origin --- plugins/localdump/pgsql.sh | 60 +++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/plugins/localdump/pgsql.sh b/plugins/localdump/pgsql.sh index 76f0839..53fb8e2 100755 --- a/plugins/localdump/pgsql.sh +++ b/plugins/localdump/pgsql.sh @@ -15,6 +15,7 @@ # 2023-09-20 v1.4 FIX could not change directory to "/root": Permission denied # 2024-10-02 ah v1.5 rename backup and restore function # 2024-12-13 ah v1.6 backup uses a snapshot db +# 2024-12-16 ah v1.7 on snapshot mode it can fallback for single database to normal pg_dump of origin # ================================================================================ if [ -z "$BACKUP_TARGETDIR" ]; then @@ -43,21 +44,10 @@ function pgsql.backup(){ local OUTFILE local snapshotprefix="snapshot_" local bUseSnapshot + local bUseSnapshot4DB typeset -i bUseSnapshot=0 - # Detect a readonly or writeable postgres host. - TESTDB="imlbackup_createtest" - su ${PGUSER} -c "dropdb ${TESTDB}" >/dev/null 2>&1 - if su ${PGUSER} -c "psql ${BACKUP_PARAMS} -c \"CREATE DATABASE ${TESTDB};\"" >/dev/null 2>&1 - then - bUseSnapshot=1 - su ${PGUSER} -c "dropdb ${TESTDB}" - echo "INFO: enabling snapshots" - else - echo "INFO: create database failed for snapshots - dumping databases directly" - fi - create_targetdir # ----- change owner of directory because of su command @@ -69,31 +59,48 @@ function pgsql.backup(){ ( cd /tmp + # Detect a readonly or writeable postgres host. + TESTDB="imlbackup_createtest" + su ${PGUSER} -c "dropdb ${TESTDB}" >/dev/null 2>&1 + if su ${PGUSER} -c "psql ${BACKUP_PARAMS} -c \"CREATE DATABASE ${TESTDB};\"" >/dev/null 2>&1 + then + bUseSnapshot=1 + su ${PGUSER} -c "dropdb ${TESTDB}" + echo "INFO: enabling snapshots" + else + echo "INFO: create database failed for snapshots - dumping databases directly" + fi + sSqlGetDblist="select datname from pg_database where not datistemplate and datallowconn order by datname;" for DATABASE in $( su ${PGUSER} -c "psql ${BACKUP_PARAMS} -At -c '$sSqlGetDblist' postgres" 2>/dev/null | grep -v "^$snapshotprefix" ) do echo -n "__DB__${SERVICENAME} backup $DATABASE ... " + bUseSnapshot4DB=$bUseSnapshot + SNAPSHOTDB="${DATABASE}" - test $bUseSnapshot -eq 1 && SNAPSHOTDB="${snapshotprefix}${DATABASE}" + test $bUseSnapshot4DB -eq 1 && SNAPSHOTDB="${snapshotprefix}${DATABASE}" OUTFILE="${BACKUP_TARGETDIR}/$(get_outfile ${DATABASE}).sql" myrc=0 # drop snapshot db first - just in case - test $bUseSnapshot -eq 1 && ( + if [ $bUseSnapshot4DB -eq 1 ]; then echo -n " snapshot ... " su ${PGUSER} -c "dropdb ${SNAPSHOTDB}" >/dev/null 2>&1 - su ${PGUSER} -c "psql ${BACKUP_PARAMS} -c \"CREATE DATABASE ${SNAPSHOTDB} WITH TEMPLATE ${DATABASE};\"" >/dev/null - fetchrc >/dev/null - ) + if ! su ${PGUSER} -c "psql ${BACKUP_PARAMS} -c \"CREATE DATABASE ${SNAPSHOTDB} WITH TEMPLATE ${DATABASE};\"" >/dev/null 2>&1; then + echo -n " nope, using origin ... " + bUseSnapshot4DB=0 + SNAPSHOTDB="${DATABASE}" + fi + fi if [ $myrc -eq 0 ]; then echo -n "backup ... " if su ${PGUSER} -c "pg_dump ${BACKUP_PARAMS} -Fp ${SNAPSHOTDB} >$OUTFILE"; then fetchrc >/dev/null - test $bUseSnapshot -eq 1 && ( + test $bUseSnapshot4DB -eq 1 && ( echo -n "delete snapshot ... " su ${PGUSER} -c "dropdb ${SNAPSHOTDB}" ) @@ -101,7 +108,7 @@ function pgsql.backup(){ db._compressDumpfile "$OUTFILE" else fetchrc - test $bUseSnapshot -eq 1 && su ${PGUSER} -c "dropdb ${SNAPSHOTDB}" + test $bUseSnapshot4DB -eq 1 && su ${PGUSER} -c "dropdb ${SNAPSHOTDB}" fi else cecho error "ERROR!" @@ -172,21 +179,6 @@ else fi - -# case $1 in -# backup) -# test $SERVICEFOUND -eq 1 && pgsql.backup -# ;; -# restore) -# shift 1 -# test $SERVICEFOUND -eq 1 && pgsql.restore $* -# ;; -# *) -# echo ERROR: wrong syntax: -# echo $0 $* -# exit 1 -# esac - echo "__DB__$SERVICENAME INFO: $0 $* [$SERVICENAME] final returncode rc=$rc" # -------------------------------------------------------------------------------- -- GitLab