Rezervne kopije baza podataka
Kako zakazati MySQL i PostgreSQL dumpove, prebaciti ih sa mašine i proveriti da se rezervna kopija zaista vraća.
Ažurirano 23. avgust 2026.
VPS ne dolazi sa automatskim bekapima mašine ili snimcima stanja: sve što sam nisi kopirao postoji u jednoj jedinoj instanci. Damp baze podataka je prva stvar koju treba da podesiš, jer nema odakle da povratiš podatke, dok sajt može da se ponovo postavi od nule.
Ručni damp
PostgreSQL:
pg_dump -Fc -U shop -h 127.0.0.1 shop > /srv/backups/shop-$(date +%F).dump
pg_dumpall -U postgres --roles-only > /srv/backups/roles.sql
MySQL i MariaDB:
mysqldump --single-transaction --quick --routines --events \
-u root shop | gzip > /srv/backups/shop-$(date +%F).sql.gz
--single-transaction pravi konzistentan InnoDB damp bez zaključavanja tabela — bez njega će ti se sajt zaglaviti tokom izvoza. PostgreSQL format -Fc je komprimovan i omogućava ti da povratiš pojedinačne tabele.
Ne stavljaj lozinke u komandnu liniju: napravi ~/.pgpass ili ~/.my.cnf sa dozvolama 600.
Po rasporedu
mkdir -p /srv/backups && chmod 700 /srv/backups
crontab -e
20 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1
Skripta /usr/local/bin/db-backup.sh:
#!/bin/bash
set -euo pipefail
DEST=/srv/backups
STAMP=$(date +%F-%H%M)
pg_dump -Fc -U shop -h 127.0.0.1 shop > "$DEST/shop-$STAMP.dump.tmp"
mv "$DEST/shop-$STAMP.dump.tmp" "$DEST/shop-$STAMP.dump"
find "$DEST" -name '*.dump' -mtime +14 -delete
Upisivanje u privremeni fajl pa preimenovanje je važno: ako se damp prekine, nećeš skraćeni fajl zameniti za kompletan bekap. set -euo pipefail zaustavlja skriptu na prvoj grešci umesto da tiho nastavi dalje.
Prebaci bekape van mašine
Kopija na istom disku neće te spasiti od greške pri migraciji, ransomware-a ili ponovne instalacije OS-a na kartici „Pristup“. Šalji dampove van lokacije:
rsync -az --delete /srv/backups/ backup@other-host:/store/vds/
Ili na bilo koje S3-kompatibilno skladište preko rclone. Imaj u vidu propusni opseg do 500 Mbit/s i ograničenje upisa na disk po tieru: 60 MB/s po jezgru.
Provera povraćaja
Bekap koji nikad nisi povratio nije bekap.
createdb -U postgres shop_check
pg_restore -U postgres -d shop_check /srv/backups/shop-2026-08-23.dump
psql -U postgres -d shop_check -c "SELECT count(*) FROM users;"
dropdb -U postgres shop_check
Za MySQL: gunzip -c dump.sql.gz | mysql -u root shop_check.
Radi ovo jednom mesečno i zabeleži datum provere.
Česte greške
| Simptom | Uzrok |
|---|---|
| Damp ima samo nekoliko kilobajta | Skripta je pala na autentifikaciji, a greška je otišla u /dev/null |
| Ponestalo je prostora na disku | Nema brisanja starih bekapa po mtime |
| Povraćaj pada na dozvolama | Role nisu dampovane — potreban ti je --roles-only |
| Cron ćuti, nema bekapa | Cron nema tvoj PATH — koristi apsolutne putanje |
| Sajt se usporava noću | Damp se bori za disk — pomeri vreme, dodaj --quick |
Drži najmanje dve kopije na različitim lokacijama i prati veličinu dampa: nagli pad veličine znači da nije dampovana cela baza.