Backup koji se ne testira nije backup. Ova uputa pokriva praktičnu automatizaciju MySQL / MariaDB backupa na Linux serveru — dnevni dump, rotacija, offsite kopija i verifikacija restorea.
1. Osnovni scenarij — mysqldump + cron
Za baze do par desetaka GB, mysqldump je dovoljan. Skripta /usr/local/sbin/db-backup.sh:
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/var/backups/mysql"
RETENTION_DAYS=14
DATE=$(date +%Y%m%d-%H%M)
LOG="/var/log/db-backup.log"
mkdir -p "$BACKUP_DIR"
# dump svih baza, zajedno s GTID i trigerima
mysqldump \
--defaults-file=/root/.my.cnf \
--all-databases \
--single-transaction \
--quick \
--routines --triggers --events \
--hex-blob \
--default-character-set=utf8mb4 \
| gzip -9 > "$BACKUP_DIR/all-$DATE.sql.gz"
# rotacija
find "$BACKUP_DIR" -name 'all-*.sql.gz' -mtime +$RETENTION_DAYS -delete
echo "$(date -Iseconds) backup OK ($(du -h $BACKUP_DIR/all-$DATE.sql.gz | cut -f1))" >> "$LOG"
Credencijali idu u /root/.my.cnf (chmod 600):
[client]
user=backup
password=strong-password-here
Korisnik backup treba privilegije SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, PROCESS, REPLICATION CLIENT.
2. Cron unos
# /etc/cron.d/db-backup
0 2 * * * root /usr/local/sbin/db-backup.sh
Vrijeme 02:00 je kompromis — nakon što padne dnevni promet, prije jutarnjih batch jobova.
3. Offsite kopija (obavezno!)
Backup na istom serveru štiti samo od aplikacijske greške. Za zaštitu od fizičkog gubitka servera potreban je offsite transfer. Preporučeno: rclone na S3-kompatibilni bucket ili rsync na drugi server.
# rclone primjer, dodaj u istu skriptu nakon dumpa
rclone copy "$BACKUP_DIR/all-$DATE.sql.gz" remote:wmd-backups/$(hostname)/mysql/ \
--log-level INFO --log-file /var/log/rclone-backup.log
Za rsync varijantu s retention na drugom serveru, koristite rsnapshot ili borg.
4. Za velike baze — point-in-time recovery
Baza iznad ~50GB ili aplikacija koja piše često: sam mysqldump nije dovoljan jer radi samo dnevni snapshot. Dodajte binary log za point-in-time recovery.
# u my.cnf
[mysqld]
log_bin = /var/lib/mysql/binlog
binlog_format = ROW
expire_logs_days = 7
sync_binlog = 1
Pri restoreu: vrati zadnji dump pa replayaj binlog do željenog trenutka preko mysqlbinlog.
5. Alternativa — Percona XtraBackup
Za baze u stotinama GB, XtraBackup radi hot backup InnoDB tablica bez LOCK-a, s inkrementalnim opcijama. Redoslijed:
# full backup
xtrabackup --backup --target-dir=/var/backups/xtra/full-$(date +%F)
# incremental (svaki dan, osim nedjelje)
xtrabackup --backup \
--target-dir=/var/backups/xtra/inc-$(date +%F) \
--incremental-basedir=/var/backups/xtra/full-2026-04-01
6. Verifikacija — backup bez testa ne vrijedi
Minimum jednom mjesečno automatski test restorea u staging okruženje:
#!/bin/bash
# test-restore.sh — vraća zadnji dump u test bazu i provjerava integritet
LATEST=$(ls -1t /var/backups/mysql/all-*.sql.gz | head -1)
TEST_DB="restore_test_$(date +%s)"
mysql -e "CREATE DATABASE $TEST_DB;"
zcat "$LATEST" | mysql "$TEST_DB"
# provjeri da barem postoji očekivana tablica
ROWS=$(mysql -sN -e "SELECT COUNT(*) FROM $TEST_DB.users;")
if [ "$ROWS" -lt 1 ]; then
echo "RESTORE TEST FAILED — nema redaka u users" | mail -s "DB backup alarm" admin@example.com
fi
mysql -e "DROP DATABASE $TEST_DB;"
7. Što monitorirati
- Veličinu zadnjeg dumpa — naglo smanjenje ukazuje na problem (dump failed na pola).
- Vrijeme izvršavanja — rast od 2× između noći ukazuje na povećan lock/IO.
- Prisutnost svih očekivanih dumpova (dnevni cron može tiho fail-ati).
- Offsite upload success — alarm ako nije bilo uspješnog uploada u zadnjih 26 sati.
8. Enkripcija backupa
Ako backup putuje preko interneta ili stoji u trećoj strani, enkriptirajte ga. Najjednostavnije: openssl ili age.
mysqldump ... | gzip -9 | openssl enc -aes-256-cbc -pbkdf2 -pass file:/root/backup.key \
> /var/backups/mysql/all-$DATE.sql.gz.enc
Ključ (/root/backup.key) držite na zasebnom mjestu — ne u istom backupu koji enkriptirate.
9. Retention — koliko dugo čuvati
- Lokalni (brzi) backup: 7-14 dana.
- Offsite: 30 dana dnevnih + 12 mjesečnih snapshota.
- Legal / compliance: ovisno o djelatnosti (7 godina za financije, 10 za neke HR dokumente).
10. Česte greške
- Backup u isti storage gdje je i baza — beskorisno pri gubitku diska.
- Bez kompresije — 10× veći disk i mrežni promet.
- Backup root user-om s punim pristupom — koristite namjenskog korisnika s minimalnim privilegijama.
- Ne testirate restore. Restore na staging jednom mjesečno, ručno ili skriptom.
- Offsite zaboravljen kad se mijenja infrastruktura — provjerite da nakon migracije server i dalje šalje na S3 / drugi server.
Na WMD hosting paketima backup se radi automatski prema zadanoj politici, s offsite rotacijom i testom restorea. Ako vas zanima kako je konfigurirano za vaš server ili trebate prilagoditi retention — javite se.