Varnostna kopija, ki ni preizkušena, ni varnostna kopija. Ta priročnik zajema praktično avtomatizacijo varnostnih kopij MySQL / MariaDB na strežniku Linux – dnevno preverjanje izpisa podatkov, rotacijo, kopiranje zunaj lokacije in obnovitev.
1. Osnovni scenarij — mysqldump + cron
Za baze podatkov do nekaj deset GB zadostuje mysqldump . Skript /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"Poverilnice gredo na#!/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"
/root/.my.cnf (chmod 600):
[client] user=backup password=strong-password-hereUporabnik[client] user=backup password=strong-password-here
backup potrebuje privilegije SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER, PROCESS, REPLICATION CLIENT .
2. Vnos v cron
# /etc/cron.d/db-backup 0 2 * * * root /usr/local/sbin/db-backup.shČas 02:00 je kompromis – po padcu dnevnega prometa, pred jutranjimi paketnimi opravili.# /etc/cron.d/db-backup 0 2 * * * root /usr/local/sbin/db-backup.sh
3. Izvod za zunanjo uporabo (obvezno!)
Varnostno kopiranje na istem strežniku ščiti le pred napakami aplikacij. Za zaščito pred fizično izgubo strežnika je potreben prenos na drugo lokacijo. Priporočeno: rclone v vedro, združljivo s S3, ali rsync na drug strežnik.
# 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.logZa različico rsync z zadrževanjem na drugem strežniku uporabite# 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
rsnapshot ali borg .
4. Za velike baze podatkov – obnovitev v trenutku
Baza podatkov, večja od ~50 GB, ali aplikacija, ki pogosto piše: mysqldump sam po sebi ni dovolj, saj naredi le dnevni posnetek. Dodajte binarni dnevnik za obnovitev v trenutku.
# u my.cnf [mysqld] log_bin = /var/lib/mysql/binlog binlog_format = ROW expire_logs_days = 7 sync_binlog = 1Pri obnavljanju: obnovite zadnji izpis in ponovno predvajajte binlog do želenega trenutka prek# u my.cnf [mysqld] log_bin = /var/lib/mysql/binlog binlog_format = ROW expire_logs_days = 7 sync_binlog = 1
mysqlbinlog .
5. Alternativa – Percona XtraBackup
Za baze podatkov v stotinah GB XtraBackup izvaja vroče varnostno kopiranje tabel InnoDB brez LOCK-a, z možnostmi inkrementalnega varnostnega kopiranja. Vrstni red:
# 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-016. Preverjanje – varnostna kopija brez preizkusa ni veljavna# 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
Vsaj enkrat mesečno samodejno preizkusi obnovitev v preizkusno okolje:
#!/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. Kaj je treba spremljati#!/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;"
- Velikost zadnjega izpisa podatkov – nenadno zmanjšanje kaže na težavo (izpis podatkov ni uspel na polovici).
- Čas izvajanja – 2× povečanje med nočmi kaže na povečano zaklepanje/IO.
- Prisotnost vseh pričakovanih izpisov (dnevni cron lahko tiho odpove).
- Uspešno nalaganje zunaj spletnega mesta – alarm, če v zadnjih 26 urah ni bilo uspešnega nalaganja.
8. Šifriranje varnostnih kopij
Če varnostna kopija potuje po internetu ali je shranjena pri tretji osebi, jo šifrirajte. Najenostavneje: openssl ali age .
mysqldump ... || gzip -9 || openssl enc -aes-256-cbc -pbkdf2 -pass file:/root/backup.key \ > /var/backups/mysql/all-$DATE.sql.gz.encKljuč (mysqldump ... || gzip -9 || openssl enc -aes-256-cbc -pbkdf2 -pass file:/root/backup.key \ > /var/backups/mysql/all-$DATE.sql.gz.enc
/root/backup.key ) na ločeni lokaciji – ne v isti varnostni kopiji, ki jo šifrirate.
9. Hramba – kako dolgo hraniti
- Lokalno (hitro) varnostno kopiranje: 7–14 dni.
- Zunaj lokacije: 30 dni dnevnih + 12 mesečnih posnetkov.
- Pravno/skladnost: odvisno od dejavnosti (7 let za finance, 10 let za nekatere kadrovske dokumente).
10. Pogoste napake
- Varnostno kopiranje na isto mesto kot baza podatkov – neuporabno, če izgubite disk.
- Brez stiskanja – 10-krat več diskovnega in omrežnega prometa.
- Varnostno kopiranje z uporabnikom root s polnim dostopom – uporabite namenskega uporabnika z minimalnimi privilegiji.
- Ne preizkušate obnovitve. Obnovite v stanje pripravljenosti enkrat mesečno, ročno ali s skriptom.
- Pozabljeno na zunanje mesto, ko se infrastruktura spremeni – preverite, ali strežnik po migraciji še vedno pošilja podatke na S3 / drug strežnik.
Pri paketih gostovanja WMD se varnostne kopije izvajajo samodejno v skladu s privzetim pravilnikom, z rotacijo zunaj lokacije in testnimi obnovitvami. Če vas zanima, kako je to konfigurirano za vaš strežnik, ali če morate prilagoditi hrambo, se obrnite na nas.