Zálohy databáz
Ako naplánovať dumps MySQL a PostgreSQL, presunúť ich mimo stroja a overiť, že záloha sa naozaj obnoví.
Aktualizované 23. augusta 2026
VPS neprichádza s automatickými zálohami stroja ani snímkami stavu: čokoľvek, čo si sám nekopíroval, existuje len v jednej inštancii. Výpis databázy je prvá vec, ktorú by si mal nastaviť, pretože nie je odkiaľ obnoviť dáta, zatiaľ čo stránku môžeš nasadiť odznova.
Manuálny výpis
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 a MariaDB:
mysqldump --single-transaction --quick --routines --events \
-u root shop | gzip > /srv/backups/shop-$(date +%F).sql.gz
--single-transaction vytvorí konzistentný výpis InnoDB bez zamknutia tabuliek — bez neho sa tvoja stránka počas exportu zasekne. Formát -Fc v PostgreSQL je komprimovaný a umožňuje obnoviť jednotlivé tabuľky.
Nedávaj heslá na príkazový riadok: vytvor ~/.pgpass alebo ~/.my.cnf s právami 600.
Naplánovaný výpis
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
Skript /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
Zápis do dočasného súboru a následné premenovanie má zmysel: ak sa výpis preruší, nepomýliš si skrátený súbor s kompletnou zálohou. set -euo pipefail zastaví skript pri prvej chybe namiesto tichého pokračovania.
Presuň zálohy mimo stroja
Kópia na tom istom disku ťa nezachráni pred chybou pri migrácii, ransomvérom ani preinštalovaním OS na karte „Prístup“. Posielaj výpisy mimo lokality:
rsync -az --delete /srv/backups/ backup@other-host:/store/vds/
Alebo do akéhokoľvek S3-kompatibilného úložiska cez rclone. Maj na pamäti šírku pásma až do 500 Mbit/s a limit zápisu na disk podľa tarifu: 60 MB/s na jadro.
Kontrola obnovy
Záloha, ktorú si nikdy neobnovil, nie je záloha.
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
Pre MySQL: gunzip -c dump.sql.gz | mysql -u root shop_check.
Rob to raz za mesiac a zaznamenaj dátum kontroly.
Časté chyby
| Príznak | Príčina |
|---|---|
| Výpis má len pár kilobajtov | Skript zlyhal pri autentifikácii a chyba išla do /dev/null |
| Miesto na disku sa minulo | Žiadne mazanie starých záloh podľa mtime |
| Obnova zlyhá na právach | Roly neboli vyexportované — potrebuješ --roles-only |
| Cron mlčí, žiadne zálohy | Cron nemá tvoju PATH — používaj absolútne cesty |
| Stránka v noci spomalí | Výpis súťaží o disk — posuň čas, pridaj --quick |
Uchovávaj aspoň dve kópie na rôznych miestach a sleduj veľkosť výpisu: prudký pokles veľkosti znamená, že nebola vyexportovaná celá databáza.