Skip to content
VDS · Databázy

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íznakPríčina
Výpis má len pár kilobajtovSkript 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ávachRoly neboli vyexportované — potrebuješ --roles-only
Cron mlčí, žiadne zálohyCron 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.