Shell Script · Aktiv

db_backup.sh

GFS-rotation MariaDB · mysqldump rclone · Nextcloud backup_stats.sh
Lokalt: /data/db-backup
Remote: nextcloud:Backup
Cron: STATS_TRIGGERED_BY=cron
Stats DB: drift
Mail: kao@purpurdata.dk
01
🗓
GFS Type
daily/weekly/monthly
02
📊
Stats Begin
stats_begin_run
03
🗄
Hent DB'er
SHOW DATABASES
04
💾
Dump + gzip
05
☁️
rclone Upload
rclone copy
06
🧹
Lokal Rydning
find -mtime +7
07
🗑
Cloud GFS Rydning
daily/weekly/monthly
08
Stats End · Exit
Start / Slut
Init / Database
Dump / Upload
Oprydning
Daily · Son
Alle hverdage
7
dage cloud-retention
--include "*_daily_*.gz"
Weekly · Father
Hver lørdag
30
dage cloud-retention
--include "*_weekly_*.gz"
Monthly · Grandfather
Sidste lørdag i måneden
180
dage cloud-retention (~6 mdr)
--include "*_monthly_*.gz"
01
🗓
Bestem GFS backup-type
Tjekker ugedag (date +%u) og antal dage tilbage i måneden. Sætter BACKUP_TYPE til daily, weekly eller monthly. Typen indgår direkte i filnavnet.
GFS-LOGIK
02
📊
Initialiser stats-modul
Sourcer backup_stats.sh og kalder stats_begin_run for at oprette ny kørselspost i drift-databasen.
STATS-MODUL
03
🗄
Hent liste over databaser
Forespørger MariaDB og filtrerer systemdatabaser fra (information_schema, performance_schema, mysql, sys). Fejl her sætter ERROR=1.
MARIADB
04
💾
mysqldump + gzip per database
For hver database: dump til <db>_<type>_<dato>.sql, derefter gzip. Stats registreres med filsti via stats_record_db(). Fejl springer til næste DB.
DUMP + KOMPRIMERING
05
☁️
rclone copy → Nextcloud
Kopierer hele $BACKUP_DIR til nextcloud:Backup. Aktivitet logges i rclone.log på INFO-niveau.
RCLONE UPLOAD
06
🧹
Lokal oprydning — alle typer >7 dage
find … -mtime +7 -delete sletter alle .gz-filer lokalt ældre end 7 dage, uanset type. Logfiler berøres ikke.
LOKAL RYDNING
07
🗑
Cloud-oprydning — GFS per type
Tre separate rclone delete-kald med type-specifikke --include-mønstre. Daily slettes efter 7d, weekly efter 30d, monthly efter 180d. Typerne kan aldrig slette hinandens filer.
GFS CLOUD-RYDNING
08
Afslut og stats
stats_end_run afslutter kørslen og printer opsummering. Exit-kode 0 ved succes, 1 ved fejl — synligt for cron og systemd.
STATS · EXIT
VariabelStandardværdiBeskrivelse
BACKUP_DIR/data/db-backupLokal mappe til backup-filer og logfiler
REMOTEnextcloud:Backuprclone-destination — remote-navn og sti
LOGFILE$BACKUP_DIR/backup.logAppended log for alle script-hændelser
SLACK_WEBHOOKhttps://hooks.slack.com/…Webhook til Slack-notifikationer ved fejl (kommenteret ud)
MAIL_TOkao@purpurdata.dkModtager af fejl-e-mails (kommenteret ud)
STATS_DB_USERxxxxxxMariaDB-bruger til stats-databasen
STATS_DB_NAMEdriftDatabase hvor backup-statistik gemmes
STATS_TRIGGERED_BYcronSæt til manual ved manuel kørsel
STATS_GROWTH_THRESHOLD20Procentvis vækst der trigger advarsel i stats-modulet
STATS_SLACK_WEBHOOKhttps://hooks.slack.com/…Slack-webhook specifikt til stats-notifikationer
⚠ fail() — non-fatal fejlhåndtering
⚠️
fail() kaldes
log "ERROR: …"
ERROR=1
🔄
Script fortsætter
øvrige DB'er
dumpes videre
🚩
Exit 1 til sidst
cron / systemd
ser fejlen