Files
bash-scripts/mariadb-backup/mariadb-backup-logic-old.sh
marco.locatelli@steamware.net 0e7c5139ff Gestione backup falliti e cleanup
2026-03-30 10:21:06 +02:00

80 lines
2.8 KiB
Bash

#!/bin/bash
set -euo pipefail
ulimit -n 65536
BACKUP_BASE=/var/backups/tscale01
PREFIX=backup-logic-
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
TARGET="$BACKUP_BASE/${PREFIX}${TIMESTAMP}"
DUMPFILE="$TARGET/all-dbs.sql"
LOGFILE=/var/log/mariadb-backup.log
LOCKFILE=/var/lock/mariadb-backup.lock
# mysqldump bin e opzioni (root senza password: non passiamo --defaults-file)
MYSQLDUMP_BIN=$(command -v mysqldump || true)
MYSQLDUMP_OPTS="--user=root --all-databases --single-transaction --quick --lock-tables=FALSE"
# assicurati che il logfile esista e abbia permessi restrittivi
touch "$LOGFILE"
chown root:root "$LOGFILE"
chmod 600 "$LOGFILE"
#verifico file lock per non sovrapporre backup
(
flock -n 9 || { echo "[$(date '+%F %T')] SKIP: another backup is running" >> "$LOGFILE"; exit 0; }
if [ -z "$MYSQLDUMP_BIN" ]; then
echo "[$(date '+%F %T')] ERROR: mysqldump not found in PATH" >> "$LOGFILE"
exit 1
fi
mkdir -p "$TARGET"
chown mysql:mysql "$TARGET"
chmod 750 "$TARGET"
TMPLOG=$(mktemp /tmp/mariadb-backup-logic.XXXXXX)
echo "---------------------" >> "$LOGFILE"
echo "[$(date '+%F %T')] START logic backup $TARGET" >> "$LOGFILE"
# esegui il dump: stdout -> file, stderr -> TMPLOG
if $MYSQLDUMP_BIN $MYSQLDUMP_OPTS >"$DUMPFILE" 2>"$TMPLOG"; then
echo "[$(date '+%F %T')] END logic backup $TARGET" >> "$LOGFILE"
# misura dimensione apparente (byte logici)
size_apparent_bytes=$(find "$TARGET" -type f -printf '%s\n' 2>/dev/null | awk '{s+=$1} END{print s+0}')
size_apparent_human=$(numfmt --to=iec --suffix=B "$size_apparent_bytes" 2>/dev/null || echo "${size_apparent_bytes}B")
# misura spazio su disco effettivo (byte allocati)
size_disk_bytes=$(du -s --block-size=1 "$TARGET" 2>/dev/null | cut -f1 || echo 0)
size_disk_human=$(numfmt --to=iec --suffix=B "$size_disk_bytes" 2>/dev/null || echo "${size_disk_bytes}B")
echo "[$(date '+%F %T')] SIZE apparent: $size_apparent_human ($size_apparent_bytes bytes) for $TARGET" >> "$LOGFILE"
echo "[$(date '+%F %T')] SIZE on-disk: $size_disk_human ($size_disk_bytes bytes) for $TARGET" >> "$LOGFILE"
echo "[$(date '+%F %T')] RESULT: OK, no errors" >> "$LOGFILE"
rm -f "$TMPLOG"
else
echo "[$(date '+%F %T')] ERROR during logic backup for $TARGET. See $TMPLOG" >> "$LOGFILE"
tail -n 200 "$TMPLOG" >> "$LOGFILE"
rm -f "$TMPLOG"
exit 1
fi
# rotazione: mantieni 7 giorni per i logic (log dettagliato)
TO_DELETE=$(find "$BACKUP_BASE" -maxdepth 1 -type d -name "${PREFIX}*" -mtime +7 -print 2>/dev/null || true)
if [ -n "$TO_DELETE" ]; then
echo "[$(date '+%F %T')] ROTATE: removing old logic backups:" >> "$LOGFILE"
echo "$TO_DELETE" >> "$LOGFILE"
echo "$TO_DELETE" | tr '\n' '\0' | xargs -0 -r rm -rf --
else
echo "[$(date '+%F %T')] ROTATE: no logic backups to remove (<=7 days)" >> "$LOGFILE"
fi
echo " " >> "$LOGFILE"
) 9>"$LOCKFILE"