From a86b50bc454677d66abb27aef1b50d2686d3a577 Mon Sep 17 00:00:00 2001
From: "Hahn Axel (hahn)" <axel.hahn@unibe.ch>
Date: Fri, 13 Dec 2024 13:28:05 +0100
Subject: [PATCH] postgres db backup uses a snapshot db

---
 plugins/localdump/pgsql.sh | 40 +++++++++++++++++++++++++++++++-------
 1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/plugins/localdump/pgsql.sh b/plugins/localdump/pgsql.sh
index 219550a..0fb225d 100755
--- a/plugins/localdump/pgsql.sh
+++ b/plugins/localdump/pgsql.sh
@@ -14,6 +14,7 @@
 # 2022-03-17         v1.3  WIP: add lines with prefix __DB__
 # 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
 # ================================================================================
 
 if [ -z "$BACKUP_TARGETDIR" ]; then
@@ -34,9 +35,14 @@ fi
 # FUNCTION
 # --------------------------------------------------------------------------------
 
-
+# backup all databases
 function pgsql.backup(){
 
+  local DATABASE
+  local SNAPSHOTDB
+  local OUTFILE
+  local snapshotprefix="snapshot_"
+
   create_targetdir
 
   # ----- change owner of directory because of su command
@@ -45,24 +51,44 @@ function pgsql.backup(){
   # ----- GO
 
   # prevent could not change directory to "/root": Permission denied
+  (
   cd /tmp
+
   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)
+  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 ... "
+    SNAPSHOTDB="${snapshotprefix}${DATABASE}"
     OUTFILE="${BACKUP_TARGETDIR}/$(get_outfile ${DATABASE}).sql"
-    if su ${PGUSER} -c "pg_dump ${BACKUP_PARAMS} -Fp ${DATABASE} >$OUTFILE"; then
-      fetchrc >/dev/null
-      db._compressDumpfile "$OUTFILE"
+
+    echo -n " snapshot ... "
+    # drop snapshot db first - just in case
+    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 [ $myrc -eq 0 ]; then
+
+      echo -n "backup ... "
+      if su ${PGUSER} -c "pg_dump ${BACKUP_PARAMS} -Fp ${SNAPSHOTDB} >$OUTFILE"; then
+        fetchrc >/dev/null
+        echo -n "delete snapshot ... "
+        su ${PGUSER} -c "dropdb ${SNAPSHOTDB}"
+
+        db._compressDumpfile "$OUTFILE"
+      else
+        fetchrc
+        su ${PGUSER} -c "dropdb ${SNAPSHOTDB}"
+      fi
     else
-      fetchrc
+      cecho error "ERROR!"
     fi
 
   done
-  cd -
+  )
 }
 
 
+
 # restore database dump file into database
 # param  string  database dump file (gzipped)
 # param  string  optional: database to import; default: database is parsed from file
-- 
GitLab